我有一个由sql查询填充的数组。我期待两个元素,并且count()函数返回2.我可以毫无问题地访问第一个元素,但是当我尝试访问索引1处的元素时,我得到错误“Undefined offset 1”。以下是数组的填充方式:
function getThreadsByOwner($owner_id,$mysqli)
{
$stmt = $mysqli->prepare("SELECT thread_id
FROM threads
WHERE owner_id = ?
ORDER BY time ASC");
$stmt->bind_param('s', $owner_id);
if (!$stmt->execute()) {header("Location:server_error.php");}
$result = $stmt->get_result();
return $result->fetch_array();
}
有谁能告诉我是什么导致了这个问题以及如何解决它?
答案 0 :(得分:2)
问题是,fetch_array()
只返回一行中的数据 - 而不同的元素不代表行,而是列。见http://at2.php.net/mysqli_fetch_array
因此,为什么索引1未定义的原因是,因为您只获取一列。
如果你想要两行,你必须两次调用命令。
这可以解决您的问题:
$ret = [];
$ret[0] = $result->fetch_array();
$ret[1] = $result->fetch_array();
return $ret;
但是,您的表也可能是空的,并且结果集中的行少于2行。你也应该关心它,并使用:
$ret = [];
$row = $result->fetch_array();
if($row != NULL){
$ret[0] = $row;
$row = $result->fetch_array();
if($row != NULL){
$ret[1] = $row;
}
}
return $ret;
现在,当您尝试访问它们时,您还必须关注较小的数组。
你可以使用count($ret)
,它应该总是返回0,1或2。
只要您只想读取2行,此代码就可以了。但是只要一次检索多行,循环就是更好(也更可读)的替代方法:
$ret = [];
while ($row = $result->fetch_array()) {
$ret[] = $row;
}
return $ret;
答案 1 :(得分:0)
fetch_array()只返回一行。
你需要在while循环中使用它:
function getThreadsByOwner($owner_id,$mysqli)
{
$stmt = $mysqli->prepare("SELECT thread_id
FROM threads
WHERE owner_id = ?
ORDER BY time ASC");
$stmt->bind_param('s', $owner_id);
if (!$stmt->execute()) {header("Location:server_error.php");}
$result = $stmt->get_result();
$res = array();
while ($row = $result->fetch_array()) {
$res[] = $row;
}
return $res;
}
这将返回一个包含任意行数的数组,而不仅仅是2。
希望这有帮助!