Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Dziwny błąd MySQL w przeglądarce
stefik4
post
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


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ć ;/
Go to the top of the page
+Quote Post
ADeM
post
Post #2





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


Z poziomu PHP możesz wykonać tylko jedno zapytanie za pomocą jednego "mysql_query()".

Ten post edytował ADeM 10.01.2011, 23:29:12


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





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


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ń.

Ten post edytował stefik4 10.01.2011, 23:37:15
Go to the top of the page
+Quote Post
ADeM
post
Post #4





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


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... )';


--------------------
Go to the top of the page
+Quote Post
stefik4
post
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


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?

Go to the top of the page
+Quote Post
ADeM
post
Post #6





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


Jedyne wyjście, to każde osobno. Ewentualnie pokaż co chcesz osiągnąć, to może coś zdziałamy ;-)


--------------------
Go to the top of the page
+Quote Post
stefik4
post
Post #7





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


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 ;/

Ten post edytował stefik4 11.01.2011, 00:06:29
Go to the top of the page
+Quote Post
ADeM
post
Post #8





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


Być może dałoby się to w jednym zapytaniu zrobić. Pokaż skąd dokładnie się bierze $pkt.


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





Grupa: Zarejestrowani
Postów: 49
Pomógł: 2
Dołączył: 6.07.2010

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


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

Ten post edytował Hoku 11.01.2011, 00:56:04
Go to the top of the page
+Quote Post
lukaskolista
post
Post #10





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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.

Ten post edytował lukaskolista 11.01.2011, 08:19:21
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@lukaskolista możesz pokazać swoje 9208 zapytan ktore wykonujesz przy pomocy jednego mysql_query? Jestem tego bardzo ciekaw


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
lukaskolista
post
Post #12





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


UPDATE ...; UPDATE ...; UPDATE ...; wybacz, ale nie wkleje tu wszystkich.
Go to the top of the page
+Quote Post
ADeM
post
Post #13





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


A możesz pokazać dokładnie tak, jak tego używasz?
Np.:
  1. mysql_query( "UPDATE ...;UPDATE ...;" );


--------------------
Go to the top of the page
+Quote Post
Hoku
post
Post #14





Grupa: Zarejestrowani
Postów: 49
Pomógł: 2
Dołączył: 6.07.2010

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


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





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


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.


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





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


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.
Go to the top of the page
+Quote Post
ADeM
post
Post #17





Grupa: Zarejestrowani
Postów: 455
Pomógł: 69
Dołączył: 23.10.2004
Skąd: Oświęcim

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


Tak jak mówiłem wcześniej: powiedz dokładnie co chcesz osiągnąć i jak powstają dane, które są aktualizowane w bazie.


--------------------
Go to the top of the page
+Quote Post
stefik4
post
Post #18





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


  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.
Go to the top of the page
+Quote Post
Hoku
post
Post #19





Grupa: Zarejestrowani
Postów: 49
Pomógł: 2
Dołączył: 6.07.2010

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


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

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: 22.08.2025 - 08:02