我有一个循环内有循环的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 " ";
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> $call - $location - $station - $units to device(s): '$devicetoken </br>".PHP_EOL;
}
}
这是我的数据库的样子:
device_id devicetoken unit
T05 ipad 773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4 121
E05 ipad 773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4 121
非常感谢任何帮助!
答案 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这样的步调试器。