准备好的声明杀死脚本

时间:2013-02-22 10:40:42

标签: php pdo prepared-statement

我有一个应该从DB获取一些API令牌的函数。 测试完脚本后,我发现准备SQL语句的行查杀脚本

static function get_tokens($platform, $is_breaking_news = 0, $in_test_mode=0) // 1-android, 2-ios
{

    global $dbh;
    $paid =2;
    $status = 1;
    $result = array();
    $query = '
        SELECT
            mobile_install_device_token, mobile_install_id
        FROM
            ' . TABLE_PREFIX . 'mobile_installs
        WHERE
            mobile_install_platform = :platform
        AND
            mobile_install_app_type = :paid
        AND ';
    if ($is_breaking_news)
    {
        $query .= '
            mobile_install_pn_status > :status
        ';
        $status = 0;
    }
    else 
    {
        $query .= '
            mobile_install_pn_status = :status
        ';
    }

    $stmt = $dbh->prepare($query); // **THIS IS THE KILLER!**

    try
    {
        $stmt->bindParam(':platform', $platform);
        $stmt->bindParam(':paid', $paid);
        $stmt->bindParam(':status', $status);

        $stmt->execute();
    }
    catch(PDOException $e)
    {

       Utils::sql_fail($query, $e->getMessage());
    }

    while($row = $stmt->fetch())
    {
    if ($in_test_mode)
    {

        if (!in_array($row['mobile_install_id'], array(4, 5, 13, 8)))
        {

            continue;
        }
    }
    echo 'send to ' . $row['mobile_install_id'] . PHP_EOL;
        $result[] = $row['mobile_install_device_token'];
    }

    return $result;
}//end function get_tokens 

我发现它是known bug,但那里提供的解决方案似乎不起作用。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您链接的错误几乎是十年旧 在开始考虑错误之前,必须执行某些操作

  • PDO::ATTR_ERRMODE转为ERRMODE_EXCEPTION验证,如果已设置并正常工作
  • 回复您的最终查询。
  • 用实际样本数据替换命名占位符并在控制台中运行
  • 用问号代替命名占位符并尝试在控制台中准备
像这样:

 PREPARE stmt1 FROM 'put your query here';

根据您的问题,目前还不清楚您是否完成了上述任何项目 如果你完成了所有工作并且一切正常 - 那么,就有一个错误。在PHP.NET bugtracker上发布可重现的代码 但如果你从任何一个中得到错误 - 只需解决错误。

<强>更新
刚发现它:
出于某种原因,您将prepare远离try阻止 难怪它会默默地杀死你的代码。

所以,在prepare区块内移动try 此外,必须设置错误报告。

在开发服务器上,您必须将display_errors设置为 ,才能收到错误通知而不是无声死亡。
在生产服务器上display_errors关闭,而log_errors - 并在这种情况下查找日志中的错误。