nicht abgeschlossene Zeichenfolge
kati
- javascript
0 Christoph Schnauß- programmiertechnik
0 kati0 kati0 kati
0 Sönke Tesch0 kati
0 Sönke Tesch
Hallo,
ich habe ein Problem.
Also nicht herum labern, da ist die Beschreibung:
ich habe ein paar php-Klassen, diese generieren verschiedene Meldungen, unter diesen auch mysql-Fehlermeldungen. So ne meldung kann so aussehen:
Ein Datenbankfehler ist aufgetreten => 1064: You have an error in your SQL syntax near ''x','y','z'))' at line 2
gut, jetzt wenn ich es in ein select einlesen möchte, bekomme ich ne Meldung: nicht abgeschlossene Zeichenfolge. Dass ich die sämlichen "'" und überflüssigen ")" oder "(" entfernen muss ist schon klar, obwohl ich damit nicht einverstanden bin, weil es für den user nicht mehr verständlich sein mag.
Ausserdem muss ich anscheinend auch "" wegtun - da kommt ne Meldung "hexadezimaler Wert erwartet". Wie soll ich es anstellen, dass es javascript in das select-html-Element einlesen kann, also dass die Zeichenfolge nur gültige Zeichen enthält ?
danke im voraus.
cu kati
hallo kati,
ich habe ein paar php-Klassen, diese generieren verschiedene Meldungen, unter diesen auch mysql-Fehlermeldungen. So ne meldung kann so aussehen:
Ein Datenbankfehler ist aufgetreten => 1064: You have an error in your SQL syntax near ''x','y','z'))' at line 2
Das hat (bisher jedenfalls) überhaupt nichts mit Javascript zu tun. Die Fehlermeldung verweist dich auf "SQL-Syntax" Zeile 2, und was steht denn da drin in dieser Zeile? Außerdem: wo steht diese Fehlermeldung - In deiner php_error.log ?
gut, jetzt wenn ich es in ein select einlesen möchte
welches "es" möchtest du in ein "select" einlesen, bzw. was soll es dir bringen, Fehlermeldungen über eine select-box auslesen zu wollen - wie kommen die Fehlermeldugen überhaupt in die select-box?
bekomme ich ne Meldung: nicht abgeschlossene Zeichenfolge
Diese Fehlermeldung (übrigens: wer gibt sie aus?) ist relativ häufig und glücklicherweise in der Regel recht präzise. Man muß sie meistens nur wörtlich nehmen und findet dann oft eine fehlende schließende Klammer oder etwas Ähnliches.
Dass ich die sämlichen "'" und überflüssigen ")" oder "(" entfernen muss ist schon klar
sofern es sich tatsächlich um "überflüssige" Zeichen handelt, mag das klar sein. Wahrscheinlicher scheint aber, daß deine Klammern nicht "überflüssig", sondern bloß nicht "geschlossen" sind.
obwohl ich damit nicht einverstanden bin, weil es für den user nicht mehr verständlich sein mag.
Ob du einverstanden bist oder nicht, ist sowohl dem Server, auf dem deine Seiten liegen, wie auch dem möglichen user völlig wurscht. Bloß: was soll jetzt für den user nicht mehr verständlich sein? Klammern des Quellcodes bekommt er eh nicht zu sehen.
Ausserdem muss ich anscheinend auch "" wegtun - da kommt ne Meldung "hexadezimaler Wert erwartet".
Da hast du dann wahrscheinlich die "nicht abgeschlossene Zeichenfolge". Nein, dein Fehler liegt wahrscheinlich nicht bei den Klammern und Backslashes, sondern irgendwoanders. Aber darüber kann man erst weiterreden, wenn du wenigstens die problematischen Teile deienes Codes mal zur Kenntnis gibst.
Wie soll ich es anstellen, dass es javascript in das select-html-Element einlesen kann, also dass die Zeichenfolge nur gültige Zeichen enthält ?
Javascript kann sowieso und soll bestimmt auch nix in irgendeine "select"-box einlesen. Du kannst allerdings in dein HTML-Dokument hineinschreiben, daß ein Besucher deiner Seite mit der Anwahl bzw. dem Anklicken eines "select"-Eintrags ein PHP-Script starten soll. Wenn es dann Fehlermeldungen gibt, kann das, was diese Fehlermeldung hervorruft
Grüße aus Berlin
Christoph S.
ich entschuldige mich erstmal für die unverständliche Fehlerbeschreibung.
Es hat überhaupt nichts mit php und mysql zu tun. eine Klassenmethode v. php liefert einen string zurück. das wars. und der string schaut so aus, wie ich ihn schon beschrieben habe. die erwähnte javascript-Funktion wird innerhalb v. php aufgerufen.
Es handelt sich um einen javascript mysql-Editor, dass automatisch eine mysql-Anweisung generiert. Es funzt alles super. Das Editor ist aber noch nicht fertig und ich habe noch ein paar Probleme bei komplexeren Abfragen zu beheben. Mein Problem bezieht sich aber nicht auf die Datenbank, nicht auf php, sondern auf javascript. Die javascriptfunktion für das Einlesen (also Ausgabe von Meldungen in ein Statusfenster (select) - ob alles ok ist, oder ein Fehler aufgetreten ist) wird also innerhalb v. php aufgerufen. Der php-Code ist nicht besonders wichtig, bitte die Klasse Status beachten
Der Code:
------------------------------------------------------
//die javascriptfunktion in der Datei functions.js
function status_zeigen(status) {
var position = null;
//testen, ob es gibt
if (document.getElementsByName("status_fenster") == null) return;
position = document.getElementsByName("status_fenster")[0].length;
var status_Zeile = document.createElement("option");
status_Zeile.text = status;
document.getElementsByName("status_fenster")[0].add(status_Zeile, position+1);
}
------------------------------------------------------
//php-Datei t_create.php
<script language="Javascript" src="functions.js" type="text/javascript"></script>
<?php
include_once "mysql.inc";
$c = new Connection("localhost", $_SESSION["kennung"], $_SESSION["password"]);
$s = new Status();
$d = new Database();
$t = new Table();
$d->set_db($c->get_conn(), $_SESSION["current_db"]);
$t->create_table($c->get_conn(), $_POST["sql"]);
//nur Meldungen für die DB-Operation bzgl. Tabelle werden eingefügt.
$s->set_st($t->get_info());
//session-Variable, die die Meldungen beinhält
if (!session_is_registered("meldung")) session_register("meldung");
//falls sich schon etwas in der "meldung" befindet, soll status angehängt werden
$_SESSION["meldung"] = array_merge($_SESSION["meldung"], $s->get_st());
//alle Meldungen in ein Select einlesen:
//Die javascript-Fehlermeldung sagt eindeutig, dass es sich da um eine nichtabgeschlossene Zeichenkette handelt und zwar passiert es genau auf dieser Stelle !
while (list($k, $v) = each($_SESSION["meldung"])) {
echo "<script language="JavaScript">\n";
echo "status_zeigen('$v');\n";
echo "</script>";
}
?>
--------------------------------------------------------
//mysql.inc
/*Klasse Status macht nichts anderes, als die Meldungen aller
anderen Klassen (Connection, Database, Table) zu übernehmen und zu
verwalten. */
class Status {
var $st;
function Status() {
$this->st = array();
}
//der übergebene Wert $a_st ist auch ein Array
function set_st($a_st) {
while(list($k, $v) = each($a_st)) {
/*da die Fehlermeldung in der javascript auftrat, muss evident hier
irgendwas falsch sein. Ausserdem muss ich die ganzen "" anscheinend
auch entfernen (es ist nur eine Beispielfehlermeldung auf die ich
beim Testen gestossen habe und tritt auf, wenn ich versuche ENUM
('x', 'x', 'z') auszuführen (also beim Anlegen der Tabelle). Jetzt
interessiert mich aber nicht wieso der DB-Fehler auftritt, sondern
wieso javascript dies nicht einlesen kann, weil da spezielle
Zeichen wie (,),', oder \ enthalten sind.*/
$temp = str_replace(")", "", $a_st);
$temp = str_replace("(", "", $temp);
$temp = str_replace("'", "", $v);
$a_st[$k] = $temp;
}
$this->st = array_merge($this->st, $a_st);
}
function get_st() {
return $this->st;
}
}
Ich hoffe jetzt habe ich es besser erklärt.
gruss kati
aaaaaaah, sorry, ich habe mich da vertippt, weil ich den Code beim Schreiben des Threads direkt geschrieben habe (habe aus der klasse schon gelöscht gehabt) und nicht mehr getestet.
//in der Methode set_st
$temp = str_replace(")", "", $v);
$temp = str_replace("(", "", $temp);
$temp = str_replace("'", "", $temp);
$a_st[$k] = $temp;
cu kati
ich entschuldige mich erstmal für die unverständliche Fehlerbeschreibung.
Es hat überhaupt nichts mit php und mysql zu tun. eine Klassenmethode v. php liefert einen string zurück. das wars. und der string schaut so aus, wie ich ihn schon beschrieben habe. die erwähnte javascript-Funktion wird innerhalb v. php aufgerufen.
Es handelt sich um einen javascript mysql-Editor, dass automatisch eine mysql-Anweisung generiert. Es funzt alles super. Das Editor ist aber noch nicht fertig und ich habe noch ein paar Probleme bei komplexeren Abfragen zu beheben. Mein Problem bezieht sich aber nicht auf die Datenbank, nicht auf php, sondern auf javascript. Die javascriptfunktion für das Einlesen (also Ausgabe von Meldungen in ein Statusfenster (select) - ob alles ok ist, oder ein Fehler aufgetreten ist) wird also innerhalb v. php aufgerufen. Der php-Code ist nicht besonders wichtig, bitte die Klasse Status beachten
Der Code:
//die javascriptfunktion in der Datei functions.js
function status_zeigen(status) {
var position = null;
//testen, ob es gibt
if (document.getElementsByName("status_fenster") == null) return;
position = document.getElementsByName("status_fenster")[0].length;
var status_Zeile = document.createElement("option");
status_Zeile.text = status;
document.getElementsByName("status_fenster")[0].add(status_Zeile, position+1);
}//php-Datei t_create.php
<script language="Javascript" src="functions.js" type="text/javascript"></script>
<?php
include_once "mysql.inc";
$c = new Connection("localhost", $_SESSION["kennung"], $_SESSION["password"]);
$s = new Status();
$d = new Database();
$t = new Table();
$d->set_db($c->get_conn(), $_SESSION["current_db"]);
$t->create_table($c->get_conn(), $_POST["sql"]);
//nur Meldungen für die DB-Operation bzgl. Tabelle werden eingefügt.
$s->set_st($t->get_info());
//session-Variable, die die Meldungen beinhält
if (!session_is_registered("meldung")) session_register("meldung");
//falls sich schon etwas in der "meldung" befindet, soll status angehängt werden
$_SESSION["meldung"] = array_merge($_SESSION["meldung"], $s->get_st());
//alle Meldungen in ein Select einlesen:
//Die javascript-Fehlermeldung sagt eindeutig, dass es sich da um eine nichtabgeschlossene Zeichenkette handelt und zwar passiert es genau auf dieser Stelle !
while (list($k, $v) = each($_SESSION["meldung"])) {
echo "<script language="JavaScript">\n";
echo "status_zeigen('$v');\n";
echo "</script>";
}
?>
//mysql.inc
/*Klasse Status macht nichts anderes, als die Meldungen aller
anderen Klassen (Connection, Database, Table) zu übernehmen und zu
verwalten. */
class Status {
var $st;
function Status() {
$this->st = array();
}
//der übergebene Wert $a_st ist auch ein Array
function set_st($a_st) {
while(list($k, $v) = each($a_st)) {
/*da die Fehlermeldung in der javascript auftrat, muss evident hier
irgendwas falsch sein. Ausserdem muss ich die ganzen "" anscheinend
auch entfernen (es ist nur eine Beispielfehlermeldung auf die ich
beim Testen gestossen habe und tritt auf, wenn ich versuche ENUM
('x', 'x', 'z') auszuführen (also beim Anlegen der Tabelle). Jetzt
interessiert mich aber nicht wieso der DB-Fehler auftritt, sondern
wieso javascript dies nicht einlesen kann, weil da spezielle
Zeichen wie (,),', oder \ enthalten sind.*/
$temp = str_replace(")", "", $a_st);
$temp = str_replace("(", "", $temp);
$temp = str_replace("'", "", $v);
$a_st[$k] = $temp;
}
$this->st = array_merge($this->st, $a_st);
}
function get_st() {
return $this->st;
}
}
Ich hoffe jetzt habe ich es besser erklärt.
gruss kati
es hat sich schon gelöst. Windows braucht zusätzlich noch die \r Sequenz entfernen. Zeilenumbruch besteht nämlich aus 2 Ascii Zeichen
Chr(10) + Chr(13), sowie auch im VB vbCrLf. Das wars. Vielen Dank.
$temp = str_replace("\r", "", $temp);
$temp = str_replace("\n", "", $temp);
gruss kati
//Die javascript-Fehlermeldung sagt eindeutig, dass es sich da um eine nichtabgeschlossene Zeichenkette handelt und zwar passiert es genau auf dieser Stelle !
while (list($k, $v) = each($_SESSION["meldung"])) {
echo "<script language="JavaScript">\n";
echo "status_zeigen('$v');\n";
echo "</script>";
}
Schön, ich hab gewonnen. Krieg ich jetzt einen Preis? ;)
Wie ich bereits geschrieben habe, macht man in solchen Fällen ganz einfach folgendes: Seite mit dem Javascript-Fehler aufrufen. Dann im Browser-Menü Ansicht->Seitenquelltext (o.ä.) auswählen, die anstößige Zeile
status_zeigen('blabla');
suchen und schauen, was da statt blabla steht, insbesondere solltest Du die Anführungszeichen beobachten.
Deiner ersten Beschreibung nach müsste diese Zeile so aussehen:
status_zeigen('Ein Datenbankfehler ist aufgetreten => 1064: You have an error in your SQL syntax near ''x','y','z'))' at line 2');
Das wird natürlich nix (zum dritten Mal: Anführungszeichen beachten, beachte jene nach "near" und vor "at").
Das sich Javascript nach Entfernen der einfachen Anführungszeichen über Hexadezimalwerte beschwert, ist auch nachvollziehbar:
near \x,\y,\z))
^^^
Hexwerte schreibt man zum Beispiel so: \x00.
Zur Problemlösung solltest Du Dir einfach überlegen, welche Anführungszeichen Du in Javascript verwenden möchtest (doppelte oder einfache) und diese dann mittels PHP.strtr() in den Fehlermeldungen durch die jeweils andere Sorte ersetzen. Zum Beispiel:
echo "status_zeigen("".strtr($v,""","'"). "");\n";
Mit den Klammern hat das übrigens nichts zu tun, Deine str_replace() kannst Du allesamt rausnehmen.
Ein Blick auf die PHP-Einstellungen für magic_quotes wäre IMHO auch sinnvoll, um eventuell die dusseligen '-Kombinationen aus der MySQL-Meldung rauszubekommen (obwohl ich mir jetzt nicht sicher bin, ob magic_quotes auch auf Fehlermeldungen wirkt).
Alternativ zum Ersetzen könnte auch eine PHP-Funktion wie addslashes() Abhilfe schaffen.
Gruß,
soenk.e
hallo !
vielen Dank. Ich bin schon draufgekommen, ich weiß schon, wo das Problem ist ! In Zeilenumbrüchen ! Ich habe nämlich alle spezielle Zeichen schon entfernt, dennoch kommt die Meldung. Dann habe ich einen substring aus der Fehlermeldung gemacht, um festzustellen, auf welcher Stelle der Fehler passiert, bzw. welches Zeichen JS nicht verdauen kann. Es ist ein Zeilenumbruch. Ja, natürlich schaue ich mir immer den Quellcode an (rechte Maustaste...). Ja da ist es ganz deutlich zu sehen.
Der Zeilenumbruch ist nach dem 3. KOmma, also:
status_zeigen('1064: You have an error in your SQL syntax near x,y,z,
');
Fehlermeldung: nicht abgeschlossene Zeichenfolgenkonstante.
dann habe ich versucht ganz normal die "\n" wegzutun:
function set_st($a_st) {
while(list($k, $v) = each($a_st)) {
$temp = str_replace(")", "", $v);
$temp = str_replace("(", "", $temp);
$temp = str_replace("'", "", $temp);
$temp = str_replace(Chr(92), "", $temp); // ""
$temp = str_replace("\n", "", $temp);
//mit $temp = str_replace("\n", "<br>", $temp);
$temp = substr($temp, 0, 55);
$a_st[$k] = $temp;
}
$this->st = array_merge($this->st, $a_st);
}
function get_st() {
return $this->st;
}
Das haut aber nicht hin. Also jetzt sind alle speziellen Zeichen (auch ein "") weg, es muss nur an dem Zeilenumbruch liegen, weil
$temp = substr($temp, 0, 54); (also um 1 Zeichen weniger) keinen Fehler verursacht.
Ehrlich gesagt, weiß ich nicht mehr, was ich tun soll *schäm*
cu kati
//Die javascript-Fehlermeldung sagt eindeutig, dass es sich da um eine nichtabgeschlossene Zeichenkette handelt und zwar passiert es genau auf dieser Stelle !
while (list($k, $v) = each($_SESSION["meldung"])) {
echo "<script language="JavaScript">\n";
echo "status_zeigen('$v');\n";
echo "</script>";
}
Schön, ich hab gewonnen. Krieg ich jetzt einen Preis? ;)
Wie ich bereits geschrieben habe, macht man in solchen Fällen ganz einfach folgendes: Seite mit dem Javascript-Fehler aufrufen. Dann im Browser-Menü Ansicht->Seitenquelltext (o.ä.) auswählen, die anstößige Zeile
status_zeigen('blabla');
suchen und schauen, was da statt blabla steht, insbesondere solltest Du die Anführungszeichen beobachten.
Deiner ersten Beschreibung nach müsste diese Zeile so aussehen:
status_zeigen('Ein Datenbankfehler ist aufgetreten => 1064: You have an error in your SQL syntax near ''x','y','z'))' at line 2');
Das wird natürlich nix (zum dritten Mal: Anführungszeichen beachten, beachte jene nach "near" und vor "at").
Das sich Javascript nach Entfernen der einfachen Anführungszeichen über Hexadezimalwerte beschwert, ist auch nachvollziehbar:
near \x,\y,\z))
^^^
Hexwerte schreibt man zum Beispiel so: \x00.
Zur Problemlösung solltest Du Dir einfach überlegen, welche Anführungszeichen Du in Javascript verwenden möchtest (doppelte oder einfache) und diese dann mittels PHP.strtr() in den Fehlermeldungen durch die jeweils andere Sorte ersetzen. Zum Beispiel:
echo "status_zeigen("".strtr($v,""","'"). "");\n";
Mit den Klammern hat das übrigens nichts zu tun, Deine str_replace() kannst Du allesamt rausnehmen.
Ein Blick auf die PHP-Einstellungen für magic_quotes wäre IMHO auch sinnvoll, um eventuell die dusseligen '-Kombinationen aus der MySQL-Meldung rauszubekommen (obwohl ich mir jetzt nicht sicher bin, ob magic_quotes auch auf Fehlermeldungen wirkt).
Alternativ zum Ersetzen könnte auch eine PHP-Funktion wie addslashes() Abhilfe schaffen.
Gruß,
soenk.e
vielen Dank. Ich bin schon draufgekommen, ich weiß schon, wo das Problem ist ! In Zeilenumbrüchen !
Mist, doch kein Preis ;)
Der Zeilenumbruch ist nach dem 3. KOmma, also:
status_zeigen('1064: You have an error in your SQL syntax near x,y,z,
');
Wie kommt da noch ein Komma hin? In Deinem ersten Beispiel waren's nur drei Parameter, x, y und z. Lautet Deine Parameterliste jetzt x,y,z,n?
Aber egal, was ich nicht kapiere ist, wo der Zeilenumbruch herkommt. Du filterst sie doch schon mit
$temp = str_replace("\n", "", $temp);
raus, insofern kann da kein Zeilenumbruch drin sein.
Nimm doch nochmal die ganzen str_replace() raus und ersetze
echo "status_zeigen('$v');\n";
durch
echo "status_zeigen("".addslashes($v)."");\n";
oder eine Variante mit addcslashes(). Damit solltest Du schonmal die Probleme mit den Rückstrichen beseitigt haben. Das Rausfiltern sollte jedenfalls unnötig sein.
Funktioniert es dann noch nicht, versuche, vereinzelte \n-Guerillias mit str_replace() zu eliminieren.
Lass Dir in Deiner Status-Klasse am Anfang und am Ende von set_st() eventuell den Inhalt von $a_st per var_dump() in einem <pre>-Block (Wichtig, sonst gehen Zeilenumbrüche bei der Anzeige im Browser verloren!) ausgeben, um zurückzuverfolgen, wo die Zeilenumbrüche herkommen.
Gruß,
soenk.e
ich habe ein paar php-Klassen, diese generieren verschiedene Meldungen, unter diesen auch mysql-Fehlermeldungen. So ne meldung kann so aussehen:
Ein Datenbankfehler ist aufgetreten => 1064: You have an error in your SQL syntax near ''x','y','z'))' at line 2
gut, jetzt wenn ich es in ein select einlesen möchte, bekomme ich ne Meldung: nicht abgeschlossene Zeichenfolge. Dass ich die sämlichen "'" und überflüssigen ")" oder "(" entfernen muss ist schon klar, obwohl ich damit nicht einverstanden bin, weil es für den user nicht mehr verständlich sein mag.
Ausserdem muss ich anscheinend auch "" wegtun - da kommt ne Meldung "hexadezimaler Wert erwartet". Wie soll ich es anstellen, dass es javascript in das select-html-Element einlesen kann, also dass die Zeichenfolge nur gültige Zeichen enthält ?
Wie auch schon Herr Schnauß aus Berlin bin auch ich etwas rat- und hilflos ob Deiner Fehlerbeschreibung, hauptsächlich, weil Du vergessen hast, das fehlerhafte Objekt mitzuliefern. Versuche mal, in einer Autowerkstatt ein Auto reparieren zu lassen, obwohl Du das Auto garnicht mitgebracht hast und dem Mechaniker nur die Worte "Es macht nur tuck-tuck-krrrst-peng und daß ich am Nippel ziehen muß, ist mir klar" in's Ohr säuseln kannst.
Der Mechaniker wird Dir dann vielleicht raten, etwas Öl nachzufüllen. Entsprechend in's Blaue hinein rate ich Dir, auf Deine Daten eventuell Funktionen wie mysql_escape_string() oder htmlentities() (PHP) oder escape() (Javascript) auszuprobieren.
Wenn es sich um eine Javascript-Fehlermeldung handelt (was man nach Deiner Beschreibung auch nur vermuten kann): Jeder Browser gibt Dir eine Zeilennummer zur Fehlermeldung. Schau Dir den Quelltext im _Browser_ mal an und zähle die Anführungszeichen. Bei einem Javascript-Fehler wirst Du mit einer Suche im PHP-Quelltext nicht viel erreichen, weil der Browser den PHP-Quelltext nie zu sehen bekommt, sondern nur die HTML-Ausgabe des PHP-Skriptes. Somit existiert auch der gemeldete (!) Fehler nur in dem, was der Browser vorliegen hat und nicht im PHP-Code. Die Ursache für diesen Fehler ist allerdings sicherlich wieder im PHP-Skript zu finden.
In freudiger Erwartung einer Gewinnbenachrichtigung,
Gruß,
soenk.e