PDO在第一次尝试后无法执行,args不会被添加到例程中的预准备语句中?

时间:2015-04-10 13:47:22

标签: php mysql pdo prepared-statement routines

Enviro:MySQL,PHP 5.5

我遇到需要从数据库中返回随机结果的情况。我尝试了两种方法。一个返回结果数组,我使用array_rand($results)随机选择一个,另一个是添加order by rand() limit1;

当我返回结果列表时,从MySQL控制台报告执行时间,如下所示:

602 rows in set (0.05 sec)
Query OK, 0 rows affected (49.37 sec)

这不好。所以我选择报告的其他方法:

1 row in set (0.05 sec)
Query OK, 0 rows affected (0.36 sec)    

当第二次运行此查询时问题变成了,我传入的arg记录了检索到的上一条记录,因此我避免重复

这是我的惯例:

CREATE PROCEDURE `getRandomRecord`(
    IN _args varchar(100)
)
BEGIN
    SET @query = CONCAT('SELECT C.*, B.*
    FROM C
    LEFT JOIN B
    ON B.id = c.Bid
    where (C.Type=27 || C.Type=28 || C.Type=29) 
    and C.EndDate>CURRENT_TIMESTAMP() ',_args,' order by rand() limit 1;');

    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END//

这是第一次没有问题,但在PHP方面第二次运行时,调用失败。

args的记录如下:

$args= !empty($args) ? $args : '';
//args is empty first time
$dbHandler = new RandomRecordDatabase();
$results = $dbHandler->getRandomRecord($args);
//Do Stuff HERE
$args .= ' AND C.id!='.$results['C.id'];
$dealer_results = $dbHandler->getRandomRecord($args);

功能如下:

public function getRandomRecord($args){
    try
    {
        $procedure = "Call getRandomRecord(?)";
        $statement = $this -> _dbh -> prepare($procedure);
        $statement -> bindParam(1, $args);
        $statement -> execute();
        $results = $statement -> fetchAll(PDO::FETCH_ASSOC);
        return $results[0];
    }
    catch(PDOException $e)
    {
            echo $e -> getMessage();
    }
}

在第二次调用此方法时,我收到以下PDOException:

Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"387 order by rand() limit 1'

其中引用了行$statement -> execute();

如何修复此错误?谢谢!

UPDATE(溶液)

我应该更仔细地审查args的输出,我会看到错误:echo $args;

在一个例子中,我注意到一个混合案例:" AND C.id = 123 AND AND C.id = 456和C.id =" 111" AND C.id = 789。

我修改了一个我从未注意到的不同脚本中的案例。这现在解决了这个问题。

1 个答案:

答案 0 :(得分:1)

您的变量后面缺少第二个引号,这就是错误消息所说的内容。在sql中不需要也不建议使用整数引号。

由于您尚未发布所有相关代码,我无法看到您引入错误引用的位置。