php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.02.2010, 23:12  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard mysqli_multi_query lässt Eintrag aus...

Huhu,

Ich... werd' grad bekloppt.
Folgendes (für mich) merkwürdige Problem.

Ich habe folgende Tabelle (Ausschnitt vom Anfang):





Nun führe ich in php einen mysqli_multi_query() aus mit folgendem Abfragestring:

Zitat:
UPDATE timetables SET attractivity_factor = 0.061933894809974 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 00;
UPDATE timetables SET attractivity_factor = 0.024319415514931 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 01;
UPDATE timetables SET attractivity_factor = 0.018226689678104 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 02;
UPDATE timetables SET attractivity_factor = 0.016090357612105 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 03;
UPDATE timetables SET attractivity_factor = 0.012377198163158 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 04;
UPDATE timetables SET attractivity_factor = 0.0021533833457669 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 05;
[...]
(Den ganzen String hab ich unten nochmal in's Posting gepasted und formatiert...)


Als Ergebnistabelle krieg ich nun:



Wie man sieht, steht in der dritten Zeile ein "NULL" wo eigentlich auch ein Wert stehen sollte?!?

Führ ich mein php Script nun nochmal aus, erkennt es, daß da noch ein Wert fehlt (es fragt ab ob "NULL") ...

Abfragestring:

Zitat:
UPDATE timetables SET attractivity_factor = 0.018226689678104 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 02;
Tabelle:





Ich versteh's nicht.

Und es passiert reproduzierbar immer dasselbe.

Ich setze die Werte auf NULL ... und alle bis auf den Wert in Zeile 3 werden geupdated...


Hülfö.




Zitat:
UPDATE timetables SET attractivity_factor = 0.061933894809974 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 00;
UPDATE timetables SET attractivity_factor = 0.024319415514931 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 01;
UPDATE timetables SET attractivity_factor = 0.018226689678104 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 02;
UPDATE timetables SET attractivity_factor = 0.016090357612105 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 03;
UPDATE timetables SET attractivity_factor = 0.012377198163158 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 04;
UPDATE timetables SET attractivity_factor = 0.0021533833457669 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 05;
UPDATE timetables SET attractivity_factor = 0.002799398349497 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 06;
UPDATE timetables SET attractivity_factor = 0.0020670351480087 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 07;
UPDATE timetables SET attractivity_factor = 0.0022252672245414 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 08;
UPDATE timetables SET attractivity_factor = 0.0023699095947346 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 09;
UPDATE timetables SET attractivity_factor = 0.0026585524291673 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 10;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 11;
UPDATE timetables SET attractivity_factor = 0.07613575326265 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 12;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 13;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 14;
UPDATE timetables SET attractivity_factor = 0.050296434817648 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 15;
UPDATE timetables SET attractivity_factor = 0.057183241066658 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 16;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 17;
UPDATE timetables SET attractivity_factor = 0.14176138527573 WHERE user_id = 15 AND datum = '2010-12-18' AND hour = 18;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 00;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 01;
UPDATE timetables SET attractivity_factor = 0.014593063678623 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 02;
UPDATE timetables SET attractivity_factor = 0.011139478346842 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 03;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 04;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 05;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 06;
UPDATE timetables SET attractivity_factor = 0.01485263779579 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 07;
UPDATE timetables SET attractivity_factor = 0.017328077428421 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 08;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 09;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 10;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 11;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 12;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 13;
UPDATE timetables SET attractivity_factor = 0.0085191105107812 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 14;
UPDATE timetables SET attractivity_factor = 0.0089996757190601 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 15;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 16;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 17;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-19' AND hour = 18;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 00;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 01;
UPDATE timetables SET attractivity_factor = 0.011624200347628 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 02;
UPDATE timetables SET attractivity_factor = 0.010394717618576 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 03;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 04;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 05;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 06;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 07;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 08;
UPDATE timetables SET attractivity_factor = 0.0019151967758728 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 09;
UPDATE timetables SET attractivity_factor = 0.0019977248417436 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 10;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 11;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 12;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 13;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 14;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 15;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 16;
UPDATE timetables SET attractivity_factor = 0 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 17;
UPDATE timetables SET attractivity_factor = 0.15585614849991 WHERE user_id = 15 AND datum = '2010-12-20' AND hour = 18;
Samhayne ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.02.2010, 23:47  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
es fragt ab ob "NULL"
Wo bitte tut es das?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 07.02.2010, 00:15  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Würd' glaub nix bringen, den ganzen php Code hier reinzupasten.

Und sollte ja auch egal sein, oder?

ich ruf...

Code:
mysqli_multi_query($db, $sql)
                  or die ("MySQL attractivity update query error: " . mysqli_error($db));
auf... und fütter ihn mit dem sql String, den ich oben gepostet hab... und eine Zeile scheint er beim Updaten immer zu "übersehen".


Crazy....

Hab grad mal ein paar "mysqli_next_result($db);"s angehängt nach der Abfrage... mit jeder rückt das NULL eine Zeile runter.

Code:
mysqli_multi_query($db, $sql)
                  or die ("MySQL attractivity update query error: " . mysqli_error($db));


        echo mysqli_next_result($db); //1
        echo mysqli_next_result($db); //2
        echo mysqli_next_result($db); //3
        echo mysqli_next_result($db); //4
        echo mysqli_next_result($db); //5
        echo mysqli_next_result($db); //6
        echo mysqli_next_result($db); //7
        echo mysqli_next_result($db); //8
        echo mysqli_next_result($db); //9
        echo mysqli_next_result($db); //10
        echo mysqli_next_result($db); //11
Danach ist das NULL von Zeile 3 zu Zeile 14 runtergerutscht....





Was zum...?!

Geändert von Samhayne (07.02.2010 um 00:19 Uhr).
Samhayne ist offline   Mit Zitat antworten
Alt 07.02.2010, 10:24  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Okay... wie's aussieht, muss man die ganzen results wohl ablaufen.


Gestalte ich die Abfrage so:

Code:
if (mysqli_multi_query($db, $sql))
{
    while (mysqli_more_results($db))
    {
       mysqli_next_result($db);
    }

}
... ist das NULL verschwunden.

Tut man das nicht, winkt einem bei der nächsten DB Abfrage obendrein ein "Commands out of sync".


Blöderweise frisst die ganze Prozedur sportliche 2 Sekunden.
Der einmalige Aufruf mit einen "Null" Eintrag als Schönheitsfehler dauerte nur 0.002 Sekunden.


Unbefriedigend.

Geändert von Samhayne (07.02.2010 um 10:52 Uhr).
Samhayne ist offline   Mit Zitat antworten
Alt 07.02.2010, 11:43  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Hab mal ein Testscript geschrieben. (siehe Anhang)

- createTimetable() erstellt obige Tabelle "timetable_test" in Eurer Datenbank.

Parameter: true / false
true: Results werden nacheinander mit mysqli_next_result() abgeklappert
false: Es wird nur ein mysqli_multi_query() ausgeführt ... ohne anschließendes abklappern

- showTimetable() zeigt die Tabelle an.



Der Datenbanklink wird am Ende von createTimetable() einfach geschlossen und bei showTimetable() wieder neu geöffnet um den "Commands out of sync" Fehler zu umgehen.



Ich find's verrückt.

PHP-Code:
createTimetable(false);
show timetable(); 
gibt eine Tabelle aus in der nur der erste Eintrag gesetzt wird.

Führt man danach das Script nochmal aus mit:

PHP-Code:
//createTimetable(false);
show timetable(); 
Bekommt man die Tabelle mit dem einen NULL.


Und nur bei

PHP-Code:
createTimetable(true);
show timetable(); 
Ist das Ergebnis so wie es sein soll... dauert aber 2 Sekunden (bei mir).
Angehängte Dateien
Dateityp: zip _test2.zip (13,3 KB, 16x aufgerufen)
Samhayne ist offline   Mit Zitat antworten
Alt 07.02.2010, 12:24  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.576
PHP-Kenntnisse:
Fortgeschritten
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Kann ich alles bestätigen, nur braucht Szenario 3 bei mir nicht 2 Sekunden, sondern 60 ms.

Was genau bei dem Verbindungsabbruch und -neuaufbau geschieht, darüber kann ich auch bloß spekulieren. Aber die Vorgehensweise, den "commands out of sync"-Fehler zu umgehen, indem die Verbindung abgewürgt wird, ist schon recht unorthodox.

Ist die Datenbank vielleicht so stark überlastet oder schwer zu erreichen, dass die UPDATE-Queries ewig brauchen? Hast du mal versucht, sie im phpMyAdmin oder so auszuführen?

Na ja, ich stochere nur im Dunkeln. Ne wirkliche Idee habe ich nicht, sorry.

Alternative wäre vielleicht ein prepared statement statt der Multiquery. (Ich habe keine Ahnung.) Aber eine Erklärung ist das auch nicht.
mermshaus ist offline   Mit Zitat antworten
Alt 07.02.2010, 12:56  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Hey mermshaus.

Danke, daß Dich durchgewuselt hast.

60ms?? Hmmm... vielleicht sind mein 1,4GHz Centrino und seine 5400UPM Festplatte einfach unendlich überfordert. Während den 2 Sekunden rödelt die Festplatte jedenfalls wie bekloppt.

Multiquerys klangen einfach superinteressant.... grad für updates.
Aber wenn man dann trotzdem für jede Zeile nochmal zur Datenbank funken muss,
wird das ganze irgendwie absurd.

Ich hab mir jetzt ein wildes Update query mit vielen cases und wheres gebastelt um die Tabelle mit einer einzigen Query zu updaten.
Damit bin ich nun bei 0.1sec.

Lässt sich natürlich auch nicht immer so machen... zumindest wenn man dabei halbwegs pragmatisch bleiben will.

Multi_Querys wären schon schicker gewesen... aber irgendwie scheinen die 'ne Mogelpackung zu sein. (???)


edit: Der Verbindungsabbruch wäre live natürlich keine gute Idee.
Aber hier würd' er ohne das Abwürgen wegen dem Error kein Ergebnis ausgeben im Testscript.

Geändert von Samhayne (07.02.2010 um 13:12 Uhr).
Samhayne ist offline   Mit Zitat antworten
Alt 07.02.2010, 15:43  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 993
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Ohne die Results entgegenzunehmen kommst du hier nicht weiter. Probier mal folgendes:
PHP-Code:
$mysqli->multi_query($query);
do {
  
$mysqli->use_result()->close();
} while (
$mysqli->next_result()); 
__________________
Frank ist offline   Mit Zitat antworten
Alt 07.02.2010, 19:02  
Neuer Benutzer
 
Registriert seit: 22.01.2010
Beiträge: 25
PHP-Kenntnisse:
Fortgeschritten
Samhayne befindet sich auf einem aufstrebenden Ast
Standard

Da's nur updates sind, liefern die Querys nur True zurück.
Drum gibt's auch nix zu closen.

Schon prozedural probiert heute morgen...

Hab's nun auch mal so reingehackt...

Zitat:
Fatal error: Call to a member function close() on a non-object in C:\_web\myserver.dev\public_html\Matt TV\_test2.php on line 212
True->close() ... das mag er wohl nicht.

Und mit next_result acker ich das Ding ja schon durch...
Funktioniert dann zwar... aber wie gesagt... irgendwie macht das den multi query für mich absurd,
da für jedes next nochmal die db kontaktiert zu werden scheint um (in dem Fall) das TRUE abzuholen.
Samhayne ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Menü ein - und ausklappen abdullah JavaScript, Ajax und mehr 8 27.02.2010 23:54
eintrag nur wählen wenn zugehöriger eintrag in anderer tabelle. Trallalla Datenbanken 5 28.01.2010 10:16
2 <form> überschneiden sich... voda HTML, Usability und Barrierefreiheit 16 06.08.2009 11:35
Array eintrag für Eintrag durchgehen und jeweils Feld hinzufügen Stephan_87 PHP Tipps 2009 3 12.02.2009 19:23
Sortierreihenfolge nach Eintrag oder letzter Änderung leuktra Datenbanken 7 29.01.2007 19:20
UPDATE eintrag falls vorhanden ansonsten INSERT Plague Datenbanken 4 19.01.2007 13:36
[Erledigt] 'Sender:' Eintrag im Mailheader PHP-Fortgeschrittene 2 01.10.2006 17:00
Mysql Eintrag über mehrere Zeielne Eintrag funzt nicht PHP Tipps 2006 3 14.03.2006 19:38
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
PHP klappmenü PHP Tipps 2005-2 1 15.10.2005 00:31
Eintrag wird nicht eingetragen (Kontrollfunktion lügt?) PHP Tipps 2005-2 0 02.10.2005 12:00
Nächsten Eintrag in der mySQL DB auslesen Datenbanken 6 14.09.2005 13:24
[Erledigt] Chat aktualisieren bei neuem eintrag... PHP-Fortgeschrittene 2 24.04.2005 15:11
Wie kann ich den lezten Eintrag wieder auslesen? Pimbolie1979 Datenbanken 7 19.08.2004 10:49
Abfrage ob Eintrag schon in DBbevor Eintrag gespeichert wird Datenbanken 6 06.08.2004 22:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysqli_multi_query, php mysqli_multi_query, mysqli_multi_query(), was ist andhout?, mysqli_multi_query php, phpmyadmin unter myserver.dev einrichten, update mysqli_multi_query, mysqli_multi_query mysqli_error

Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum