web-dev-qa-db-fra.com

SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Votre syntaxe SQL contient une erreur - PHP - AOP

J'ai parcouru tous les autres posts de stackoverflow (et de Google) avec le même problème, mais aucun ne semblait résoudre mon problème.

J'utilise pdo et php.

Mon 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();
}

et le premier print_r donne

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

qui est attendu (aucun n'est nul)

mais il produit l'erreur

QLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Votre syntaxe SQL contient une erreur. Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe appropriée à utiliser près de 'de, à, nom, sujet, message) VALEURS (' [email protected] ',' [email protected] ', ligne 1

Aucune idée de comment résoudre ce ... idées?

50
willium

from est un mot clé en SQL. Vous ne pouvez pas l'utiliser comme nom de colonne sans le citer. Dans MySQL, des noms tels que les noms de colonne sont cités à l’aide de backticks, c’est-à-dire `from`.

Personnellement, je ne me dérangerais pas; Je viens de renommer la colonne.

PS. Comme indiqué dans les commentaires, to est un autre mot clé SQL et doit donc être également cité. De manière pratique, les utilisateurs de drupal.org gèrent une liste de mots réservés dans SQL .

96
Jan Krüger

J'ai cette erreur exacte, mais dans mon cas, je liais des valeurs pour la clause LIMIT sans spécifier le type. Je laisse tomber ceci ici au cas où quelqu'un obtiendrait cette erreur pour la même raison. Sans spécifier le type LIMIT :limit OFFSET :offset;, le résultat est LIMIT '10' OFFSET '1'; au lieu de LIMIT 10 OFFSET 1;. Ce qui aide à corriger cela est le suivant:

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

Même erreur pdo dans la requête SQL lors de la tentative d’insertion dans la base de données d’un tableau multidimensionnel:

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

Extraire le tableau arr[$s][a] de la requête SQL, en utilisant à la place la variable qui le contient, corrige le problème. 

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

Ajouter le backtick c'est-à-dire "` "correctement. Ecrivez votre nom getTable et votre nom de colonne entre backtick.

0
Kazim Noorani