-2

可能重复:
如何通过 mysql 结果两次?

我有一个循环内循环的 PHP 脚本。外部循环遍历 $unitsarray 中每个 $unit 的数组,并查询 MySQL 数据库以查看是否存在具有相同匹配字符串的条目。如果 $result1 确实返回了一个条目,我为“devicetoken”行创建另一个名为 $devicetokens 数组的数组,然后进入我的第二个循环。对于每个设备令牌,我创建一个 Apple 推送通知以发送到 iOS 设备。我有两个问题,首先 mysql_query 什么都不返回。如果我将 $unit 替换为我知道会返回 na 条目的值,那么它可以工作。其次,如果我替换了 $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 ($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 回答