我如何正确地迭代mysqli_fetch_array(过程)


How do I properly iterate through a mysqli_fetch_array (procedural)?

我有什么我认为将是一个简单的过程更新旧的"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_close($con);移动到不会再调用任何mysqli函数的位置(基本上是底部)。

其次,你应该在php手册中查找mysqli_fetch_array()函数:

返回与获取的行或对应的字符串数组

如果结果集中没有更多的行,则返回NULL。

因此它返回一个数组,该数组对应于一个行,而不是所有行,这意味着语句$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()更改了result-object,因此每次循环将得到不同的结果,这意味着$row将由不同的值组成。每个不同的值将是数据库中的不同行,列作为数组键,值作为数组值。但是,由于使用的是MYSQLI_BOTH,因此还可以通过使用列号作为数组键来访问值。如果你不需要这个,我建议改成MYSQLI_ASSOC

这也意味着您可以完全删除$num2 -变量和$a -变量。如果要使用现在使用的方法,则需要在while -循环之前使用该问题答案中提供的第二个代码。不过请注意,您还需要为每个循环增加变量$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;

虽然这段代码要复杂得多,如果你只是要打印变量…你不只是打印它们,而是将它们赋值给一个数组,然后再打印它们,这需要两个循环而不是一个循环。就我个人而言,我建议按照如下方式修改整个代码:

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