2016-05-25 12 views
0

Ich habe im Internet geschaut und konnte dieses Problem nicht lösen.PHP PDO SQL Syntax Fehler

Ich versuche, eine Zeile in eine mySQL Tabelle durch diese Funktion

mit PDO einzufügen, wenn ich tue, bekomme ich diesen Fehler:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'Desc) VALUES ('User', 0.00, 3, 'theUser')' at line 1' in C:\xampp\htdocs\classes\catalogue.php:65 Stack trace: #0 C:\xampp\htdocs\classes\catalogue.php(65): PDO->exec('INSERT INTO cat...') #1 C:\xampp\htdocs\classes\main.php(39): Catalogue->newItem('User', 'theUser', '0.00', '3') #2 {main} thrown in C:\xampp\htdocs\classes\catalogue.php on line 65 

ich, dass die self::connect(); bestätigen Methode funktioniert, und das Problem tritt nur auf, wenn ich versuche, Daten in die Desc-Spalte einzufügen.

Ich habe eine gute beim Versuch, dieses Problem zu sortieren, aber mein Wissen über PDO ist recht vage ausgegeben ....

Kann jemand sehen, wo ich falsch gegangen?

der echo ‚s Show this:

User 0.00 theUser 3 
+2

'Desc' in mysql reserviert ist in muss Stichwort vorbereiten und binden Anweisung in Graviszeichen https://dev.mysql.com /doc/refman/5.7/en/keywords.html und verwenden Sie prepare und bind statement – Saty

Antwort

4

DESC ein Schlüsselwort ist. Sie müssen den Spaltennamen mithilfe von Backtics oder die Spalte umbenennen.

$sql = "INSERT INTO catalogue (Name, Price, CatID, `Desc`) 
    VALUES ('$name', $price, $catID, '$desc')"; 

Weitere Informationen über Schlüsselwörter finden Sie unter official documentation.

+0

Ich werde dies in 9 Minuten als korrekt markieren, danke, und Ihre Bearbeitung kam gerade rechtzeitig, ich war gerade dabei, einen Kommentar zu posten, der fragt, ob "Beschreibung" ein Schlüsselwort ist xD –

+0

@Downvoter: bitte erklären! – Jens

+0

ist nichts falsch mit der Antwort selbst. Es ist nur mein bescheidener Versuch, das [Bike-Shed-Problem] zu beheben (http://meta.stackexchange.com/questions/31253/the-bikeshed-problem-and-stack-exchange). Disclaimer: Ich werde mich zu keiner weiteren Diskussion zu diesem Thema äußern. –

-3

Try this

$sql = "INSERT INTO catalogue (Name, Price, CatID, Desc) 
    VALUES ('".$name."', $price, $catID, '".$desc."')"; 
+0

Weder löst das Problem noch erklärt, was Sie getan haben oder warum. – CD001

1

Desc ist Schlüsselwort in MySQL reserviert in https://dev.mysql.com/doc/refman/5.7/en/keywords.html.html in Graviszeichen sein muss und

$sth = $conn->prepare("INSERT INTO catalogue (Name, Price, CatID, `Desc`) 
    VALUES (:Name, :Price, :CatID, :Desc)"); 
$sth->bindParam(':Name', $name, PDO::PARAM_STR); 
$sth->bindParam(':Price', $price, PDO::PARAM_STR); 
$sth->bindParam(':CatID', $catID, PDO::PARAM_INT); 
$sth->bindParam(':Desc', $desc, PDO::PARAM_STR); 
$sth->execute(); 
+0

Was sind die Vorteile gegenüber der Methode, die ich verwendet habe? –

+0

Um Form SQL Injektion zu verhindern. Lies http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1 – Saty

+1

Ausgenommen ': CatID' sollte wahrscheinlich' PDO :: PARAM_INT' sein - aber ja Es ist besser, mit vorbereiteten Anweisungen mit gebundenen Parametern über Raw SQL zu gehen. – CD001