Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

[PHP][MySQLi] Debug Queries

Ein kleines Tutorial wie man einfach SQL-Scripte in PHP mit MySQLi debuggen kann. Dieses Tutorial funktioniert NICHT mit prepared Statements

Ausgangslage

Immer und immer wieder kommt man an den Punkt, dass ein in PHP zusammengesetztes Query nicht das macht was man will. Darum hier mal eine Anleitung, damit ich sie nicht immer wieder schreiben muss. Wir haben einen einfachen Code, der ein Update auf die Datenbank macht. Nun updated dieser Code aber nichts in der Datenbank und wir finden noch nicht heraus warum. In der folgenden Anleitung werden wir anhand dieses Beispiels sehen wie man eine einfache Fehleranalyse durchführen kann um solche Probleme zu lösen.

Object oriented style
<?php
    $db = new mysqli('localhost', 'root', '', 'test');
 
    $value = 'test';
    $where = 6;
    $sql  = "UPDATE myTable SET feld_1 = {$value}  WHERE id = {$where};";
	$db->query($sql);
	echo $db->affected_rows;
?>
Procedural style
<?php
    $db = mysqli_connect('localhost', 'root', '', 'test');
 
	$value = 'test';
	$where = 6;
	$sql  = "UPDATE myTable SET feld_1 = {$value}  WHERE id = {$where};";
	mysqli_query($db, $sql);
	echo mysqli_affected_rows($db);
?>

Lösung

Report Error All

Als erstes ergänzen wir unseren Code mal um die folgende Zeile um uns alle Fehlermeldungen auszugeben.

error_reporting(E_ALL);
ini_set('display_errors', 1);
Danke an saftmeister vom Tutorial.de-Forum für den Hiwenis auf ini_set('display_errors', 1):
Seit PHP 5.sonstwas sind die empfohlenen Einstellungen, das display_errors auf 0 steht und log_errors auf 1. Folglich landen die Fehler nicht im Browser sondern in den Webserver-Logs.

Anschliessend testen wir erneut und schauen ob eine Sinnvolle Fehlermeldung erscheint.

Object oriented style & Procedural style
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
...
?>

Diese Zeile sollte wieder entfernt werden, bevor man in die produktive Umgebung geht. Mehr dazu findest du in der PHP-Doku ? http://php.net/manual/de/security.errors.php

Query-String ausgeben

Führte der erste Schritt noch nicht zu einem Resultat, so können wir noch den generierten Query-String testen. Dazu geben wir diesen mittels echo() aus (Nicht das Result von mysqli_query, sondern den zusammengesetzten Query-String). Zudem versuchen wir noch die Fehlermeldung herauszukriegen. Wir erweitern also das mysqli_query() um die Errorausgabe mysqli_error() .

Object oriented style
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    $db = new mysqli('localhost', 'root', '', 'test');
    $value = 'test';
	$where = 6;
	$sql  = "UPDATE myTable SET feld_1 = {$value}  WHERE id = {$where};";
    echo "{$sql}
\n"; $db->query($sql) or die($db->error); echo $db->affected_rows; ?>
Procedural style
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    $db = mysqli_connect('localhost', 'root', '', 'test');
    $value = 'test';
    $where = 6;
    $sql  = "UPDATE myTable SET feld_1 = {$value}  WHERE id = {$where};";
    echo "{$sql}
\n"; mysqli_query($db, $sql) or die(mysqli_error()); echo mysqli_affected_rows($db); ?>

In der Ausgabe erscheint dann etwa das Folgende: Unser SQL und eine Fehlermeldung

UPDATE myTable SET feld_1 = test WHERE id = 6;
Unknown column 'feld_1' in 'field list'

So haben wir eine Fehlermeldung die etwas aussagt und das SQL, wie es an die Datenbank abgesetzt wird. Mit diesen Informationen können andere Programmierer in Foren etc. besser helfen als 'nur' mit der Meldung 'Es geht nicht'. Geübte SQL-Leser sehen hier sofort den Fehler. test ist natürlich kein Feld sondern ein String und sollte in '…' gesetzt werden.

Testen mit phpMyAdmin

Um das Sql zu verfeinern und zu testen kann man dieses nun aus der Ausgabe kopieren und mit phpMyAdmin oder einem anderen Tool für MySQL testen und anpassen bis es funktioniert. Das funktionierende SQL anschliessend wieder zurück in den PHP-Code implentieren Unser korrigiertes und getestete SQL sieht dann so aus

UPDATE myTable SET feld_1 = 'test'  WHERE id = 6;

Korrektur einpflegen

Zum Schluss müssen wir nur noch das error_reporting() sowie unser echo() wieder entfernen und unseren koriggiertes SQL in den Code einpflegen. Und so sieht dann der funktionierende Code aus

Object oriented style
<?php
    $db = new mysqli('localhost', 'root', '', 'test');
    $value = 'test';
	$where = 6;
	$sql  = "UPDATE myTable SET feld_1 = '{$value}''  WHERE id = {$where};";
	$db->query($sql) or die($db->error);
	echo $db->affected_rows;
?>
Procedural style
<?php
    $db = mysqli_connect('localhost', 'root', '', 'test');
    $value = 'test';
    $where = 6;
    $sql  = "UPDATE myTable SET feld_1 = '{$value}'  WHERE id = {$where};";
    mysqli_query($db, $sql) or die(mysqli_error($db));
    echo mysqli_affected_rows($db);
?>
Quelle http://wiki.yaslaw.info

Add Comment

* Required information
1000
Powered by Commentics

Comments (0)

No comments yet. Be the first!