我的SELECT
语句返回错误代码42000。
根据我的发现,错误代码42000意味着我的声明无效:
public function getDataSet($start = 0, $count = 10000) {
$sql =
'SELECT e.record_id, e.identifier, e.equipment_type, t.desc_short as type_name, ' .
'e.desc_short, e.alias, e.afe, e.desc_long, l.desc_short as location_name, e.reserved_by ' .
'FROM EngineeringDB_Equipment e ' .
'LEFT JOIN tbl_code_values l ON (e.location=l.record_id) ' .
'LEFT JOIN tbl_code_values t ON (e.equipment_type=t.record_id) ' .
'WHERE (e.deleted_on=0) ' .
'ORDER BY e.identifier asc ' .
'LIMIT :start,:count; ';
$this->columns = array('record_id', 'identifier', 'equipment_type', 'type_name', 'desc_short', 'alias', 'afe', 'desc_long', 'location_name', 'reserved_by');
$cmd = $this->pdo->prepare($sql);
$cmd->bindValue(':start', (int)$start, PDO::PARAM_INT);
$cmd->bindValue(':count', (int)$count, PDO::PARAM_INT);
$res = $cmd->execute();
if ($res) {
$table = $cmd->fetchAll();
} else {
$table = array('Error Code' => $cmd->errorCode());
}
return ($table);
}
所以,我拿了$sql
的文本,并通过数据库上的 MySQL Workbench 运行了这个文本:
SELECT e.record_id, e.identifier, e.equipment_type, t.desc_short as type_name,
e.desc_short, e.alias, e.afe, e.desc_long, l.desc_short as location_name, e.reserved_by
FROM EngineeringDB_Equipment e
LEFT JOIN tbl_code_values l ON (e.location=l.record_id)
LEFT JOIN tbl_code_values t ON (e.equipment_type=t.record_id)
WHERE (e.deleted_on=0)
ORDER BY e.identifier asc
LIMIT 0,10;
是的,$start
= 0且$count
= 10。
运行正常,所以问题不应该是SQL,而是我绑定的东西。 (???)有谁看到那是什么?
为什么PHP / PDO代码会失败?
答案 0 :(得分:2)
MySQL对limit
非常挑剔。引用documentation(流氓的最后避难所):
LIMIT子句可用于约束返回的行数 通过SELECT语句。 LIMIT需要一个或两个数字参数, 这些必须都是非负整数常数 例外:
在预准备语句中,可以使用?指定LIMIT参数?占位符标记。
在存储的程序中,可以使用整数值例程参数或局部变量指定LIMIT参数。
我添加了观察结果作为评论,因为我不确定你的使用是否与第一颗子弹相似。显然,您需要使用值而不是使用参数来构建字符串。
任何人都可以说" SQL注入"?如果这是一个问题,它应该很容易验证值实际上是非负整数 - 不多也不少(以免你得到不同类型的语法错误)。
答案 1 :(得分:1)
对我而言,代码看起来不错。可能是占位符。据我所知,“count”是SQL中的一个特殊单词,我在前后使用占位符。