1

次のようなデータベースがあります。

Token (PRIMARY)     School        Skip
--------------------------------------
f2342f              School 1      0
434fbc              School 1      0
33332c              School 1      0

私の PHP コードは、学校が一時データベースと一致する場合、各トークンにプッシュ通知を送信します。次に、skip を 1 に設定して、その日は別の通知を送信しないようにします。

問題は、スクリプトで一度に複数のスキップ値を設定できないことです。私がそうすると、最初のトークンではうまくいくように見えますが、他のトークンにはスキップ値が設定されず、死んでしまいます。

これが私のPHPです:

// Run comparison SQL query
        $compare = mysql_resultTo2DAssocArray(mysql_query("SELECT Temp.School, Temp.Status, Snow.Skip, GROUP_CONCAT(Snow.Token SEPARATOR '\', \'') Tokens FROM Temp JOIN Snow USING (School) WHERE Skip = 0 GROUP BY Temp.School"), $con);
        $amount = count($compare);

        // Send Push Notifications
        for ($i = 0; $i < $amount; $i++) {
            $message = $compare[$i][School] . " - " . $compare[$i][Status];
            $tokens = $compare[$i][Tokens];
            pwCall( 'createMessage', array(
                'application' => PW_APPLICATION,
                'username' => PW_LOGIN,
                'password' => PW_PASSWORD,
                'notifications' => array(
                    array(
                        'send_date' => 'now',
                        'content' => $message,
                        'ios_badges' => 1,
                        'ios_sound' => 'bells.caf',
                        'data' => 'daily',
                        'devices' => array($tokens),
                        )
                    )
                )
            );
            if (!mysql_query("UPDATE Snow SET Skip='1' WHERE Token='$tokens[$i]'", $con)) {

                echo "<pre>";
                print_r(str_replace("'", '', $tokens));
                echo "</pre>";

                die('Error: ' . mysql_error());
            }
        }

出力は次のとおりです。

f2342f、434fbc、33332c エラー: SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の ''f2342f', '434' 付近で使用する正しい構文を確認してください。

したがって、コードで重要なものが欠落していない限り、スキップを再帰的に設定する必要があるようです。

$compare:

Array
(
    [0] => Array
        (
            [School] => School 1
            [Status] => Closed 
            [Skip] => 0
            [Tokens] => f2342f', '434fbc', '33332c
        )

)
4

2 に答える 2

2

これを行った後:

$tokens = $compare[$i]['Tokens'];

$tokens次のようになります。

f2342f', '434fbc', '33332c

クエリを次のように変更する必要があることを意味します

"UPDATE Snow SET Skip='1' WHERE Token IN('$tokens')"
于 2012-11-18T15:27:24.277 に答える
1

$tokens問題は、UPDATE クエリでの処理方法にあるようです。

その中のトークンに配列であるかのようにアクセスしようとしていますが、エラー メッセージはそれが$tokens文字列であることを明確に示しています。そうでなければprint_r、配列であることがわかります。

各トークンの更新クエリを作成する前にexplode、文字列を取得する必要があります。$tokens

$tokensArray = explode (', ', $tokens);

編集:

@minitech はあなたの質問に対して良いコメントをくれました。INトークンがステートメント ( )で使用されることを意図していた場合、トークンをWHERE token IN ($tokens)配列に分解する必要はありません。

于 2012-11-18T15:24:34.973 に答える