Mysql-Query liefert inkonsistente Ergebnisse
Herzlicher
- php
Hallo,
zum ersten Mal ist mir passiert, was ich für unmöglich hielt: Eine mysql-Query, die im PHP-Code ausgeführt (mit mysqli_query) zu keinen Ergebnissen führt, aber unter phpmyadmin getestet 4 Suchergebnisse liefert.
Es handelt sich um Webspace bei 1&1 und es sind PHP und Mysql 5.x verfügbar.
Kann mir jemand einen Tipp geben, worin diese Inkonsistenz begründet sein kann?
Bin für jeden guten Rat dankbar.
VG
Herzlicher
Hi,
zum ersten Mal ist mir passiert, was ich für unmöglich hielt: Eine mysql-Query, die im PHP-Code ausgeführt (mit mysqli_query) zu keinen Ergebnissen führt, aber unter phpmyadmin getestet 4 Suchergebnisse liefert.
Es handelt sich um Webspace bei 1&1 und es sind PHP und Mysql 5.x verfügbar.Kann mir jemand einen Tipp geben, worin diese Inkonsistenz begründet sein kann?
Ueberprueft, ob beide Queries _wirklich_ identisch sind?
Umgebung geprueft? Verbindungs-spezifische Einstellungen wie Charset, Collation etc., die gerade bei Vergleichen in WHERE-Klauseln das Zuenglein an der Waage sein koennten ...
MfG ChrisB
Danke für die schnelle Antwort.
1. Queries sind gleich, habe in beide Richtungen kopiert und es klappte immer bei phpmyadmin und im eigenen php-code nicht.
2. Gibt es verbindungsspezifische Einstellungen für charset und collation? Es handelt sich in der Tat um eine Where-Klausel, in der ein deutsches Wort mit Umlaut enthalten ist. Kannst Du mir auf die Sprünge helfen, wo ich diese Verbindungseinstellungen vornehme? Ich verwende ein Standardfunktion zur Herstellung der mysql-Verbindung von php aus. Ich wusste nur, dass man host-adresse, user, passwort und datenbank angeben kann sowie den port. Außerdem ist bei mir noch ein Eintrag "/tmp/mysqld.sock" als letztes Argument in der mysqli_connect Funktion. Wo kann man noch ansetzen?
VG
Hallo,
zu 1. fällt mir spontan nichts ein außer das du eventuell nicht die SQL-Abfragen aus PhpMyAdmin direkt in dein PHP-Skript einfügen solltest. PhpMyAdmin bietet nicht umsonst die "Erstelle PHP-Code"-Funktion an.
Sind deine Verbindungseinstellungen korrekt hinsichtlich Verbindungsdaten? Was sagt mysql_error()? Versuch dein Skript mit folgenden Zeilen zu debuggen:
<?php
error_reporting(E_ALL|E_STRICT);
/* mysql-verbindung */
$result = mysqli_query("select-abfrage") or die(mysql_error());
?>
Das sollte dir eine Fehlermeldung liefern, falls die Query fehlschlägt.
- Gibt es verbindungsspezifische Einstellungen für charset und collation?
Eine Methode gibt es soweit ich weiss für mysqli nicht mehr (mysql wäre es mysql_set_charset). Aber du kannst bevor jeglicher Query an den Server eine das Character Set ändern via: mysqli_query("SET NAMES utf8"). Wichtig ist das UTF8 ohne "-" geschrieben wird.
Somit ist für deine gesamte Laufzeit utf8 als Charset eingestellt (es sei denn es wird überschrieben mit anderen Werten).
Wie immer vielen Dank für's Lesen.
Mit freundlichem Gruß,
Rene Schindhelm
Uhh meinen Post bitte ignorieren. Ich sollte mal auf die Uhr schauen... Zeit zum schlafen =)
Mit freundlichem Gruß,
Rene Schindhelm
Mit der Zeile
mysqli_query($db_link,"SET character_set_client = 'utf8'") or die("MySQL error: ".mysqli_error($db_link));
ist das Problem gelöst und Mysql-Abfragen berücksichtigen Umlaute korrekt.
phpmyadmin führt diese Einstellung wohl bei jeder Ausführung durch.
echo $begrüßung;
mysqli_query($db_link,"SET character_set_client = 'utf8'") or die("MySQL error: ".mysqli_error($db_link));
ist das Problem gelöst und Mysql-Abfragen berücksichtigen Umlaute korrekt.
SET character_set_client stellt nur die Kodierung für den Hinweg zum MySQL-Server ein. Normalerweise will man für den Rückweg die selbe Kodierung verwenden. SET NAMES ist dann das bessere Statement. Und da du mysqli verwendest wäre der allerbeste Weg die Verwendung der Funktion mysqli_set_charset().
echo "$verabschiedung $name";
Hallo dedlfix,
wenn ich set names benutze, werden umlaute aus der datenbank falsch angezeigt.
mit meiner variante umgehe ich das problem.
bleibt nur die frage, warum bei einheitlicher kodierung (hinweg/rückweg) einmal gewünschte, einmal ungewünschte ergebnisse herauskommen.
wurden die daten evtl. mit der falschen kollation in die datenbank eingelesen? oder wie kann man das problem beheben und eine einheitliche kodierung haben, bei der input und output stimmen?
echo $begrüßung;
wenn ich set names benutze, werden umlaute aus der datenbank falsch angezeigt.
mit meiner variante umgehe ich das problem.
Da läuft etwas grundlegend verkehrt. Zeigt der phpMyAdmin alle Umlaute richtig an? Die schon vorhandenen und eventuell neu hinzugefügte?
Wenn mit dem phpMyAdmin alles richtig angezeigt wird, kann man davon ausgehen, dass die Daten entsprechend der eingestellten Feldkodierung in der DB abgelegt sind. Wenn nicht, gibt es Korrekturbedarf. Der ist davon abhängig, was konkret für falsche Zeichen angezeigt werden.
Für die Zusammenarbeit mit MySQL ab Version 4.1 ist es immer empfehlenswert, die zu verwendende Zeichenkodierung explizit einzustellen. Wichtig sind dabei die Angaben für die einzelnen Felder und die für die Client-Verbindung. Von der Feld-Kodierung hängt ab, welche Zeichen gespeichert werden können. Die Kodierungsangabe der Client-Verbindung definiert die für die Übertragung zu verwendende Kodierung, also in welcher Kodierung man mit MySQL zu sprechen gedenkt und wie man die Daten zurückhaben möchte. MySQL wandelt selbständig zwischen unterschiedlichen Kodierungen hin und her, was aber prinzipbedingt nur dann fehlerfrei geht, wenn mit der Zielkodierung das entsprechende Zeichen dargestellt werden kann.
echo "$verabschiedung $name";