我正在尝试检查字符串是否与表中某个列中的某个字段匹配.为此,我需要从result对象获取所有行.我正在使用php 5.2.x所以不能使用$rows方法; 相反,我正在尝试构建一个包含所有行的新数组.
这是我的代码:
$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;
Run Code Online (Sandbox Code Playgroud)
$rows 应该是包含所有行的新数组,但我得到一个空数组.
任何想法为什么会这样?
cle*_*tus 22
你有一个轻微的语法问题,即一个错误的分号.
while($row = $result->fetch_row());
Run Code Online (Sandbox Code Playgroud)
注意结尾的分号?这意味着后续块未在循环中执行.摆脱它,它应该工作.
此外,您可能想要检查查询是否确实有效:
$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;
Run Code Online (Sandbox Code Playgroud)
You*_*nse 10
最新版本的 mysqli 有一些改进可以简化这样的任务。
首先,有一个有用的函数可以返回一个包含查询返回的所有行的数组,
这意味着如果您需要一个简单的枚举数组,代码会简单得多:mysqli_fetch_all()
$query = "SELECT domain FROM services";
$result = $sql->query($query);
return $result->fetch_all(MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)
甚至都在一行中,
return $sql->query("SELECT domain FROM services")->fetch_all(MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要使用某些列来索引结果数组,您仍然需要像这样的 while 循环:
$query = "SELECT domain FROM services";
$result = $sql->query($query);
$data = [];
while($row = $result->fetch_assoc()) {
$data[$row['id']]=$row;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您应该始终在填充数组之前对其进行初始化,因为这样的变量可能已经存在。
此外,mysqli_result类现在是可遍历的。这意味着您可以立即在 foreach 循环中使用它,就好像它是一个包含数据库中所有行的数组:
$query = "SELECT domain FROM services";
$result = $sql->query($query);
foreach($result as $row) {
echo $row['name'];
}
Run Code Online (Sandbox Code Playgroud)
但它实际上只是 while 循环的语法糖——你不能直接访问这个“数组”的值,这使得这个特性实际上有点用处。
这个问题已有十年历史,并且在问题和接受的答案中建立连接和执行查询的方式如今已过时且不受欢迎。
建立连接时,需要记住几件事情。我写了一篇关于如何正确连接mysqli的文章,提供了一个正确的连接示例,强调了以下问题:
die(mysqli_connect_error()))在运行查询时,还需要记住以下几点:
mysqli_query()mysqli_stmt_get_result()应该使用一个特殊的函数调用,以便使用熟悉的提取函数来获取结果行。如果此功能不可用,您可能需要勾选 cpanel 中的某个复选框(查找标记为 的复选框mysqlnd)。die(mysqli_error()))。由于正确的错误模式,mysqli 将自动报告所有错误。