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 "&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

任何帮助将不胜感激!

【问题讨论】:

这与我想做的完全相反。他正在重置他的查询结果。我使用结果一次,创建一个数组,设备令牌,循环通过该数组来推送通知。 您首先将所有结果消费给echo他们。然后结果消失了,但您仍然想将它们复制到数组中(第二个 while 循环)。因此,您需要倒带。您在代码中看到了吗? 知道了,谢谢。有道理。 mysql_* 函数已弃用,将来会从 PHP 中删除。 请参阅 PHP 手册中的 Choosing an API guide。强烈建议不要使用旧的 ext/mysql 接口构建新的应用程序代码来使用 PHP 中的 mysql 数据库。考虑在 PHP 中使用较新的 MySQLiPDO 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数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用来自 php 的数据填充 flash 中的数组

Django - 使用给定的 sql 转储创建其他模型并填充数据 [重复]

PHP将生成的数组插入MySQL数据库[重复]

从数据数组(php,mysql)编写循环sql查询

如何从mysql数据库表中仅获取php数组的匹配项[重复]

php数据库空数组[重复]