未定义的偏移1,但count()== 2

时间:2014-01-25 08:24:23

标签: php sql

我有一个由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();
}

有谁能告诉我是什么导致了这个问题以及如何解决它?

2 个答案:

答案 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。

Link to documentation

希望这有帮助!