2013-02-22 91 views
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 

我发现这是一个known bug,但所提供的解决方案有没有似乎工作。 任何想法?

+1

究竟是哪里的事情失败和错误信息? (编辑:啊,我现在看到了,阅读bug报告,或者澄清它完全消失) – 2013-02-22 10:42:15

回答

2

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

  • PDO::ATTR_ERRMODEERRMODE_EXCEPTION验证,如果它被设置和工作
  • 呼应你的最终查询出来。
  • 实际样本数据指定的占位符
  • 替代品,在一个控制台上运行它带有问号
  • 替代命名占位符,并试图准备在控制台

这样的:

PREPARE stmt1 FROM 'put your query here'; 

从你的问题目前还不清楚你是否完成了上述任何项目。
如果你完成了所有工作,所有工作都正常 - 那么,就有一个错误。在PHP.NET bugtracker上发布可复制的代码。
但是,如果你从任何一个错误中得到一个错误 - 只需要处理错误。

更新
就察觉到而已:
出于某种原因,你把prepare远离try块。
难怪它正在悄悄地杀死你的代码。

因此,在try块内移动prepare
另外,设置错误报告也很重要。

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

+0

此外,还有一个'try ... catch'块,但是'$ stmt = $ dbh-> prepare($ query);'被排除在外。 – 2013-02-22 11:23:54