PHP PDO编写的查询拒绝正确执行 - 转义问题?

时间:2009-06-29 22:53:21

标签: php mysql pdo

我在使用PDO编写的查询中遇到问题。代码:

$link = new PDO("mysql:dbname=$dbname;host=127.0.0.1",$username,$password);
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = $link->prepare("SELECT locality_name FROM :passedday GROUP BY locality_name ORDER BY locality_name DESC");
$query->bindParam(":passedday",$day); //Where day is, well, a day passed to the script elsewhere
$query->execute();
$result = $query->fetchAll();
$link = null;
//Do things with the $result.

我收到的错误消息是:

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在“05_26_09”附近使用正确的语法GROUP BY locality_name ORDER BY locality_name DESC'在第1行

当我直接在服务器上执行查询时,它会返回相应的结果集而没有任何问题。我有什么想法吗?

TIA。

编辑:

$day作为GET参数传递。因此,http://127.0.0.1/day.php?day=05_26_09会导致$day = $_GET['day'];

2 个答案:

答案 0 :(得分:2)

如果05_26_09打赌赌桌的名字,那么我猜你有一个逃避问题。您的本地操作系统与实时服务器不同吗?

我认为您不能将bindValue() / bindParam()用于除值之外的其他内容(例如,表名,字段名)。所以我有点惊讶,它适用于你的本地系统。

答案 1 :(得分:1)

PDO使用mysql的C-API来准备语句 http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-prepare.html说:

标记仅在SQL语句的某些位置合法。 [...]但是,它们不允许使用标识符(例如表名或列名)
根据经验,我使用:“如果你不能在ad-hoc中将它包装在单引号中查询字符串,您无法在预准备语句“

中对其进行参数化