ERREUR:SQLSTATE[42000]: erreur de Syntaxe ou de violation d'accès: 1064
J'étais à la recherche de la réponse pour les 3 dernières heures, et je ne sais pas quoi faire. Voici le code:
function get_data($tablename)
{
try
{
$conn = $this->conn();
$stmt = $conn->prepare("SELECT * FROM :tablename ORDER BY id");
$stmt->bindParam(':tablename', $tablename, PDO::PARAM_STR);
$stmt->execute();
return $stmt;
}
catch (Exception $e)
{
echo "ERROR:" . $e->getMessage();
}
}
Et voici l'erreur:
ERREUR:SQLSTATE[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 versions du serveur MySQL pour la bonne syntaxe à utiliser près de "produits" ORDER BY id' à la ligne 1
Ce que j'ai fait de mal?...
Vous devez vous connecter pour publier un commentaire.
Comme indiqué ici (merci @YourCommonSense), vous ne pouvez pas utiliser un paramètre comme un nom de table; et si vous le faites, l'une des deux choses vont se produire:
C'est ça le problème. Comme pour les solutions:
Si vous êtes heureux avec la conception (ou ne pouvez pas la modifier), vous aurez besoin d'un laid insécurité hack comme suit:
L'appeler comme
get_data($table, array("my_datatable_1", "my_datatable_2"))
. De crédit pour le poste lié à au début de ma réponse pour l'inspiration.AOP s'échappe de paramètres avec des guillemets simples (
'
). Table MySql noms doivent être échappés avec des backticks (`).Dans l'exemple fourni le nom de la table de paramètre, les Produits, est échappé des guillemets simples. C'est une caractéristique de sécurité de l'AOP moteur pour éviter les attaques par injection.
En supposant que la valeur de
$tablename
de sens que dans le contexte des applications (par exemple. la validation de l'utilisateur peut voir toutes les données dans la table spécifiée.).La suivante devrait fonctionner: