Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
Witam.
Jestem na tym forum nowa i przejdę do sedna sprawy... Otóż jest Mi potrzebne funkcja która Mi pobierze pierwszy WOLNY numer rekordu z pola typu auto_increment. I w zasadzie to chyba znalazłam co Mnie potrzeba -> http://algorytmy.pl/?id=1064&pp=503 Ale jest małe ale: UWAGA! To tylko fragment strony! Całą zobaczysz po opłaceniu abonamentu! (IMG:http://forum.php.pl/style_emoticons/default/ohmy.gif) A trochę dużo tam wołają za SMS'a zaś karty nie posiadam... Może ktoś zna inne miejsce gdzie to znajdę albo Sam też wie jak takie coś napisać bo jest Mi bardzo potrzebne. EDIT: Pracuję na php 4/5 oraz mysql 4.1.21-standard Pozdrawiam i czekam na pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował Ania-678 15.06.2007, 10:31:00 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Przyjaciele php.pl Postów: 1 590 Pomógł: 40 Dołączył: 11.01.2007 Skąd: Centrum Ostrzeżenie: (0%)
|
Jeżeli potrzebujesz następnego id z pola auto_increment wystarczy jak zapytasz bazę o maksymalną wartość tego pola MAX(id) i w php dodasz +1 ... otrzymasz wartość najbliższego wpisu w tą kolumnę.
Nie wiem do czego jest Ci to potrzebne ale zakładam, że chcesz to nowe ID wpisać gdzieś do innej tabeli tak, żeby mieć połączenie między tabelami. Jeżeli takie coś chcesz wykonać, możesz odwrócić sytuację i dodać wiersz do tabeli pierwszej po czym za pomocą mysql_insert_id" title="Zobacz w manualu PHP" target="_manual pobrać wygenerowaną wartość pola ID. |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%)
|
|
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%)
|
chyba że chodzi Ci o pierwszy biorąc pod uwage też usunięte rekordy, ale to rozwiązanie ma zbyt wiele wad zeby je wykorzystywac dokladnie o to jej chodzi moze ktorys z was by zajrzal w lik ktory dala jest cos takiego Kod +----+--------+----------+ i jak widac brakuje nr 3| id | imie | nazwisko | +----+--------+----------+ | 1 | Julia | Murek | | 2 | Robert | Kwak | | 5 | Jan | Nowak | | 6 | Jan | Kowal | | 7 | Anna | Maliniak | +----+--------+----------+ mozesz np pobrac max(id) a potem w petli sprawdzac czy takie id istnieje i jak nie to masz odpowiedz Ten post edytował skowron-line 15.06.2007, 12:01:12 |
|
|
|
Post
#5
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%)
|
Cytat mozesz np pobrac max(id) a potem w petli sprawdzac czy takie id istnieje i jak nie to masz odpowiedz Po co? Przeciez mozna max(id) + 1 |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%)
|
|
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
Więc tak...
Nie chodzi Mnie o zmianę auto_increment tylko o wyszukanie tabelki pustych rekordów. Mam na przykład taką tabelkę: ID | user ---------- 1 | fsdf 2 | bgfgt 3 | bvcfsd 5 | sdfss 6 | teregf i chcę "wyciągnąć" najniższy puste miejsce z niej czyli w tym przypadku id 4. Bo to Mnie potrzebne do skryptu rejestracji przez aktywację via mail i przy jego potwierdzeniu następuje taka akcja:
Oczywiście w tabeka2 jest pierwsze pole ID z auto_increment i zawsze id przy tym INSERTcie jest najwyższe id jakie już w niej jest + 1 Zaś Ja potrzebuję by INSERT "pakował" się do najniższego wolnego id w tabeka2 (IMG:http://forum.php.pl/style_emoticons/default/rolleyes.gif) Ten post edytował Ania-678 15.06.2007, 13:41:24 |
|
|
|
Post
#8
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%)
|
|
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
aaaaa @skowron-line Zle sobie odczytalem chodzilo mi o max Rozwiazaniem jest proste. Chyba sie nie pomylilem bo z palca
Operuję na jednej tabeli, a jak dobrze rozumiem to powyżej jest na dwie... |
|
|
|
Post
#10
|
|
|
Admin Techniczny Grupa: Administratorzy Postów: 2 072 Pomógł: 93 Dołączył: 5.07.2005 |
źle rozumiesz to jest jedna tabela łączona z sama sobą t1 to "tabela" i tak samo t2 to "tabela" (jedna i ta sama)
|
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
To nie wiem czy dobrze podstawiam Swą nazwę tabelki:
bo pokazuje Mi ciągle rekord o id 1 który JEST a najwyższy to mam ponad 14XX... (IMG:http://forum.php.pl/style_emoticons/default/dry.gif) EDIT: po zwiększeniu LIMITu do 10
otrzymałam rekordy o id 1, 5, 9, 12, 15, 22, 25, 31, 34, 36 zaś w bazie pierwsze 10 rekordów to: 1, 2, 3, 5, 9, 10, 12, 15, 16, 17 Więc yyy... coś mnie tu nie pasuje... Ten post edytował Ania-678 15.06.2007, 16:33:44 |
|
|
|
Post
#12
|
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.05.2007 Ostrzeżenie: (0%)
|
Niezbyt dobrze kombinujesz
Dodaj do tabeli userow pole IsConfirmed Przy rejestracji normalnie dodaj usera z polem IsConfirmed ustawionym na false Zrob tabele ConfirmationCodes z IdUser ConfirmationCode Po dodaniu uzytkownika dodaj nowy rekord do tej tabeli z IdUser wzietym z mysql_insert_id() wygenerowanym kodem np. md5(time() + IdUser) Wyslij mu ten kod mailem. Jak user kliknie na linka aktywacyjnego wybierz z tabeli rekord ktory ma taki sam ConfirmationCode masz wtedy IdUser Uaktualniasz rekord w tabeli usera zmieniajac IsConfirmed na true A nastepnie usuwasz rekord z tabeli ConfirmationCodes gdzie IdUser jest rowne temu ktorego wybrales. Tyle. Pozdrawiam |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 1 Dołączył: 6.02.2006 Ostrzeżenie: (0%)
|
@superfrajer Jaki jest związek tego co napisałeś z tematem wątku, gdyż nie zrozumiałem
Odnośnie tematu wątku, to proponuję następujące zapytanie:
Jeżeli otrzymasz w wyniku zero rekordów, to oznacza, że rekordy są po kolei lub tabela jest pusta Ten post edytował Norbas 15.06.2007, 22:54:47 |
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
No wynik jest pusty...
Ale... ja to potrzebuję do INSERTa, bo Ja nie wiem jak do Niego określić tym powyżej czy dane pole id jest puste czy też nie (IMG:http://forum.php.pl/style_emoticons/default/dry.gif) |
|
|
|
Post
#15
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%)
|
|
|
|
|
Post
#16
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
Ten dziad:
ma Mnie gdzieś i ciągle id = auto_increment z db... (IMG:http://forum.php.pl/style_emoticons/default/dry.gif) Ten post edytował Ania-678 16.06.2007, 09:22:04 |
|
|
|
Post
#17
|
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%)
|
|
|
|
|
Post
#18
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
Ni jedno, ni drugie egzaminu nie zdaje...
|
|
|
|
Post
#19
|
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.05.2007 Ostrzeżenie: (0%)
|
Norbas: taki jest zwiazek, ze dziewczyna troche bez sensu kombinuje, przeczytaj caly temat dokladnie to zobaczysz.
Ania-678: jeszcze prostszym sposobem na aktywacje jest po prostu z rejestracji wywalic pole podawania hasla, i wygenerowac samemu haslo userowi i wyslac mu na maila. Odpada wtedy sprawdzanie kodow itd... Pozdrawiam |
|
|
|
Post
#20
|
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%)
|
A to:
Jeśli nie zadziała to powiedz co zwraca, bo mam zainstalowane MySQL 5.0.40 Ten post edytował UDAT 16.06.2007, 12:50:59 |
|
|
|
Post
#21
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
Po wywołaniu zapytania w PMA "sprzedał" Mi coś takiego:
Zaś w skrypcie nie działa wciąż... @superfrajer nie chodzi Mnie o zadne kody aktywacji czy coś w tym kierunku tylko o INSERTowanie wartości do tabeli akt w PIERWSZE wolne id (auto_increment)... Ten post edytował Ania-678 16.06.2007, 13:59:18 |
|
|
|
Post
#22
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%)
|
2 razy odpowiedzialem na to pytanie. Problem jest w wyciagnieciu tej wartosci i wstawieniu do zapytania. Kazdy podaje swoja wersje po co? Tu nie chodzi teraz o zapytanie tylko przekazanie wartosci do zapytania.
Czytajcie posty od poczatku do konca. Kolejne takie wtracenia beda nagradzane banem.
co zwraca $fid?? zrob print_r($fid)
Czy tak trudno jest pokombinowac i zobaczyc co zwraca. |
|
|
|
Post
#23
|
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%)
|
2 razy odpowiedzialem na to pytanie. ... Czytajcie posty od poczatku do konca. Kolejne takie wtracenia beda nagradzane banem. Tylko że twoje zapytanie jest błędne. Dla danych, gdzie ID są w kolejności: Kod 4 5 6 7 Powinien zwrócić 0, zwraca: Kod +------------+
| kolejne_id | +------------+ | 5 | +------------+ 1 row in set (0.01 sec) |
|
|
|
Post
#24
|
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%)
|
To zadanie nie jest takie proste, jakie się wydaje na pierwszy rzut oka.
Ania-678: Przetestuj to zapytanie: Kod (
SELECT t1.id + 1 AS pusty_id FROM tabela t1 WHERE (SELECT t2.id FROM tabela t2 WHERE t1.id = t2.id-1) IS NULL ) UNION ( SELECT MIN(id)-1 AS pusty_id FROM tabela HAVING pusty_id > 0 ) ORDER BY pusty_id ASC LIMIT 1 |
|
|
|
Post
#25
|
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%)
|
Kod SELECT MIN(id)-1 AS pusty_id FROM tabela HAVING pusty_id > 0 Ta część zapytania pobierze jeden z niższych wyników, ale nie najniższy. Dla danych: Kod 4 5 6 7 zwróci 3, druga część zwróci 8, a powinno zwrócić 0. Tak więc nie podałeś rozwiązania. Jedyne rozwiązanie, które działa jest przedstawione w moim poście, gdyż jeśli nie ma najmniejszej wartości to ją zwraca, jeśli nie to zwraca ID+1, którego nie ma w tabeli, sprawdzane dla każdego ID już istniejącego. Ten post edytował UDAT 16.06.2007, 19:02:22 |
|
|
|
Post
#26
|
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%)
|
Cytat("UDAT") Jedyne rozwiązanie, które działa jest przedstawione w moim poście, gdyż jeśli nie ma najmniejszej wartości to ją zwraca, jeśli nie to zwraca ID+1, którego nie ma w tabeli, sprawdzane dla każdego ID już istniejącego. A mógłbyś podać przykładowe wartości, dla których twoje zapytanie działa? Bo jak bym tego nie testował, to zawsze zwraca mi: 0. Nawet dla danych: Kod 0 1 2 3 5 6 Jeśli używa się MySQL5 to najprostszym wyjściem będzie napisanie prostej funkcji: Kod DROP FUNCTION IF EXISTS pierwsze_puste_id; (zakładamy że id ma być dodatnie)DELIMITER $ CREATE FUNCTION pierwsze_puste_id() RETURNS INT BEGIN SET @ID = 1; SET @MAX_ID = ( SELECT MAX(id) FROM tabela ); WHILE( @ID <= @MAX_ID ) DO IF NOT EXISTS ( SELECT id FROM tabela WHERE ( id = @ID ) ) THEN RETURN( @ID ); END IF; SET @ID = @ID + 1; END WHILE; RETURN( @ID ); END$ DELIMITER; No chyba, że jest w MySQL'u odpowiednik: range" title="Zobacz w manualu PHP" target="_manual - to wtedy wystarczyłoby zwykłe podzapytanie. |
|
|
|
Post
#27
|
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 15.06.2007 Ostrzeżenie: (0%)
|
Już mam, znalazłam człowieka który miał konto na tamtej stronie i działa (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
|
|
|
|
Post
#28
|
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%)
|
A mógłbyś podać przykładowe wartości, dla których twoje zapytanie działa? Bo jak bym tego nie testował, to zawsze zwraca mi: 0. Nawet dla danych: Kod 0 1 2 3 5 6 Zero zwraca tylko gdy nie ma pola o ID = 0, inaczej zwraca pierwsze nie istniejące, o jeden większe od już wpisanego. A co do twojego przykładu, to zobacz co mi MySQL zwrócił: Kod mysql> SELECT * FROM tabela; +----+ | ID | +----+ | 0 | | 1 | | 2 | | 3 | | 5 | | 6 | +----+ 6 rows in set (0.00 sec) mysql> SELECT IF( -> NOT EXISTS ( -> SELECT id FROM tabela WHERE id=0 -> ), -> 0, -> ( SELECT t1.id+1 FROM tabela t1 -> WHERE NOT EXISTS ( -> SELECT id FROM tabela WHERE id=t1.id+1 -> ) ORDER BY t1.id LIMIT 1 -> ) -> ) as empty; +-------+ | empty | +-------+ | 4 | +-------+ 1 row in set (0.00 sec) Masz pomysł dlaczego u mnie działa, a u Ciebie nie? Jeśli chcesz numerację od 1 to zmień w 3. i 5. linii 0 na 1 Ten post edytował UDAT 17.06.2007, 09:49:59 |
|
|
|
Post
#29
|
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%)
|
Cytat Masz pomysł dlaczego u mnie działa, a u Ciebie nie? OK, już wiem o co chodziło. Kolumna z primary key nie przyjmuje zera - zamienia je od razu na kolejną liczbę (auto_increment), tak jakby się w ogóle tej wartości nie podawało. Dlatego zapytanie zawsze zwracało 0. Dla kolumny bez primary key wszystko działa w porządku. Zgubił mnie MySQL Query Browser. Dodawałem rekordy metodą Access'ową (Edycja -> dopisywanie liczb -> Zastosuj zmiany). Wtedy 0 było normalnie wyświetlane. Dopiero po ponownym wykonaniu zaputania SELECT * FROM tabela zamieniało się na auto_incrementa |
|
|
|
Post
#30
|
|
|
Grupa: Zarejestrowani Postów: 367 Pomógł: 10 Dołączył: 20.05.2005 Ostrzeżenie: (0%)
|
Cytat Już mam, znalazłam człowieka który miał konto na tamtej stronie i działa Może się z nami podzielisz rozwiązaniem? |
|
|
|
Post
#31
|
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%)
|
Poprawiona wersja:
Kod mysql> SELECT IF(
-> NOT EXISTS ( -> SELECT id FROM tabela WHERE id=1 -> ), -> 1, -> ( SELECT t1.id+1 FROM tabela t1 -> WHERE NOT EXISTS ( -> SELECT id FROM tabela WHERE id=t1.id+1 -> ) ORDER BY t1.id LIMIT 1 -> ) -> ) as empty; |
|
|
|
Post
#32
|
|
|
Grupa: Zarejestrowani Postów: 367 Pomógł: 10 Dołączył: 20.05.2005 Ostrzeżenie: (0%)
|
mysql> SELECT IF(min(id)<1,
-> 1, -> ( SELECT t1.id+1 FROM tabela t1 -> WHERE NOT EXISTS ( -> SELECT id FROM tabela WHERE id=t1.id+1 -> ) ORDER BY t1.id LIMIT 1 -> ) -> ) as empty -> FROM tabela; mozna tez tak (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
|
![]() ![]() |
|
Aktualny czas: 24.12.2025 - 08:13 |