我正在尝试检查字符串是否与表格中某个列中的某个字段匹配。为此,我需要从result对象获取所有行。我使用的是php 5.2.x所以不能使用fetch_row_all
方法;相反,我正在尝试构建一个包含所有行的新数组。
这是我的代码:
$sql = new mysqli($config['host'],$config['user'],$config['pass'],$config['db_name']);
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT domain FROM services";
$result = $sql->query($query);
while($row = $result->fetch_row());
{
$rows[]=$row;
}
$result->close();
$sql->close();
return $rows;
$rows
应该是包含所有行的新数组,但我得到一个空数组。
为什么会发生这种情况?
答案 0 :(得分:20)
你有一个轻微的语法问题,即错误的分号。
while($row = $result->fetch_row());
注意结尾的分号?这意味着后续块未在循环中执行。摆脱它,它应该工作。
此外,您可能想要检查查询是否确实有效:
$sql = new mysqli($config['host'], $config['user'], $config['pass'], $config['db_name']);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit;
}
$query = "SELECT domain FROM services";
$result = $sql->query($query);
if (!$result) {
printf("Query failed: %s\n", $mysqli->error);
exit;
}
while($row = $result->fetch_row()) {
$rows[]=$row;
}
$result->close();
$sql->close();
return $rows;
答案 1 :(得分:2)
最新版本的mysqli进行了一些改进,可以简化此类任务。
首先,有一个有用的函数可返回包含查询mysqli_fetch_all()
的所有行的数组
这意味着如果您需要一个简单的枚举数组,则代码会简单得多:
$query = "SELECT domain FROM services";
$result = $sql->query($query);
return $result->fetch_all(MYSQLI_ASSOC);
但是,如果您需要使用某些列来对结果数组进行索引,则仍然需要while循环,如下所示:
$query = "SELECT domain FROM services";
$result = $sql->query($query);
$data = [];
while($row = $result->fetch_assoc()) {
$data[$row['id']]=$row;
}
请注意,在填充数组之前,应始终对其进行初始化,因为这样的变量可能已经存在。
此外,mysqli_result
类现在可以遍历。这意味着您可以立即在foreach循环中使用它,就像它是包含数据库中所有行的数组一样:
$query = "SELECT domain FROM services";
$result = $sql->query($query);
foreach($result as $row) {
echo $row['name'];
}
但这实际上只是while循环的语法糖-您不能直接访问此“数组”值的值,这实际上使此功能用处不大。
这个问题已经有十年历史了,如今,无论是在问题还是在接受的答案中,建立连接和执行查询的方式都已被淘汰和皱眉。
建立连接时,需要牢记几件事。我写了article,其中提供了正确的连接示例,着重强调以下问题:
die(mysqli_connect_error())
)执行查询时,请记住以下几点:
mysqli_query()
die(mysqli_error())
)。由于使用了正确的错误模式,mysqli将自动报告所有错误。