Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Dziwny błąd MySQL w przeglądarce
Forum PHP.pl > Forum > Przedszkole
stefik4
Witam posiadam skrypt, który po przeglądnięciu pętli ma zapisać niektóre dane do bazy:

  1. <?
  2.  
  3. $updejty = '';
  4.  
  5. //start petli
  6.  
  7. $updejty .= 'UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+'.$eeee.$aga.' WHERE `id`='.$row['id'].';';
  8.  
  9. //koneic petli
  10.  
  11. //dla sprawdzenia:
  12.  
  13. $upssss = $updejty;
  14. echo "zapyrania: ".$upssss."<br><br><br>";
  15. if (!empty($updejty)) { mysql_query($upssss) or die("err: ".mysql_error());}
  16.  
  17. ?>



Zwraca:

Kod
zapyrania: UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+0.02 WHERE `id`=5369;UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+0.02 WHERE `id`=4211;UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+0.02 WHERE `id`=12234;UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+0.02 WHERE `id`=9563;


err: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+0.02 WHERE `id`=4211;UPDATE `riders` ' at line 1



Zrobiłem echo, żeby przetestować wykonanie zapytania w PhpMYAdminie, ale tam pisze jasno: Zapytanie SQL wykonano pomyślnie!
Zapytanie kopiuje bezpośrednio z tego co mi strona wyświetla i wklejam w pma i wykonuje a na stronie dziwny błąd ;/

Miałem po przedno te zapytania an tablicach, na końcu implode i to samo było ;(

Nie wiem co robić ;/
ADeM
Z poziomu PHP możesz wykonać tylko jedno zapytanie za pomocą jednego "mysql_query()".
stefik4
Hmmm... dziwne kumpel wykonuje tak multum zapytań, ja sam używam do inserow jednego zapytania. To jakim cudem dziala w PMA ? a jak to zrobić, aby było szybko i zżerało mało pamieci questionmark.gif Zależy mi na czasie wykonywanai bo za ejdnym razem bedzie ok 800 takich zapytań.
ADeM
Nie wiem jak to jest w PMA. Być może rozdziela sobie po prostu zapytania średnikiem i wykonuje każde osobno.
Jeśli Twój kumpel tak wykonuje, to niech pokaże Ci kod ;-)

Jeśli $eeee i $aga w każdym przypadku jest takie samo, to lepiej będzie zrobić:
  1. $updejty = 'UPDATE `riders` SET `is`=`is`+1, `xp`=`xp`+'.$eeee.$aga.' WHERE `id` IN ( 1, 3, 4, 12, 10... )';
stefik4
NO tak w tym przypadku akurat właśnie wpadlem na to samo. ale w innym miejscu, gdy rożne rzeczy sa updejtowane to każde zapytanie musze osobno robic ? Jak moge to zrobic najszybeij?

ADeM
Jedyne wyjście, to każde osobno. Ewentualnie pokaż co chcesz osiągnąć, to może coś zdziałamy ;-)
stefik4
Ok poradziłem sobie z tym, zrobiłem tak jak pisałeś `id` IN ...

a inne mam tak:

  1. $o=0;
  2.  
  3. //start petli
  4.  
  5.  
  6.  
  7. $o = ++$p; $pkt = 4 - $o;
  8.  
  9. if($rower['czas']==500){$pkt=-1;}
  10.  
  11.  
  12.  
  13. switch($pkt){
  14. case 0: $ups ="`4m`"; break;
  15. case 1: $ups ="`3m`"; break;
  16. case 2: $ups ="`2m`"; break;
  17. case 3: $ups ="`1m`"; break;
  18. case -1: $ups ="`w`"; break;
  19. }
  20. if($pkt==-1){$pkt=0;}
  21.  
  22. mysql_query('UPDATE `riders` SET '.$ups.'='.$ups.'+1, `punktow`=`punktow`+'.$pkt.', `biegow`=`biegow`+1 WHERE `id`='.$rower['id_zawodnika']);
  23.  
  24. //koneic petli
  25.  
  26.  


I dałoby rade to wykonywać raz w czasie wykonania skryptu, bo obecnie jak mam np 25 meczy wykonywanych x 4 to jest 100 takich zapytań update ;/
ADeM
Być może dałoby się to w jednym zapytaniu zrobić. Pokaż skąd dokładnie się bierze $pkt.
Hoku
hmmm a może być w 2 zapytaniach winksmiley.jpg ?
tylko template tabelka potrzebna
pakujesz do templatki zmiany i id
z tego co pamietam takie coś powinno dać radę
  1. UPDATE riders, temp SET riders.punktow =riders.punktow + temp.punktow WHERE riders.id = temp.id

analogicznie do reszty

w zasadzie 3 bo jeszcze zostaje czyszczenie temp'a
lukaskolista
Cytat
Z poziomu PHP możesz wykonać tylko jedno zapytanie za pomocą jednego "mysql_query()".

odsylam do manuala oraz proponuje zorientowac sie w skladni SQL. Zakladam, ze jako "1 zapytanie" uznales 1 operacje na bazie.

Cytat
Hmmm... dziwne kumpel wykonuje tak multum zapytań

