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.
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?
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 .
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);
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.
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.