MySql-Anfrage ergibt als Ergebnis bool false. Wo ist der Fehler?
Jo
- datenbank
0 ChrisB0 Sven Rautenberg0 Jo0 Sven Rautenberg0 Jo
0 Jo0 ChrisB
0 Gelöst
Jo
Hallo! Das folgende funktioniert immerhin soweit, als dass es keinen Abbruch durch einen Fehler gibt. Erst $result = mysql_query($sql); ergibt als Wert bool false.
Ist in den folgenden Zeilen ein Fehler? Oder wenn nicht, woran könnte es liegen?
Grüße
Jo
$sql = "INSERT INTO ".$GLOBALS["mysql\_db"]."
.Artikel
(Nr
,Titel
,Teaser
,Einleitung
,Haupttext
,ErstelltDatumUhrzeit
,FreiAbDatumUhrzeit
)
VALUES ('1', $mP_titel , $mP_teaser , $mP_einleitung , $mP_haupttext , NOW( ) , NOW( ) );";
$link = mysql_connect($GLOBALS["mysqlhost"], $GLOBALS["mysqluser"], $GLOBALS["mysqlpasswort"])
OR die(mysql_error());
$db_selected = mysql_select_db($GLOBALS["mysql_db"], $link);
if (!$db_selected) {
die ('Kann '.$GLOBALS["mysql_db"].' nicht benutzen : ' . mysql_error());
}
$result = mysql_query($sql);
var_dump ($result); // Gibt bool false aus
mysql_free_result($result);
mysql_close($link);
Hi,
Das folgende funktioniert immerhin soweit, als dass es keinen Abbruch durch einen Fehler gibt. Erst $result = mysql_query($sql); ergibt als Wert bool false.
Ist in den folgenden Zeilen ein Fehler?
Ja - du fragst die Datenbank nach dem Fehler nicht mal mehr, was die Ursache war.
Nutze auch an der Stelle mysql_error.
MfG ChrisB
Moin!
Ist in den folgenden Zeilen ein Fehler? Oder wenn nicht, woran könnte es liegen?
mysql_error() sagt dir, was die Datenbank an deinem Query nicht toll findet. Das solltest du immer aufrufen als minimale Fehlerbehandlung, wenn mysql_query false zurückgibt.
Aber ich rate mal: Die Datenbank bemängelt, dass die Inhalte der ganzen $mp...-Variablen nicht in Anführungszeichen stehen, und ich bemängele, dass diese Variablen keinerlei Escaping unterzogen werden.
mysql_real_escape_string() gehört auf jeden Inhalt angewendet, den du in den Query-String reinschreiben willst! Ansonsten machst du dich anfällig für SQL-Injection.
- Sven Rautenberg
Moin!
Ist in den folgenden Zeilen ein Fehler? Oder wenn nicht, woran könnte es liegen?
mysql_error() sagt dir, was die Datenbank an deinem Query nicht toll findet. Das solltest du immer aufrufen als minimale Fehlerbehandlung, wenn mysql_query false zurückgibt.
Aber ich rate mal: Die Datenbank bemängelt, dass die Inhalte der ganzen $mp...-Variablen nicht in Anführungszeichen stehen, und ich bemängele, dass diese Variablen keinerlei Escaping unterzogen werden.
mysql_real_escape_string() gehört auf jeden Inhalt angewendet, den du in den Query-String reinschreiben willst! Ansonsten machst du dich anfällig für SQL-Injection.
- Sven Rautenberg
mysql_error ergab tatsächlich den Fehler bei der ersten $mP_... Variablen
var_dump ergabe: string(42) "Unknown column 'testtitel' in 'field list'"
Wenn ich die $mP_...Vars durch Strings ersetze, also z.B. gleich $mP_titel durch 'testtitel' klappt alles.
Welche Anführungszeichen muss ich denn jetzt hier verwenden?
Die Vorlage für das INSERT habe ich aus phpMyAdmin, und dann angepaßt, nur bei den Anführungszeichen ist es mir jetzt nicht klar, welche ich da noch verwenden soll?
Als Escape verwende ich:
$mP_titel = htmlentities(nl2br($GLOBALS["mP_titel"]),ENT_QUOTES);
usw....
Geht das auch? Oder erfaßt das nicht alle gefährlichen Zeichen?
Danke für alle Antworten schon mal!
Grüße
Jo
Moin!
mysql_error ergab tatsächlich den Fehler bei der ersten $mP_... Variablen
var_dump ergabe: string(42) "Unknown column 'testtitel' in 'field list'"
Wenn ich die $mP_...Vars durch Strings ersetze, also z.B. gleich $mP_titel durch 'testtitel' klappt alles.
Welche Anführungszeichen muss ich denn jetzt hier verwenden?
Genau die, die du erwähnt hast. Lass dir den erzeugten SQL-String mal ausgeben, dann siehst du, was bei der Datenbank ankommt, und siehst auch den Unterschied zu der Variante mit festen Strings.
Die Vorlage für das INSERT habe ich aus phpMyAdmin, und dann angepaßt, nur bei den Anführungszeichen ist es mir jetzt nicht klar, welche ich da noch verwenden soll?
Als Escape verwende ich:
$mP_titel = htmlentities(nl2br($GLOBALS["mP_titel"]),ENT_QUOTES);
usw....
Geht das auch? Oder erfaßt das nicht alle gefährlichen Zeichen?
Nein, das geht nicht.
htmlentities() ist sowieso überflüssig, htmlspecialchars() reicht vollkommen aus, denn egal welche Zeichencodierung du verwendest: Du kriegst sowieso nur solche Zeichen zurück, die in dieser Codierung enthalten sind, so dass du dafür keine besonderen Entities benötigst für Zeichen, die in der Codierung nicht darstellbar wären.
Allerdings: htmlspecialchars() wird angewendet, wenn man aus der Datenbank etwas ausgelesen hat und es jetzt in HTML ausgeben will - also so, dass die Zeichen nicht als HTML wirksam werden, sondern exakt so angezeigt werden, wie sie im Text enthalten sind.
Deshalb ist deine Platzierung von nl2br() auch falsch. Die gehört NACH htmlspecialchars() angewendet. Aber ebenfalls erst bei der Ausgabe der Daten.
Das korrekte Escaping für das Schreiben in die Datenbank erledigt mysql_real_escape_string(), wie schon erwähnt.
- Sven Rautenberg
Welche Anführungszeichen muss ich denn jetzt hier verwenden?
Genau die, die du erwähnt hast. Lass dir den erzeugten SQL-String mal ausgeben, dann siehst du, was bei der Datenbank ankommt, und siehst auch den Unterschied zu der Variante mit festen Strings.
OK. Das klappt jetzt. Die Einträge landen jetzt in der Datenbank.
Wie ist das mit den verschiedenen Anführungszeichen: " ' ´ Kann man die alle miteinander verschachteln? Ich kann mich nicht erinnern, ob phpmyadmin vor ein paar Jahren, als ich es das letzt mal verwendet habe, die SQL-Strings auch mit
geschrieben hat.
htmlentities() htmlspecialchars() ...
Da muss ich nochmal nachlesen, was was ist.
Das korrekte Escaping für das Schreiben in die Datenbank erledigt mysql_real_escape_string(), wie schon erwähnt.
Das muß ich zwar auch nochmal nachlesen, aber ich verstehe das jetzt so:
mysql_real_escape_string() muss man nur beim Schreiben in die Datenbank verwenden. Beim Lesen kommt dann wieder der originale String als Ergebnis?
Vielen Dank schon mal für die Hilfe beim Fehlerfinden! (Auch an Chris B!)
Grüße
Jo
P.S. Sind die von phpMyAdmin angezeigten Anführungszeichen >`< gleichwertig mit >'<? Kann ich die verschachteln? (Habe es versucht, aber das hat nicht geklappt. Aber womöglich hatte ich die >'< beim Verschachteln irgendwie falsch gesetzt.
P.P.S. Hier muß es einen Fehler in der Forumssoftware geben.
"Der Text enthält drei oder mehr gleiche Zeichen hintereinander oder enthält keine Satzzeichen (-2.00 Punkte). Sind Sie sicher, dass Sie das Posting so abschicken wollen?
Der Text enthält weniger als oder genau zwei Zeilenumbrüche (-3.00 Punkte). Sind Sie sicher, dass Sie das Posting so abschicken wollen?"
Das stimmt ja garnicht! :P
Hi,
P.S. Sind die von phpMyAdmin angezeigten Anführungszeichen >`< gleichwertig mit >'<? Kann ich die verschachteln?
http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html
http://dev.mysql.com/doc/refman/5.1/en/identifiers.html
MfG ChrisB
Die eigentliche Frage ist gelöst.
Es fehlten die einfachen Anführungszeichen um die $mp_... Variablen.
Es funktioniert jetzt also mit:
$sql = "INSERT INTO
".$GLOBALS["mysql\_db"]."
.Artikel
(Nr
,Titel
,Teaser
,Einleitung
,Haupttext
,ErstelltDatumUhrzeit
,FreiAbDatumUhrzeit
)
VALUES ('1', '$mP_titel' , '$mP_teaser' , '$mP_einleitung' , '$mP_haupttext' , NOW( ) , NOW( ) );";
Allgemein zu den Anführungszeichen:
http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html
http://dev.mysql.com/doc/refman/5.1/en/identifiers.html
Danke nochmal
und gute Nacht für heute!
Jo