Za pomoca 1 mysql_query wykonuje (na ta chwile) 9208 zapytan (wedluj powyzej przyjetej definicji). Sposob na to jest prosty: oddielic zapytania separatorem

Cytat
Jedyne wyjście, to każde osobno.
Bzdura. Syntax error to nic innego, jak blad skladniowy.
nospor
@lukaskolista możesz pokazać swoje 9208 zapytan ktore wykonujesz przy pomocy jednego mysql_query? Jestem tego bardzo ciekaw
lukaskolista
UPDATE ...; UPDATE ...; UPDATE ...; wybacz, ale nie wkleje tu wszystkich.
ADeM
A możesz pokazać dokładnie tak, jak tego używasz?
Np.:
  1. mysql_query( "UPDATE ...;UPDATE ...;" );
Hoku
Cytat(ADeM @ 11.01.2011, 16:52:34 ) *
A możesz pokazać dokładnie tak, jak tego używasz?
Np.:
  1. mysql_query( "UPDATE ...;UPDATE ...;" );

podobno jest jakaś flaga do tego patrz dokuemntacja komentarze gdzies na gorze
i podobno mysqli ma multi query dozwolone
ADeM
Przeglądnąłem wszystkie komentarze w manualu pobieżnie i nie znalazłem nigdzie żadnego wykonania kilku zapytań w jednym mysql_query. Ponadto jeden wpis traktuje o tym, że w dokumentacji niemieckiej brakuje zaznaczenia, że nie można wykonywać wielu zapytań przy jednym użyciu funkcji.
stefik4
To już całkowicie nie wiem jak to ma być. Zastosowałem tego UPDATE z WHERE `id` IN ..., bo w tym jednym momencie zapisuje te same rzeczy więc to mogę zastosować, ale w większości innych przypadków gdy aktualizuję tą samą tabelę, ale inne dane to na rękę mi by było zsumować zapytania i wykonać na końcu po pętlach. Obecnie mój skrypt pracuje tak:

Kod
2011-01-11 17:24:42 | czas:1.616| select: 92 | insert: 20 | update: 6 | suma: 118 | biegow:5 | MEM:0.786432


Taki wynik średnio mnie satysfakcjonuje, lecz jest to średni wynik, ale przy np 50 begach będzie się wykonywał 10 sek co już jest zagrożeniem dla przerwania wykonywania, lub przeciążenia serwera.
ADeM
Tak jak mówiłem wcześniej: powiedz dokładnie co chcesz osiągnąć i jak powstają dane, które są aktualizowane w bazie.
stefik4
  1.  
  2. <?
  3. $insert_punkty = array();
  4. $p=0;
  5.  
  6. // $bieg_wynik = zapytanie;
  7.  
  8. while($rower = mysql_fetch_assoc($bieg_wynik)) {
  9.  
  10. $o = ++$p; $pkt = 4 - $o;
  11.  
  12.  
  13. if($rower['czas']==500){$pkt=-1;}
  14.  
  15. //dodawanie punktow do bazy
  16.  
  17.  
  18. $insert_punkty[] = "(".$ad['id'].",".$next.",".$rower['id_zawodnika'].",".$pkt.",'".$bonus[$rower['id_zawodnika']]."', ".$rower['klub'].")";
  19.  
  20. if($ad['rodzaj']==1){ // jelsi ligowy dodaje miejsca
  21.  
  22. switch($pkt){
  23. case 0: $ups ="`4m`"; break;
  24. case 1: $ups ="`3m`"; break;
  25. case 2: $ups ="`2m`"; break;
  26. case 3: $ups ="`1m`"; break;
  27. case -1: $ups ="`w`"; break;
  28. }
  29. if($pkt==-1){$pkt=0;}
  30.  
  31. mysql_query('UPDATE `riders` SET '.$ups.'='.$ups.'+1, `punktow`=`punktow`+"'.$pkt.'", `biegow`=`biegow`+1,`xp`=`xp`+0.03 WHERE `id`='.$rower['id_zawodnika']);
  32.  
  33. }
  34. }
  35.  
  36. ?>
  37.  


Pętla pobiera zawsze tylko 4 rekordy bo taki jest LIMIT. Jak widać, za każdym razem zapisuje inne kolumny(`1m`,`2m`...) i inne dane $pkt.
Hoku
Cytat(ADeM @ 11.01.2011, 17:26:10 ) *
Przeglądnąłem wszystkie komentarze w manualu pobieżnie i nie znalazłem nigdzie żadnego wykonania kilku zapytań w jednym mysql_query. Ponadto jeden wpis traktuje o tym, że w dokumentacji niemieckiej brakuje zaznaczenia, że nie można wykonywać wielu zapytań przy jednym użyciu funkcji.

Cytat
Stratsimir Kolchevski 22-Jun-2009 12:51
The documentation claims that "multiple queries are not supported".

However, multiple queries seem to be supported. You just have to pass flag 65536 as mysql_connect's 5 parameter (client_flags). This value is defined in /usr/include/mysql/mysql_com.h:
#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* Enable/disable multi-stmt support */

Executed with multiple queries at once, the mysql_query function will return a result only for the first query. The other queries will be executed as well, but you won't have a result for them.
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.