0

我有一个函数应该从数据库中获取一些 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 

我发现这是一个已知的错误,但那里提供的解决方案似乎不起作用。有任何想法吗?

4

1 回答 1

2

您链接到的错误已经有将近十年的历史了。在开始考虑错误之前,
必须执行一组特定的操作。

  • 转到PDO::ATTR_ERRMODE验证它是否已设置并正常ERRMODE_EXCEPTION工作
  • 回显您的最终查询。
  • 用实际样本数据替换命名占位符并在控制台中运行
  • 用问号替换命名占位符并尝试在控制台中准备

像这样:

 PREPARE stmt1 FROM 'put your query here';

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

更新
刚刚发现:
出于某种原因,您prepare远离了try障碍。
难怪它会默默地杀死你的代码。

所以,移动preparetry块内。
此外,设置错误报告也很重要。

在开发服务器上,您必须设置display_errorson,以便收到错误通知而不是静默死亡。
在生产服务器display_errors关闭log_errors打开- 并这种情况下查找日志中的错误。

于 2013-02-22T10:58:17.167 回答