1

我在使用 PDO 用 PHP 准备的查询时遇到问题。编码:

$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 服务器版本相对应的手册,以在第 1 行的 ''05_26_09' GROUP BY locality_name ORDER BY locality_name DESC' 附近使用正确的语法

当我直接在服务器上执行查询时,它会毫无问题地返回适当的结果集。任何想法我做错了什么?

TIA。

编辑:

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

4

2 回答 2

2

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

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

于 2009-06-29T22:58:19.213 回答
1

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

标记仅在 SQL 语句中的某些位置是合法的。[...] 但是,它们不允许用于标识符(例如表名或列名)
作为一个经验法则,我使用:“如果你不能将它包装在一个临时查询字符串中的单引号中,你就不能在准备好的语句中对其进行参数化”

于 2009-06-29T23:11:04.663 回答