PHP数组不会填充MySQL数据

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

我有一个循环内的循环PHP脚本。 外部循环遍历$ unitsarray中的每个$单元的数组,并查询一个MySQL数据库,以查看是否存在具有相同匹配string的条目。 如果$ result1确实返回了一个条目,那么我为行“devicetoken”创build另一个名为$ devicetokens数组的数组,然后input我的第二个循环。 对于每个设备令牌,我创build一个Apple推送通知以发送到iOS设备。 我有两个问题,首先mysql_query什么也没有返回。 如果我用一个值replace$单位,我知道将返回na条目,那么它的工作原理。 其次,如果我已经replace了$单位并返回结果,$ devicetokens数组将不会填充任何数据,即使我已经从mysql查询返回结果。 这是我的代码:

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 

任何帮助将不胜感激!

您正在执行一个查询并将结果资源存储在$ 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 } 

如果您使用不推荐使用的mysql_* API,并且想要将所有结果行都放在一个数组中,那么首先应该创build一个新的帮助器函数,因为旧的库没有这个预定义的函数。

以下函数以数组的forms获取所有结果行。

 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); 

那么你就有了盲目的问题,而且你不知道input是什么以及生成了哪个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这样的debugging器。