使用PHP和MYSQL使用单引号传递变量

时间:2017-07-09 14:20:10

标签: php mysql pdo

我想将以下变量传递给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}[]

2 个答案:

答案 0 :(得分:1)

问题在于:

"SELECT * FROM :subject;";

bindParamwhere子句中使用的参数一起使用,而不是在表名中使用。

正确的语法如下:

$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();

Reference

答案 1 :(得分:1)

如果要创建“灵活”查询,允许用户输入表名,可以在进入prepare语句之前提供一些PHP逻辑,如

 $query="SELECT * FROM $subject";

但是,当然,这会打开你的查询到任何类型的SQL注入。但是谁说你在这个陈述中使用它之前不允许你在$ subject上创建自己的“输入消毒”?请注意,这需要非常谨慎地完成!