使用mysqli查询MySQL仅返回首行,如何获取表中全部数据?
解决方法:获取MySQL表中全部用户数据
嘿,问题出在fetch_assoc()的用法上——这个方法每次只能从结果集中读取一行数据,所以你现在只拿到了第一条记录。要获取所有数据,你有两种常用的修改方式:
方法一:循环遍历结果集
初始化一个空数组,通过while循环逐行读取数据并添加到数组中,最后返回这个数组:
/** * @param string $nick * @return array|null */ public function getPlayerByNick(string $nick) : ?array{ // 注意:这里原查询没用到$nick参数,如果你要按昵称筛选,记得修改查询! $query = "SELECT * FROM reports"; $result = $this->connection->query($query); $allData = []; if($result instanceof \mysqli_result){ // 循环读取每一行数据 while($row = $result->fetch_assoc()){ $allData[] = $row; } $result->free(); var_dump($allData); // 现在会输出所有用户数据 return $allData; } return null; }
方法二:使用fetch_all()一次性获取所有数据
mysqli_result提供了fetch_all()方法,可以直接一次性取出所有结果行,注意要指定MYSQLI_ASSOC参数来保持关联数组格式:
/** * @param string $nick * @return array|null */ public function getPlayerByNick(string $nick) : ?array{ $query = "SELECT * FROM reports"; $result = $this->connection->query($query); if($result instanceof \mysqli_result){ $allData = $result->fetch_all(MYSQLI_ASSOC); $result->free(); var_dump($allData); return $allData; } return null; }
重要提醒:修复未使用的参数与SQL注入风险
我注意到你的函数接收了$nick参数,但查询语句里完全没用到它!如果你本来是想根据昵称查询特定用户,千万不要直接把$nick拼到SQL里(会导致SQL注入),要用预处理语句:
/** * @param string $nick * @return array|null */ public function getPlayerByNick(string $nick) : ?array{ // 使用预处理语句避免SQL注入 $stmt = $this->connection->prepare("SELECT * FROM reports WHERE nick = ?"); $stmt->bind_param("s", $nick); $stmt->execute(); $result = $stmt->get_result(); $allData = $result->fetch_all(MYSQLI_ASSOC); $result->free(); $stmt->close(); var_dump($allData); return $allData; }
这样既实现了按昵称筛选,又保证了安全性。
内容的提问来源于stack exchange,提问作者Pocket Droid
相关产品推荐
相关产品推荐

