我有一个应该从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,但那里提供的解决方案似乎不起作用。 有什么想法吗?
答案 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
到 - 并在这种情况下查找日志中的错误。