PHP数组不会填充mysql数据[重复]
Posted
技术标签:
【中文标题】PHP数组不会填充mysql数据[重复]【英文标题】:PHP array wont fill with mysql data [duplicate] 【发布时间】:2012-12-16 07:27:39 【问题描述】:可能重复:How to go through mysql result twice?
我有一个循环内循环的 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 " ";
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
任何帮助将不胜感激!
【问题讨论】:
这与我想做的完全相反。他正在重置他的查询结果。我使用结果一次,创建一个数组,设备令牌,循环通过该数组来推送通知。 您首先将所有结果消费给echo
他们。然后结果消失了,但您仍然想将它们复制到数组中(第二个 while 循环)。因此,您需要倒带。您在代码中看到了吗?
知道了,谢谢。有道理。
mysql_* 函数已弃用,将来会从 PHP 中删除。 请参阅 PHP 手册中的 Choosing an API guide。强烈建议不要使用旧的 ext/mysql 接口构建新的应用程序代码来使用 PHP 中的 mysql 数据库。考虑在 PHP 中使用较新的 MySQLi 或 PDO API 来避免将来的痛苦。
是的,我知道。我计划一搞定所有逻辑就去 mysqli n
【参考方案1】:
您正在执行查询并将结果资源存储在 $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,$result1 是 mysql 结果集上的指针。如果您请求整个结果集或关闭连接,mysql 服务器会忘记您查询的所有内容。 您必须删除整个 while 循环,但是可以。 好的,我遇到的另一个问题是我的 MySql 查询语句失败。带有 LIKE 的东西不起作用。即使单元数组已填充并正常工作,它也不会返回任何条目。 您应该首先检查查询后 $result1 的值... if (!$result1) die( mysql_error()); 【参考方案2】:如果您使用已弃用的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 这样的 step-debugger。
【讨论】:
以上是关于PHP数组不会填充mysql数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章