-2

重複の可能性:
mysql の結果を 2 回調べるには?

ループ内にループがある PHP スクリプトがあります。外側のループは、$unitsarray 内の各 $unit の配列をたどり、MySQL データベースにクエリを実行して、同じ一致する文字列を持つエントリがあるかどうかを確認します。$result1 が実際にエントリを返す場合、行 "devicetoken" に対して $devicetokens 配列と呼ばれる別の配列を作成し、2 番目のループに入ります。デバイス トークンごとに、Apple プッシュ通知を作成して iOS デバイスに送信します。2 つの問題があります。1 つ目は、mysql_query が何も返さないことです。$unit を na エントリを返すことがわかっている値に置き換えると、機能します。第 2 に、$unit を置き換えて結果を取得した場合、mysql クエリから結果が返されたとしても、$devicetokens 配列にデータが入力されません。これが私のコードです:

foreach ($unitsarray as $unit) {

    echo "Unit = $unit </br>";

    // Create array of devices that match the unit
    $result1 = mysql_query("SELECT * FROM `department devices` WHERE unit LIKE '%$unit%'") or die(mysql_error());

    //Print results
    while ($row = mysql_fetch_assoc($result1)) {
        echo "&nbsp;&nbsp;&nbsp;&nbsp;";
        echo $row["device_id"];
        echo " , ";
        echo $row["devicetoken"];
        echo " , ";
        echo $row["unit"];
    }
    echo "</br>";

    $devicetokenarray = array();
    while ($row = mysql_fetch_assoc($result1)) {
        array_push($devicetokenarray, $row["devicetoken"]);
    }

    // Print array
    print_r($devicetokenarray);
    echo "</br>";

    // Loop APNS for each device token in $devicetoken array
    foreach ($devicetokenarray as $devicetoken)
    {

    // Build the binary notification
    $msg = chr(0).pack('n', 32).pack('H*', $devicetoken).pack('n', strlen($payload)).$payload;

    // Send it to the server
    $result = fwrite($fp, $msg, strlen($msg));

    // Create APNS operation output
        if (!$result)
            echo 'Failed message'.PHP_EOL;
        else
            echo "<b>Successful message sent:</b>&nbsp;&nbsp; $call - $location - $station - $units to device(s):&nbsp;&nbsp;'$devicetoken </br>".PHP_EOL;
    }
}

私のデータベースは次のようになります。

device_id   devicetoken                                         unit

T05 ipad   773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4   121
E05 ipad   773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4   121

どんな助けでも大歓迎です!

4

2 に答える 2

2

クエリを実行して結果リソースを $result1 に格納し、ループ内のすべての行をフェッチしてエコーアウトし、すぐに再度フェッチしようとしています。すべての結果を取得すると、再度取得することはできません。mysql_data_seek を使用すれば可能ですが、ほとんどの場合、そうするのは非常に非効率的で無駄です。最初に結果を配列に格納します。

$rows = array();

while ($row = mysql_fetch_assoc($result1)) {
     $rows[] = $row;
}

次に、この配列を介して foreach できます。

foreach ($rows as $row) {
    // Build the binary notification
    $msg = chr(0).pack('n', 32).pack('H*', $row['devicetoken']) . pack('n', strlen($payload)) . $payload;
    //... etc

}
于 2012-12-16T07:48:09.897 に答える
1

非推奨のmysql_*API を使用していて、すべての結果行を単一の配列に入れたい場合は、古いライブラリには事前定義されていないため、最初に新しいヘルパー関数を作成する必要があります。

次の関数は、すべての結果行を配列の形式でフェッチします。

function mysql_fetch_all($result, $result_type = MYSQL_BOTH) {
    $rows = array();
    while ($row = mysql_fetch_assoc($result1)) {
        $rows[] = $row;
    }
    return $rows;
}

使用法:

$rows = mysql_fetch_all($result1, MYSQL_ASSOC);

次に、盲目的に飛ぶという問題があり、入力が何であるか、どのSQLクエリが生成されるかわからないという問題があります。次に、より詳細にする必要があります。

$sql     = "SELECT * FROM `department devices` WHERE unit LIKE '%$unit%'";
printf("DEBUG: <pre>%s</pre>\n", htmlspecialchars($sql));
$result1 = mysql_query($sql) or die(mysql_error());

その後、実行したクエリを確認できます。望ましいのは、xdebug のようなステップ デバッガーです。

于 2012-12-16T07:59:23.087 に答える