pdo准备SELECT执行导致ErrorCode 42000

时间:2014-05-02 21:22:56

标签: php mysql sql pdo

我的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代码会失败?

2 个答案:

答案 0 :(得分:2)

MySQL对limit非常挑剔。引用documentation(流氓的最后避难所):

  

LIMIT子句可用于约束返回的行数   通过SELECT语句。 LIMIT需要一个或两个数字参数,   这些必须都是非负整数常数   例外:

     
      
  • 在预准备语句中,可以使用?指定LIMIT参数?占位符标记。

  •   
  • 在存储的程序中,可以使用整数值例程参数或局部变量指定LIMIT参数。

  •   

我添加了观察结果作为评论,因为我不确定你的使用是否与第一颗子弹相似。显然,您需要使用值而不是使用参数来构建字符串。

任何人都可以说" SQL注入"?如果这是一个问题,它应该很容易验证值实际上是非负整数 - 不多也不少(以免你得到不同类型的语法错误)。

答案 1 :(得分:1)

对我而言,代码看起来不错。可能是占位符。据我所知,“count”是SQL中的一个特殊单词,我在前后使用占位符。