为啥我的数组计数存储在会话变量中会加倍?

Posted

技术标签:

【中文标题】为啥我的数组计数存储在会话变量中会加倍?【英文标题】:Why does my array count stored in a session variable doubles?为什么我的数组计数存储在会话变量中会加倍? 【发布时间】:2016-08-23 12:43:54 【问题描述】:

我有一个包含以下列的表格..

我将该表的数据存储在会话变量中

$sql = "SELECT * from `basic_info` where Username='".$user."' and Password='".$pass."'";
$sqlresult = mysqli_query($con,$sql) or die(mysqli_error($con));
$rowCount = mysqli_num_rows($sqlresult);
$currentData = mysqli_fetch_array($sqlresult);

if($rowCount > 0)
    $_SESSION['currentUser'] = $currentData;

但每当我使用以下代码回显数组的值时:

<?php

echo "Welcome $_SESSION['currentUser'][1]";
echo "<div name='infoDisplay'>";
echo "<table>";
echo "<tr>";
echo "<td><b>Family Name</b><td>";
echo "<td><b>First Name</b><td>";
echo "<td><b>Middle Name</b><td>";
echo "<td><b>Birthday</b><td>";
echo "<td><b>Contact Number</b><td>";
echo "<td><b>Address</b><td>";
echo "<td><b>Username</b><td>";
echo "<td><b>Password</b><td>";
echo "<td><b>Permission Level</b><td>";
echo "<td></td>";
echo "</tr>";


echo "</table>";
echo "</div>";

echo "Array count: " . count($_SESSION['currentUser']) . "<br/>";

echo "<tr>";
for($rowcount=0; $rowcount<=count($_SESSION['currentUser']);$rowcount++)
    echo "<td>". $_SESSION['currentUser'][$rowcount] . "</td>";

echo "</tr>";

?>

数组计数加倍。我的数据库中只有 9 列,但结果返回 18 个计数。这就是为什么我也遇到以下错误:

请告诉我您对如何轻松解决问题的意见。非常感谢您!祝你有美好的一天!

【问题讨论】:

$_SESSION['currentUser'][] = $currentData; 可以有多个当前用户吗?这是您的实际代码吗?顶部和底部并不真正匹配。 至于为什么要加倍,那是因为你没有读过documentation,这表明mysqli_fetch_array默认返回数字和字符串键,即0-n和列名字。 @JonStirling 我忘了编辑那部分。我已经纠正了这部分。请忽略该行。谢谢! 我不明白这个问题。 我的意思是它给你数字和字符串。您实际上不会在页面上看到列名。 【参考方案1】:

如 cmets 中所述,mysqli_fetch_array 为查询中选择的每一列返回一个包含两个元素的数组:一个元素带有数字键,一个元素的键是列名。因此,如果您选择 9 列,则该数组将具有从 08 的数字键,以及命名键 FamilyNameFirstName 等等。

您遇到的问题count($_SESSION['currentUser']) 计算了这两个元素,因此它将返回18,而不是9。然后,您的 for 循环将其用作限制,因此它将尝试通过 $_SESSION['currentUser'][17] 回显 $_SESSION['currentUser'][9],这不存在。

解决方案是使用mysql_fetch_row() 而不是mysql_fetch_array()。或者使用mysql_fetch_assoc() 并使用foreach 循环而不是for 循环,这是我的正常偏好。

【讨论】:

【参考方案2】:

来自手册:

mysqli_fetch_array() 是 mysqli_fetch_row() 函数的扩展版本。除了将数据存储在结果数组的数字索引中,mysqli_fetch_array() 函数还可以将数据存储在关联索引中,使用结果集的字段名称作为键。

所以对于你返回的每一行,假设你做了select fname,lname from ...

你会得到这样的每一行的数组:-

$row would be 

[0 => 'fred', 'fname' => 'fred', 1 => 'Bloggs', 'lname' => 'Bloggs']

这是你所说的列加倍

如果你使用

mysqli_fetch_array($sqlresult, MYSQLI_ASSOC);

mysqli_fetch_assoc($sqlresult);

您只会得到列名的关联数组,例如:

['fname' => 'fred', 'lname' => 'Bloggs']

【讨论】:

以上是关于为啥我的数组计数存储在会话变量中会加倍?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SQL 数据集总是返回 0 计数?

渲染期间模型的三角形计数加倍

为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?

为啥我的存储过程在包含在事务块中时会抛出错误?

为啥 JVM Monitor 显示错误的调用计数?

为啥在嵌套函数之外声明一个计数器变量会使循环慢 5 倍?