Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Pobranie 1 wolnego id z pola typu auto_increment
Ania-678
post
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! 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 smile.gif

Ten post edytował Ania-678 15.06.2007, 10:31:00
Go to the top of the page
+Quote Post
Cienki1980
post
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.


--------------------
404
Go to the top of the page
+Quote Post
sticker
post
Post #3





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


pierwszy wolny to znaczy ten który bedzie wstawiony nastepnym razem dobrze rozumiem ?

  1. SELECT max(id) FROM TABLE


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


--------------------
Go to the top of the page
+Quote Post
skowron-line
post
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


Cytat(sticker @ 15.06.2007, 10:20:47 ) *
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
+----+--------+----------+
| id | imie   | nazwisko |
+----+--------+----------+
|  1 | Julia  | Murek    |
|  2 | Robert | Kwak     |
|  5 | Jan    | Nowak    |
|  6 | Jan    | Kowal    |
|  7 | Anna   | Maliniak |
+----+--------+----------+
i jak widac brakuje nr 3

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


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
SongoQ
post
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


--------------------
Go to the top of the page
+Quote Post
skowron-line
post
Post #6





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


Cytat(SongoQ @ 15.06.2007, 12:08:53 ) *
Po co? Przeciez mozna max(id) + 1


ale max(id) zwroci 7 a nie 2


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
Ania-678
post
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:

  1. <?php
  2. $aktiv = $db -> Execute("SELECT * FROM tabelka1 WHERE aktyw=".$_GET['kod']);
  3. $db -> Execute("INSERT INTO tabelka2 (user, email, pass) VALUES('".$aktiv -> fields['user']."','".$aktiv -> fields['email']."','".$aktiv -> fields['pass']."')");
  4. $db -> Execute("DELETE FROM tabelka1 WHERE aktyw=".$_GET['kod']);
  5. ?>


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

rolleyes.gif

Ten post edytował Ania-678 15.06.2007, 13:41:24
Go to the top of the page
+Quote Post
SongoQ
post
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%)
-----


aaaaa
@skowron-line Zle sobie odczytalem chodzilo mi o max

Rozwiazaniem jest proste. Chyba sie nie pomylilem bo z palca

  1. SELECT * FROM tabela t1 LEFT JOIN tabela t2 ON t1.id = t2.id + 1 WHERE t2.id IS NULL LIMIT 1


--------------------
Go to the top of the page
+Quote Post
Ania-678
post
Post #9





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

Ostrzeżenie: (0%)
-----


Cytat(SongoQ @ 15.06.2007, 14:37:15 ) *
aaaaa
@skowron-line Zle sobie odczytalem chodzilo mi o max

Rozwiazaniem jest proste. Chyba sie nie pomylilem bo z palca

  1. SELECT * FROM tabela t1 LEFT JOIN tabela t2 ON t1.id = t2.id + 1 WHERE t2.id IS NULL LIMIT 1



Operuję na jednej tabeli, a jak dobrze rozumiem to powyżej jest na dwie...
Go to the top of the page
+Quote Post
kwiateusz
post
Post #10


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




źle rozumiesz to jest jedna tabela łączona z sama sobą t1 to "tabela" i tak samo t2 to "tabela" (jedna i ta sama)
Go to the top of the page
+Quote Post
Ania-678
post
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:

  1. SELECT * FROM REJES t1 LEFT JOIN REJES t2 ON t1.id = t2.id + 1 WHERE t2.id IS NULL LIMIT 1


bo pokazuje Mi ciągle rekord o id 1 który JEST a najwyższy to mam ponad 14XX... dry.gif


EDIT:

po zwiększeniu LIMITu do 10

  1. SELECT *FROM players t1 LEFT JOIN players t2 ON t1 . id =t2 . id +1 WHERE t2 . id IS NULL ORDER BY `t1`.`id` ASC LIMIT 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
Go to the top of the page
+Quote Post
superfrajer
post
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
Go to the top of the page
+Quote Post
Norbas
post
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:
  1. SELECT id-1
  2. FROM rejs WHERE id>1 AND id-1 NOT IN (SELECT id FROM rejs) LIMIT 1

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


--------------------
Go to the top of the page
+Quote Post
Ania-678
post
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 dry.gif
Go to the top of the page
+Quote Post
SongoQ
post
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%)
-----


Myslalem ze po moim poscie poradzisz sobie.

Masz tutaj kompletne zapytanie ktore zwroci Ci doklanie 1 oczekiwana wartosc.

  1. SELECT t1.id + 1 FROM tabela t1 LEFT JOIN tabela t2 ON t1.id = t2.id + 1 WHERE t2.id IS NULL ORDER BY t1.id LIMIT 1


--------------------
Go to the top of the page
+Quote Post
Ania-678
post
Post #16





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

Ostrzeżenie: (0%)
-----


Ten dziad:

  1. $aktiv = $db -> Execute("SELECT * FROM ak WHERE aktyw=".$_GET['kod']);
  2. $fid = $db -> Execute("SELECT t1.id + 1 FROM akt t1 LEFT JOIN akt t2 ON t1.id = t2.id + 1 WHERE t2.id IS NULL ORDER BY t1.id LIMIT 1");
  3. $db -> Execute("INSERT INTO akt (id, user, email, pass) VALUES('".$fid."','".$aktiv -> FIELDS['user']."','".$aktiv -> FIELDS['email']."','".$aktiv -> FIELDS['pass']."')");
  4. $db -> Execute("DELETE FROM ak WHERE aktyw=".$_GET['kod']);


ma Mnie gdzieś i ciągle id = auto_increment z db... dry.gif

Ten post edytował Ania-678 16.06.2007, 09:22:04
Go to the top of the page
+Quote Post
UDAT
post
Post #17





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


Spróbuj
  1. SELECT t1.id+1 FROM tabela t1 WHERE NOT EXISTS (
  2. SELECT id FROM tabela WHERE id=t1.id+1
  3. ) ORDER BY t1.id LIMIT 1;


Ten post edytował UDAT 16.06.2007, 12:58:06
Go to the top of the page
+Quote Post
Ania-678
post
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...
Go to the top of the page
+Quote Post
superfrajer
post
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
Go to the top of the page
+Quote Post
UDAT
post
Post #20





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


A to:
  1. SELECT IF(
  2. NOT EXISTS (
  3. SELECT id FROM tabela WHERE id=0
  4. ),
  5. 0,
  6. ( SELECT t1.id+1 FROM tabela t1
  7. WHERE NOT EXISTS (
  8. SELECT id FROM tabela WHERE id=t1.id+1
  9. ) ORDER BY t1.id LIMIT 1
  10. )
  11. );


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
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 03:20