0

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 

これは既知のバグであることがわかりましたが、そこで提供された解決策は機能していないようです。何か案は?

4

1 に答える 1

2

あなたがリンクしたバグは、ほぼ10 年前のものです。バグについて考え始める前に、特定の一連のアクション
を実行する必要があります。

  • それが設定され、機能しているかどうかをPDO::ATTR_ERRMODE確認してくださいERRMODE_EXCEPTION
  • 最後のクエリをエコーし​​ます。
  • 名前付きプレースホルダーを実際のサンプル データに置き換えて、コンソールで実行する
  • 名前付きプレースホルダーを疑問符に置き換えて、コンソールで準備を試みます

このような:

 PREPARE stmt1 FROM 'put your query here';

あなたの質問から、上記の項目のいずれかを完了したかどうかは不明です。
それらをすべて完了し、すべてが正常に機能した場合は、バグがあります。PHP.NET バグトラッカーに再現可能なコードを投稿してください。
ただし、いずれかでエラーが発生した場合は、エラーを解決してください。

更新
ちょうどそれを見つけました:
何らかの理由で、ブロックprepareから離れました。 コードを静かに殺してしまうのも不思議ではありません。 try

ということで、ブロックprepare内へ移動。 また、エラー報告を設定することも不可欠です。 try

開発サーバーではondisplay_errorsに設定する必要があり、サイレントデスの代わりにエラーが通知されます。 実稼働サーバーでオフにしてからオンにし、そのような場合はログでエラーを探します。
display_errorslog_errors

于 2013-02-22T10:58:17.167 に答える