SQLSTATE[42000]: erreur de syntaxe ou violation d'accès: 1064 vous avez une erreur dans votre syntaxe SQL-PHP-PDO [dupliquer]

cette question a déjà une réponse ici:

  • erreur de Syntaxe en utilisant un mot réservé une table ou un nom de colonne dans MySQL 1 réponse

j'ai regardé à travers tous les autres messages stackoverflow (et google) avec le même problème, mais aucun ne semblait répondre à 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] => abc@gmail.com [:to] => lala@me.com [:name] => abc [:subject] => abc [:message] => abc )

qui est attendu (aucun n'est nul)

mais il affiche l'erreur

QLSTATE[42000]: erreur de Syntaxe ou de violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre serveur MySQL version pour le droit syntaxe à utiliser near 'from, to, name, subject, message) valeurs ('abc@gmail.com", " lala@me.com "à la ligne 1

Je ne sais pas comment réparer ça... des idées?

45
demandé sur Funk Forty Niner 2010-12-28 09:13:22

4 réponses

from est un mot clé en SQL. Vous ne pouvez pas l'utiliser comme nom de colonne sans le citer. Dans MySQL, des choses comme les noms de colonne sont cités en utilisant des bâtons arrières, i.e. `from` .

personnellement, je ne m'embêterais pas, je renommerais juste la colonne.

PS. comme indiqué dans les commentaires, to est un autre mot clé SQL donc il doit être cité, aussi. Commodément, les gens de drupal.org maintenir une liste de mots réservés en SQL .

89
répondu Jan Krüger 2016-12-03 16:39:18

j'ai eu cette erreur exacte, mais dans mon cas je Liais des valeurs pour la clause LIMIT sans spécifier le type. Je laisse tomber ça au cas où quelqu'un aurait cette erreur pour la même raison. Sans spécifier le type LIMIT :limit OFFSET :offset; résultait en 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);
25
répondu uKolka 2018-07-19 09:53:27

même erreur pdo dans la requête sql tout en essayant d'insérer dans la valeur de la base de données à partir du tableau multidimensionnel:

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

Extraction de la matrice de arr[$s][a] à partir d'une requête sql, en utilisant à la place de la variable contenant il résout le problème.

1
répondu Szymon Baranowski 2016-07-24 11:25:49
ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
    ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;

ajouter backtick i.e. "'" correctement. Écrivez votre nom getTable et le nom de la colonne entre backtick.

0
répondu Kazim Noorani 2016-10-05 11:05:19