2017-08-06 4 views
2

Vous avez vu des tonnes de questions similaires mais vous ne parvenez toujours pas à savoir ce qui se passe.PDO MySQL préparé INSERT erreur de syntaxe

J'utilise PDO de PHP pour préparer une déclaration comme ça:

try{ 
    $statement = $db->prepare("INSERT INTO $date (name, surname, email, phone, comment) VALUES (:name, :surname, :email, :phone, :comment)"); 
    $statement->bindParam(':name', $name); 
    $statement->bindParam(':surname', $surname); 
    $statement->bindParam(':email', $email); 
    $statement->bindParam(':phone', $phone); 
    $statement->bindParam(':comment', $comment); 

    $statement->execute(); 
} 
catch(PDOException $e){ 
    die("Connection to database failed: " . $e->getMessage()); 
} 

ont essayé échapper tout avec [] et en spécifiant le nom de la base de données avant le nom de la table, mais continuer à obtenir

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in 
your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near '2017-08-11 (name, surname, email, 
phone, comment) VALUES ('Test', 'Test', '[email protected]' at line 1 
+1

Le nom de la table '2017-08-11' est invalide, si vous avez vraiment une table avec la date comme un nom (si je suis curieux de savoir pourquoi) vous devez envelopper entre guillemets – JimL

+0

Merci! C'est juste un système de réservation simple avec une table par jour. – NoSock

Répondre

4

INSERT INTO $ date

Il semble qu'il y ait un 2017-08- 11 dans $ date var.

Si vous souhaitez insérer des données dans « 11.08.2017 » table, il doit être échappé avec `symbole

try{ 
    $statement = $db->prepare("INSERT INTO `$date` (name, surname, email, phone, comment) VALUES (:name, :surname, :email, :phone, :comment)"); 
    $statement->bindParam(':name', $name); 
    $statement->bindParam(':surname', $surname); 
    $statement->bindParam(':email', $email); 
    $statement->bindParam(':phone', $phone); 
    $statement->bindParam(':comment', $comment); 

    $statement->execute(); 
} 
catch(PDOException $e){ 
    die("Connection to database failed: " . $e->getMessage()); 
} 
+0

JimL m'a fait la même chose dans les commentaires – iXCray

2

En supposant que 11/08/2017 est un nom de table, simplement en envelopper dos en arrière.

$statement = $db->prepare("INSERT INTO `$date` (name, surname, email, phone, comment) VALUES (:name, :surname, :email, :phone, :comment)"); 
-1

désolé, mais vous ne pouvez pas utiliser un caractère spécial lorsque vous utilisez l'instruction de préparation, donc ce que MySQL voit en réalité est INSERT INTO $date (name, surname, email, phone, comment) VALUES (:name, :surname, :email, :phone, :comment) qui déclenchera une erreur de syntaxe.

ici est une solution rapide

try{ 
$db->query("INSERT INTO $date (name, surname, email, phone, comment) VALUES ($name, $surname, $email, $phone, $comment)"); 

} 
catch(PDOException $e){ 
    die("Connection to database failed: " . $e->getMessage()); 
} 
+0

La question concerne les instructions préparées. Votre solution implose tout à une requête non sécurisée. Dig ici: https://www.w3schools.com/php/php_mysql_prepared_statements.asp – iXCray