【问题标题】:How do I properly iterate through a mysqli_fetch_array (procedural)?如何正确迭代 mysqli_fetch_array (程序)?
【发布时间】:2014-08-23 19:09:35
【问题描述】:

我有一个我认为将旧的“mysql”代码更新为“mysqli”的简单过程。在许多地方,有代码迭代多维数组以获取值。我正在尝试制作一个类似的循环并使用 mysqli_fetch_array 或 mysqli_fetch_all 并且只是将我的头撞到墙上。进程要么失败(挂起),要么不返回任何值。我浏览了整个网络并找到了各种示例,但没有一个非常有效……通常它们不适用于程序方法 (https://stackoverflow.com/questions/12026979/how-do-iterate-the-result-of-mysqli-fetch-array)。

我目前有:

$query2 = "SELECT * FROM mp WHERE email='$email'";

//connect to database    
require("../dbinfo.php");
$con = mysqli_connect($host,$username,$password,$database);                 

$result2=@mysqli_query($con, $query2);
$array = mysqli_fetch_array($result2, MYSQLI_BOTH);
@mysqli_close($con);  //question...does this need to come later, after num_rows?


$num2=0;
$num2=@mysqli_num_rows($result2);


$a=0;
while ($a < $num2)
        {
//cycle through to get info...this comes up blank, when it should have 3 sets of values.
            $var1=$array[$a]["column"];
            $var2=$array[$a]["id"];
            echo "Column: ".$var1." and ID: ".$var2;
}

我已经看到很多基本上说“使用 PDO”或“为什么使用程序化?面向对象是要走的路”的答案,但我真的不想做不同的风格。很高兴知道是什么导致上述失败。我不能离得太远,对吧?提前感谢您的帮助!

【问题讨论】:

  • 您需要在所有 mysqli 调用之后将 mysqli_close 放在页面底部。您不想在完成所有这些功能之前关闭连接。
  • 您的代码易受 SQL 注入攻击,除非您对 $email 变量执行检查。
  • 是的,谢谢...还有很多额外的代码可以验证。我不担心 SQL 注入。但是@Rasclatt,我尝试将 mysqli_close 移到最后,但它仍然无法正常工作。我意识到由于某种原因无法提取 $var1, $var2 部分中的任何值。 mysqli_num_rows 部分有效,我得到(在这种情况下)3 次迭代。但我看到的只是“列:和 ID:”重复了三遍。 [$a] 部分是否写错了?应该是 $array($a, "column") 还是类似的东西?

标签: php mysqli


【解决方案1】:

首先,您应该将@mysqli_close($con); 移动到不再调用mysqli-functions 的位置(基本上是底部)。

其次,您应该在 PHP 手册中查找 mysqli_fetch_array()-函数:

返回对应于获取的行的字符串数组或 如果结果集中没有更多行,则为 NULL。

所以它返回一个对应于 one 行的数组,而不是所有行,这意味着语句 $array[$a]["column"]; 没有多大意义(我知道你正在尝试做其他答案说,但您没有包含适当的代码来执行此操作[它在该答案中进一步提供])。因此,我建议使用常规方式:尝试删除 $array = mysqli_fetch_array($result2, MYSQLI_BOTH),然后添加它而不是 while-loop:

while ($row = mysqli_fetch_array($result2, MYSQLI_BOTH))
{
    echo "Column: " . $row["column"] . " and ID: " . $row["ID"];
}

由于mysqli_fetch_array() 更改了结果对象,因此每个循环都会得到不同的结果,这意味着$row 将包含不同的值。每个不同的值将是数据库中的不同行,列作为数组键,值作为数组值。但是,由于您使用的是MYSQLI_BOTH,您还可以通过使用列号作为数组键来访问一个值。如果不需要,建议改成MYSQLI_ASSOC

这也意味着您可以完全删除$num2-变量和$a-变量。如果你想使用你现在使用的方法,你需要在while-loop之前使用the answer to this question中提供的第二个代码。虽然请注意,您还需要为每个循环增加变量$a 1,您当前的代码不会这样做。基本上,您需要将其更改为:

$var1=$array[$a]["column"];
$var2=$array[$a++]["id"]; //the variable $a is increased after $var2 is assigned
echo "Column: ".$var1." and ID: ".$var2;

虽然如果您只是要打印变量,那么这段代码要复杂得多...而不是仅仅打印它们,您将它们分配给一个数组,然后再次打印它们,这需要 2 个循环之一。就个人而言,我建议将整个代码更改如下:

//connect to database    
require("../dbinfo.php");

$con = mysqli_connect($host,$username,$password,$database);                 
$result2 = @mysqli_query($con, $query2);

while ($row = mysqli_fetch_array($result2, MYSQLI_BOTH))
{
    echo "Column: " . $row["column"] . " and ID: " . $row["ID"];
}

@mysqli_close($con);

【讨论】:

  • 耶稣,这是一个很好的答案。谢谢你。我终于开始理解这一点了……不太了解 mysqli_fetch_array 每次迭代将如何自动更改。但是,我发现当我这样做时,它只运行 2 次,而它应该运行 3 次。数组中有 3 行应该被拉出......为什么它只会看到 2他们?
  • (我基于 num_rows 值 = 3。)
  • Annnd,你可以忽略最后一点。我注释掉了一些东西,却忘记了我需要它。现在工作正常。谢谢!!!
  • @user1149499 很高兴听到!如果您对 while-loop 的工作原理感到好奇:它更改的原因与指针有关 - 基本上,mysqli_fetch_array() 都将当前行作为数组返回并增加“行指针”,因此它指向下一行。这意味着当再次调用它时,您将引用第二行,并增加指向第三行的指针,以此类推。当行数用完时,它将返回NULL,这意味着while 循环中的条件将返回false,循环将中断。对于每个循环,$row 将包含不同的行。
  • 如上所述:它在每次迭代中更改的原因与$result2 对象的修改有关(如上所述),这意味着它“自动”将在每次迭代中更改(不得不发表另一条评论;最后一条太长了)。
猜你喜欢
  • 2019-11-02
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2017-08-16
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多