wake-up-neo.net

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax. PHP - gU

Ich habe alle anderen stackoverflow- (und google-) Beiträge mit dem gleichen Problem durchgesehen, aber keiner schien mein Problem zu lösen.

Ich benutze pdo und php.

Mein Code:

$vals = array(
 ':from'=>$email,
 ':to'=>$recipient,
 ':name'=>$name,
 ':subject'=>$subject,
 ':message'=>$message
);
print_r($vals);
try {

 $pdo = new PDOConfig();

 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 $sql = "SELECT * FROM messages WHERE `message` LIKE :message";

 $q = $pdo->prepare($sql);
 $q->execute(array(':message' => $vals[':message']));
 $resp = $q->fetchAll();

 foreach ($resp as $row) {
  throw new Exception('Please do not post the same message twice!');
 }

 $sql = "INSERT INTO messages (from, to, name, subject, message) VALUES (:from, :to, :name, :subject, :message)";
 $q = $pdo->prepare($sql);
 $q->execute($vals);


} 
catch(PDOException $e) {
   echo $e->getMessage();
}

und der erste print_r gibt an

Array ( [:from] => [email protected] [:to] => [email protected] [:name] => abc [:subject] => abc [:message] => abc )

was erwartet wird (keine sind null)

aber es gibt den Fehler aus

QLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, auf die richtige Syntax von, um Name, Betreff und Nachricht zu verwenden

Keine Ahnung, wie man diese ... Ideen reparieren kann?

50
willium

from ist ein Schlüsselwort in SQL. Sie dürfen es nicht als Spaltennamen verwenden, ohne es anzugeben. In MySQL werden Dinge wie Spaltennamen mit Backticks zitiert, d. H. `from`.

Ich persönlich würde mich nicht darum kümmern. Ich würde nur die Kolumne umbenennen.

PS. Wie in den Kommentaren darauf hingewiesen wurde, ist to ein anderes SQL-Schlüsselwort. Praktischerweise pflegen die Leute bei drupal.org eine Liste der reservierten Wörter in SQL .

96
Jan Krüger

Ich habe diesen genauen Fehler erhalten, aber in meinem Fall habe ich die Werte für die Klausel LIMIT ohne Angabe des Typs verbindlich festgelegt. Ich lasse das hier einfach fallen, falls jemand diesen Fehler aus demselben Grund erhält. Ohne Angabe des Typs LIMIT :limit OFFSET :offset; ergab LIMIT '10' OFFSET '1'; statt LIMIT 10 OFFSET 1;. Was hilft, das zu korrigieren, ist folgendes:

$stmt->bindParam(':limit', intval($limit, 10), \PDO::PARAM_INT);
$stmt->bindParam(':offset', intval($offset, 10), \PDO::PARAM_INT);
29
uKolka

Derselbe pdo-Fehler in der SQL-Abfrage beim Versuch, in den Datenbankwert aus einem multidimentellen Array einzufügen:

$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);    
$sth->execute();

Das Extrahieren des Arrays arr[$s][a] aus der SQL-Abfrage, wobei stattdessen die Variable verwendet wird, die es enthält, wird das Problem behoben. 

1
ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
    ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;

Fügen Sie das Backtick hinzu, d. H. "` "Richtig. Schreiben Sie Ihren getTable-Namen und den Spaltennamen zwischen Backtick.

0
Kazim Noorani