PHP数组不会填充mysql数据

时间:2012-12-16 07:27:40

标签: php mysql ios sql arrays

  

可能重复:
  How to go through mysql result twice?

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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

}

答案 1 :(得分: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这样的步调试器。