Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 未定义的偏移量1,但count()=2_Php_Sql - Fatal编程技术网

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

Php 未定义的偏移量1,但count()=2,php,sql,Php,Sql,我有一个由sql查询填充的数组。我需要两个元素,count()函数返回2。我可以毫无疑问地访问第一个元素,但是当我尝试访问索引1处的元素时,会出现错误“Undefined offset 1”。以下是阵列的填充方式: function getThreadsByOwner($owner_id,$mysqli) { $stmt = $mysqli->prepare("SELECT thread_id FROM threads

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

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

问题是,
fetch\u 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;
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行


希望这有帮助

啊,这很有道理。我应该阅读文档,而不是仅仅假设。谢谢你的帮助!