Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak wybrac ostatni dodany id ?
Forum PHP.pl > Forum > Bazy danych > MySQL
swmikolaj21
Witam!

Jak najskuteczniej i najpoprawniej zrobic cos takiego:

Komis:
dodaje oferte- do bazy danych: marka, model, id- auto increment. Oprocz tego uploaduje zdjecie ktorego nazwa ma wygladac cos w stylu car_11.jpg , gdzie 11 to nr id wlasnie co dodanego auta.

Problem mam z tym jak wycignac to id

Pozdrawiam
mhs
np.:

1)
  1. SELECT last_insert_id();

2) mysql_insert_id" title="Zobacz w manualu PHP" target="_manual
swmikolaj21
biggrin.gif A tak sobie własnie myslałem ze przydałaby sie taka funkcja. Ale nie pomyslalem ze ja stworzyli.

DZIEKI WIELKIE!!!
kotkon
2. nie działą bo ty tylko w php 5

a co do 1. to nie rozumiem jak to trzeba zrobic zeby działało mozna by prosic o kod w php jak to użyc?questionmark.gif
SongoQ
php5 nie ma nic do tego.

Cytat
to nie rozumiem jak to trzeba zrobic zeby działało mozna by prosic o kod w php jak to użyc?questionmark.gif

W manualu wszystko pisze, nawet masz przyklad.
arturrrr
Jak nie bedzie dzialac to zawsze mozna sprawdzic ilosc rekordow w bazie, odjac od niej jeden i z LIMITem wyciagnac jeden rekord.
SongoQ
@arturrrr Zastanawiales sie o czym powiedziales? Dodajesz 10 rekordow czyli inkrementacja wynosi 11, nastepnie usuwasz 5 czyli zostaje Ci 5, robisz zapytanie zwraca Ci 5 lecz ostatnie id bylo 10. Dodatkowo uwzglednij ze miedzy dodaniem a zwroceniem tego id ktos dodal kolejny rekord.

To co napisales jest najgorszym bledem.
arturrrr
@SongoQ chyba mnie zle zrozumiales.

1. Sprawdzam ile jest rekordow w bazie.
2. Odejmuje od tego 1.
3. Pobieram jeden rekord, np. warunek id > 0 ale (exclamation.gif!) LIMIT jest ustawiony na jedno pobranie rekordu od miejsca wyliczonego w punkcie 2.

To by bylo na tyle w sprawie wytlumaczenia o co mi chodzi.

Druga sprawa to to ze miedzy punktem 1 a 3 (zapewniam ze ulamkowa czesc sekundy) moze dojsc do:

- dodania rekordu. Ja uznalem ze jest to malo prawdopodobne. Jesli nawet tak by sie stalo, to dostaniemy przedostatni rekord.
- usuniecia jakiegos rekordu. Takze malo prawdopodobne. Wtedy nic nie zostanie z bazy zwrocone.

Dodam ze mozna to wrzucic w petle i w koncu otrzymamy prawidlowy wynik. Obstawiam ze bedzie to za pierwszym razem.

Nie jest to sposob najefektywniejszy, ale za to logiczny i latwy do przeanalizowania. Przynajmniej dla mnie.

@SongoQ jesli sie myle to mnie popraw. Moze sie czegos naucze, bo specem nie jestem...
SongoQ
Ok to moze inaczej.

Dodales rekord i id jego wynosi 10 i mamy takie rekordy
id tekst
1 aaa
3 bbb
5 sdf
6 sdf
7 dsf
10 dodany

Zgodnie z tym co napisales.

1 i 2.
  1. SELECT (COUNT(id) - 1) AS ilosc
  2. FROM tabela

Zwraca 5

3.
  1. SELECT *
  2. FROM tabela WHERE id > 0 LIMIT 5, 1

Jesli zwroci pseudolosowo to bedzie kazda wartosc moze byc 10, moze byc 1 i po co to id > 0 questionmark.gif?

Cytat
- dodania rekordu. Ja uznalem ze jest to malo prawdopodobne. Jesli nawet tak by sie stalo, to dostaniemy przedostatni rekord.

Czesto sie to zdaza, przykladem moze byc nawet forum.php.pl

Podsumowujac, takie cos by zadzialalo jak bys jeszcze sortowanie wprowadzil, ale co za tym idzie, dodatkowy czas dla bazy przez takie rzeczy jak COUNT w pierwszym zapytaniu w ORDER BY w 2 zapytaniu i LIMIT. Dodatkowo nie uwgledniles ze sesje sie moga zachodzic.

