Tipps zum Debuggen von MySQL-Queries in PHP

Yaslaw

alter Rempler
Moderator
Ahoi

Da fast täglich eine Frage zu MySQL-Queries-Fehler und PHP kommt, habe ich vor geraumer Zeit in meinem Wiki der Fehlerfindung mit SQL und PHP gewidmet.
Nun, da codoeren mir mehr liegt wie Texte schreiben, bin ich mir nicht wirklich sicher ob das Ding auch verständlich ist

http://wiki.yaslaw.info/wikka/PhpDebugMySqlQueries

Also, was fehlt da noch?
Was ist schlecht beschrieben?

Es geht nicht darum, einen ganzen Code mit mysql_real_escape_string etc zu machen, sondern wirklich nur eine Anleitung zur Frage "warum geht mein Query nicht?".

Thx im Voraus

Nachtrag:
Die endgültige Fassung kommt dann auch hier in die Tutorials....
 
So ich fang mal an:

Produktive Umgeung

Soll bestimmt "produktive Umgebung" heißen.

Unter Punkt 2 hast du z.B. geschrieben "...Dazu geben wir diesen mittels echo() aus..." und das echo() grau hinterlegt. Ich finde diese Stellen sind etwas schwer zu lesen. Vielleicht kannst du da eine andere Hintergrundfarbe nehmen!!

Unter Punkt 3 steht das man die darüberstehende Ausgabe kopieren und in phpMyAdmin einfügen soll. Wenn das jetzt ein wirklicher Anfänger liest, dann kopiert er vielleicht:

UPDATE myTable SET feld1 = test WHERE id = 15;
Unknown column 'test' in 'field list'

und damit erhält er dann wieder einen Fehler.

Dann schreibst du noch "...Geübte SQL-Leser sehen hier sofort den Fehler...". Ok, eigentlich ist die Fehlermeldung klar. Aber du könntest vielleicht trotzdem kurz darauf eingehen!!?

Ansonsten ist die Anleitung genau so ausführlich das man alles was wichtig ist erfährt und auf unnötiges verzichtet wird. Gut gemacht !

Gruß Thomas
 
Ich will auch.

Nun updated dieser Code aber nichts in der Datenbank und wir finden nicht heraus warum.
Schade! Eigentlich lese ich diesen Artikel doch, um dies herauszufinden. Was willst du uns jetzt damit sagen?

Zu 1) Report Error All

Als erstes ergänzen wir unseren Code mal um die Zeile
Warum?

Diese Zeile sollte wieder entfernt werden, bevor man in die Produktive Umgeung geht.
Das ist ein anderes Thema. Ein Verweis, z.B. auf das Handbuch wäre hilfreich, um nachzulesen, warum dies gemacht werden sollte: http://php.net/manual/de/security.errors.php .

Zu 2) Query-String testen

Syntaxfehler ;)

Geübte SQL-Leser sehen hier sofort den Fehler.
Bringt einen Anfänger jetzt auch nicht weiter. Vielleicht müsstest du noch ein paar typische Fehlerquellen aufzueigen. Fehlende Hochkommas, reservierte Wörter, ...

Ansonsten halte ich deinen Artikel für eine gute Idee, wenn man bald nur noch darauf zu verweisen braucht. :)

Gruß
 
Ich habe es aktuell so gehalten:

PHP:
	public function sql_query($query)
	{
	    $result = @mysql_query($query, $this->dbi);
	    if (mysql_errno() == 1146)
	    {
	    	die ('<p><h2>' . __SRC_NAME__ . ' v' . __SRC_VERSION__ . ' - Datenbank-Fehler</h2></p><p>Sorry, wir haben zur Zeit Probleme mit der Datenbank.</p><p>' . mysql_errno($this->dbi) . ': ' . mysql_error($this->dbi) . '</p>');
	    }
	    return $result;
	}
 
Ich danke euch schon mal für euer Feedback. Ich habe einige Dinge davon umgesetzt.

@bofh1337
Ist sicher auch eine interessante Art den Fehler auszugeben. Jedoch geht es mit im Artikel nicht darum einen Code zu schreiben der die Fehler Kundenfrreundlich abfängt, sondern um einen Fehler in einem generierten SQL zu finden.
Darum bin ich in meinem Artikel nicht weiter auf dein Input eingegangen, zumal __ SRC_NAME __ und __SRC_VERSION__ mir unbekannte Constanten sind.
 
Ich danke euch schon mal für euer Feedback. Ich habe einige Dinge davon umgesetzt.

@bofh1337
Ist sicher auch eine interessante Art den Fehler auszugeben. Jedoch geht es mit im Artikel nicht darum einen Code zu schreiben der die Fehler Kundenfrreundlich abfängt, sondern um einen Fehler in einem generierten SQL zu finden.
Darum bin ich in meinem Artikel nicht weiter auf dein Input eingegangen, zumal __ SRC_NAME __ und __SRC_VERSION__ mir unbekannte Constanten sind.

So viel ich noch in Erinnerung habe, wird beim auftreten eines Fehlers gleich gesagt, das Field XY nicht vorhanden ist.....die Konstanten sind eigentlich nur Script-Intern bei mir verfügbar Script-Name und Script-Version ;)
 
Zurück