我在使用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'];
。
答案 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中将它包装在单引号中查询字符串,您无法在预准备语句“
中对其进行参数化