Nie ma niczego pewniejszego jak zwrocenie id z inkrementacji z sesji bazy danych.
arturrrr
No to sie chyba nie rozumiemy sad.gif

TABELKA:

id adres
1 hhdsgh
2 gss
3 gh
7 hksp
8 csgh


Kod
$zapytanie = "SELECT * FROM tabela where id > 0";
$rekordy = mysql_num_rows($wykonaj);


I tu juz masz liczbe rekordow.

Kod
$rekordy--;


Tu wszystko jasne.

Kod
$zapytanie = "SELECT * FROM tabela where id > 0 LIMIT ".$rekordy.",1";


A tu dostajesz ostatni rekord.

Co do tabeli to id jest oczywiscie dodawane automatycznie, rosnaco i sie nigdy nie powtarza.


Nadal uwazam ze jest to dobre rozwiazanie, ale dla MALYCH serwisow. Moga byc bowiem czeste dodawania danych itp, wiec istnieje prawdopodobienstwo malych przeklaman.

Cytat
Jesli zwroci pseudolosowo to bedzie kazda wartosc moze byc 10, moze byc 1 i po co to id > 0 questionmark.gif?

Tutaj Ciebie nie rozumiem:(

Cytat
Czesto sie to zdaza, przykladem moze byc nawet forum.php.pl

a tu sie zgadzam, forum w koncu to nie jakis maly serwis.

Cytat
Nie ma niczego pewniejszego jak zwrocenie id z inkrementacji z sesji bazy danych.

tu tez sie moge zgodzic.
mhs
@arturrrr

tak czytam ten watek i nie rozumiem jednej rzeczy:

po co tyle kombinowania, skoro:


Cytat
Nadal uwazam ze jest to dobre rozwiazanie, ale dla MALYCH serwisow. Moga byc bowiem czeste dodawania danych itp, wiec istnieje prawdopodobienstwo malych przeklaman.
questionmark.gif

czyli Twoje rozumowanie jest bledne... nie ma znaczenia czy jest to duzy czy maly serwis jezeli istnieje mozliwosc przeklamania
SongoQ
Po co tyle zapytan, po co meczyc php i baze danych.

To zapytnanie:
  1. $zapytanie = "SELECT *
  2. FROM tabela where id > 0";
  3. $rekordy = mysql_num_rows($wykonaj);

Zdajesz sprawe czym to grozi?? Bedzie milony rekordow w bazie do bedziesz musial wszysto do php przeslac po co to wszystko zwracac, pomysl troche.

Cytat
Tutaj Ciebie nie rozumiem:(


Rekordy z bazy danych jesli nie masz sortowania to sa zwracane pseudolosowo lub w przypadku MySQLa domyslenie wedlug daty, jesli skompikujesz zapytnie wtedy juz data nie wchodzi w gre.

Idac Twoim tokiem myslenia to juz lepiej takie cos zastosowac
  1. SELECT max(id) AS id FORM tabela


Slyszales o max?questionmark.gif Widze ze brakuje Ci duzo teorii baz danych.
arturrrr
Cytat
Nie jest to sposob najefektywniejszy, ale za to logiczny i latwy do przeanalizowania. Przynajmniej dla mnie.


Fragment mojego postu. A co do:
Cytat
Slyszales o max?questionmark.gif Widze ze brakuje Ci duzo teorii baz danych.


Oczywiscie ze slyszalem i oczywiscie ze brakuje mi duzo wiedzy.
Rozumiem ze jestes w tych sprawach lepszy i nie zamierzam tego podwazac, ale moze troch skromnosci z twojej strony by sie tez przydalo. Wyskakujesz tez z jakimis milionami a ja juz kilka razy napisalem ze to rozwiazanie dla tych co nie potrafia inaczej tego zrobic, dla malych stron. Widze jednak ze ty chyba sie z wiedza na temat baz danych urodziles. Moze wiec zajmij sie jakas dochodowa praca a nie bezczynnie siedzisz na forum. W koncu specjalisci zbieraja miliony...
To dotyczy takze wypowiedzi w moim temacie.

To juz wszytsko z mojej strony na ten temat.

Pozdro
mhs
Cytat(arturrrr @ 2005-07-11 13:13:12)
Rozumiem ze jestes w tych sprawach lepszy i nie zamierzam tego podwazac, ale moze troch skromnosci z twojej strony by sie tez przydalo. Wyskakujesz tez z jakimis milionami a ja juz kilka razy napisalem ze to rozwiazanie dla tych co nie potrafia inaczej tego zrobic, dla malych stron. Widze jednak ze ty chyba sie z wiedza na temat baz danych urodziles. Moze wiec zajmij sie jakas dochodowa praca a nie bezczynnie siedzisz na forum. W koncu specjalisci zbieraja miliony...
To dotyczy takze wypowiedzi w moim temacie.

To juz wszytsko z mojej strony na ten temat.

Pozdro

uszanuj wiec czas, ktory poswieca SongoQ starając Ci się pomóc i nie wypowiadaj sie w ten sposob....
SongoQ
Cytat
ale moze troch skromnosci z twojej strony by sie tez przydalo

Tu nie chodzi o skromnosc, tu chodzi o oczywiste rzeczy, jak bys troszeczke pomyslal i sie zastanowil to bys znalazl latwiejsze, krotsze rozwiazanie a nie kobmbinujesz z zapytaniami.

Cytat
Wyskakujesz tez z jakimis milionami a ja juz kilka razy napisalem ze to rozwiazanie dla tych co nie potrafia inaczej tego zrobic, dla malych stron.

Kazdy nawet poczatkujacy programista szuka najprostrzego rozwiazania a nie komplikuje sobie zycie i jeszcze przekonuje sie ze jego pomysl jest najlepszy. Poczytaj o wydajnosciach baz danych, poczytaj o SCRUM zobaczysz ze najwazniejsza jest prostota wykonania dla GUI jak i dla mechanizmow dzialania, jak i dla bazy danych.

Cytat
Widze jednak ze ty chyba sie z wiedza na temat baz danych urodziles.

Oj mylisz sie, duzo mi brakuje wiedzy na ten temat i ciagle sie ucze, a szczegolnie spedzajac czas na tym forum i jesli popelnie jakas gafe to potrafie sie przyznac.

Cytat
Moze wiec zajmij sie jakas dochodowa praca a nie bezczynnie siedzisz na forum.

Mam prace i jestem z niej zadowolony, a dlaczego siedze na forum? Podobnie jak wiekszosc osob tutaj wypowiadajacy sie: przez wypowiadanie sie i pomaganie innym sami sie uczymy i naprawde wiele wiedzy nabylem spedzajac czas na tym forym.

Wracajac do powyzszych postow podalem Ci przyklady, mysle ze kazdy zrozumial, jesli chesz to moge podac Ci rezultaty czasowe dla roznych wielkosci rekordow i jestem w stanie udowodnic Ci ze Twoje motody sa nieoptymalne.
DavidPL
@arturrrr

Ucz się, a będziesz specjalistą i będziesz zarabiał miliony - a na razie uszanuj mądrzejszych którzy chcą Ci pomóc i podzielić się z Tobą swoją wiedzą, która zresztą też kosztowała ich sporo wysiłku.

@SongoQ

Z co byś powiedział na zapytanie:
  1. SELECT id
  2. FROM tabela ORDER BY id DESC LIMIT 0, 1


Kwestia wydajnościowa, bo wydaje mi się że rezultat powinien być taki sam jak MAX
mhs
Cytat(DavidPL @ 2005-07-11 14:19:14)
Kwestia wydajnościowa, bo wydaje mi się że rezultat powinien być taki sam jak MAX

gdzies swego czasu przeczytalem, ze zapytania z funkcjami agregujacymi sa niezwykle szybkie (jak nie najszybsze), tym bardziej, ze w tym przypadku sa to pola indeksowane w zwiazku

wydaje mi sie ze w tym przypadku beda one dzialac szybkiej gdyz tutaj system zarz. baza danych musi pobrac wszystkie rekordy, dokonac posortowania i nastepnie dopiero zwrocic ten jeden wiersz

takie jest moje zdanie... czekam na opinie...
nospor
@arturrrr oj nie popisałeś się chłopie. Ludzie chcą pomóc a ty na nich krzyczysz jak ci uwagę zwrócą. Przyczepiłeś się tej małej stronki jak rzep psiego ogona. Czy to duża, czy to mała - optymalnie trzeba pisać dla każdej. W ten sposób se nawyki dobre wyrabia i podnosi swój poziom. Tak więc nie mów ludziom czym mają się zająć i sam przyjmi z pokorą i wdzięcznością lepsze rozwiązania.

co do tematu: max będzię lepszy również i moim "skromnym" zdaniem
grattz
Cytat(SongoQ @ 8.07.2005, 18:27:46 ) *
W manualu wszystko pisze, nawet masz przyklad.

Dopiero zaczynam bawic sie php. Szukam tej funkcji select last_insert_id();
Ale nie widze tego tematu.
nospor
select last_insert_id() to jest MySql a nie php, wiec nic dziwnego ze w manualu php tego nie znalazles smile.gif

W php masz:
http://pl.php.net/mysql_insert_id
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.