我想将以下变量传递给prepare语句:$ subject。它是使用PDO完成的。不幸的是,它是用单引号传递的。例如,我传入数学,查询使用'maths'代替。我尝试过其他答案,比如bindParam,bindValue以及指定它是一个字符串属性,但我无法让它工作。如果有人知道什么是错的,请提前致谢我的代码如下。
$query = "SELECT * FROM :subject;";
$sql = $connection->prepare($query);
$sql->bindParam(':subject', $subject);
try{
$sql->execute();
}catch(Exception $e){
echo $e;
}
我收到以下错误:
exception 'PDOException' with message '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 ''maths'' at line 1' in D:\xampp\htdocs\acards\functions.php:18
Stack trace:
#0 D:\xampp\htdocs\acards\functions.php(18): PDOStatement->execute()
#1 D:\xampp\htdocs\acards\getMathsQuestions.php(13): Functions->getFeed('maths')
#2 {main}[]
答案 0 :(得分:1)
问题在于:
"SELECT * FROM :subject;";
bindParam
与where
子句中使用的参数一起使用,而不是在表名中使用。
正确的语法如下:
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
答案 1 :(得分:1)
如果要创建“灵活”查询,允许用户输入表名,可以在进入prepare
语句之前提供一些PHP逻辑,如
$query="SELECT * FROM $subject";
但是,当然,这会打开你的查询到任何类型的SQL注入。但是谁说你在这个陈述中使用它之前不允许你在$ subject上创建自己的“输入消毒”?请注意,这需要非常谨慎地完成!