PHP报错:在非对象上调用fetch_assoc()方法问题求助
排查fetch_assoc()调用错误的具体方案
我来帮你一步步定位这个问题——fetch_assoc()报错大多是因为$devices不是有效的mysqli结果集对象导致的,下面是针对你的代码的具体排查方向:
1. 先确认getTokenByEmail()的返回值
你的代码里$devices = $db->getTokenByEmail($_POST['u_code']);是核心环节,这个方法如果返回false(而非结果集),调用fetch_assoc()就会直接报错。
建议在调用循环前加个判断,快速定位问题:
// 在while循环前添加 if (!$devices) { // 假设DbOperation类里有$conn属性存储mysqli连接 die('查询失败原因:' . $db->conn->error); }
如果查询本身有问题(比如SQL语法错、表/字段不存在),这里会直接打印错误信息。
2. 检查数据库连接是否正常
如果DbOperation的构造函数没有正确建立数据库连接,所有后续查询都会失败,导致getTokenByEmail()返回false。可以打开DbOperation.php检查连接逻辑:
class DbOperation { private $conn; function __construct() { require_once 'config.php'; $this->conn = new mysqli(HOST, USER, PASS, DB); // 增加连接错误检查 if ($this->conn->connect_error) { die('数据库连接失败:' . $this->conn->connect_error); } } // ...其他方法 }
如果连接有问题,这里会直接抛出错误,帮你快速定位。
3. 验证getTokenByEmail()的SQL语句
打开DbOperation.php找到这个方法,重点检查:
- 表名、字段名是否拼写正确?比如你用到的
u_code、token是否真的存在于目标表中? - 是否用了参数化查询?如果直接把
$_POST['u_code']拼进SQL,不仅有注入风险,还可能因为特殊字符导致查询失败。
正确的参数化查询写法应该是这样的:
function getTokenByEmail($u_code) { // 替换成你的实际表名 $stmt = $this->conn->prepare("SELECT u_code, token FROM your_table WHERE u_code = ?"); $stmt->bind_param("s", $u_code); // s表示字符串类型,根据字段类型调整 $stmt->execute(); // 返回mysqli_result对象,这是fetch_assoc()需要的类型 return $stmt->get_result(); }
4. 确认前端是否正确传递了u_code参数
如果前端没有传u_code,或者传的值为空,$_POST['u_code']会是null或不存在,也会导致查询失败。可以在代码开头加个参数检查:
if (!isset($_POST['u_code']) || trim($_POST['u_code']) === '') { $response['error'] = true; $response['message'] = "缺少必填参数u_code"; echo json_encode($response); exit; }
5. 开启PHP错误提示辅助排查
在你的代码最开头加上这两行,让PHP显示所有错误信息,方便你看到具体的报错细节:
error_reporting(E_ALL); ini_set('display_errors', 1);
内容的提问来源于stack exchange,提问作者Bhavesh Rathod
相关产品推荐
相关产品推荐

