如何在PHP与MySQL中执行多AND、OR运算符?添加AND条件报错排查
问题分析与解决方案
看起来你的问题根源是SQL语法错误导致查询执行失败,进而让后续代码尝试访问非对象的属性,抛出了“Trying to get property of a non-object”错误。具体来说,是字符串类型的字段值没有加引号引发的问题。
错误原因拆解
你报错的查询语句展开后是:
SELECT * FROM scores WHERE (sortDate <= 20190629 AND sport = football) AND (homeID = 4 OR awayID = 4) ORDER BY gameDate DESC
这里的sport = football是关键问题:如果sport字段是字符串类型,SQL会把football当成一个未定义的变量,而不是字符串值,这直接导致SQL语法错误。执行失败后,查询返回的不是预期的结果集对象(而是false或错误资源),当你后续代码尝试遍历结果或访问它的属性时,就会触发那个PHP错误。
修复方案
1. 给字符串变量添加单引号
最直接的修复是给$sportID加上单引号,让SQL识别它为字符串值:
$sql = "SELECT * FROM scores WHERE (sortDate <= $today AND sport = '$sportID') AND (homeID = $teamID OR awayID = $teamID) ORDER BY gameDate DESC";
这样展开后的SQL就会变成sport = 'football',符合字符串字段的查询语法。
2. 使用预处理语句(更安全推荐)
直接拼接变量到SQL里存在SQL注入风险,更稳妥的方式是用预处理语句,它会自动处理数据类型,同时杜绝注入问题。举个MySQLi的例子:
// 假设你用的是MySQLi连接 $stmt = $conn->prepare("SELECT * FROM scores WHERE (sortDate <= ? AND sport = ?) AND (homeID = ? OR awayID = ?) ORDER BY gameDate DESC"); $stmt->bind_param("sisi", $today, $sportID, $teamID, $teamID); // 对应参数类型:s=字符串,i=整数 $stmt->execute(); $result = $stmt->get_result();
用PDO的写法类似:
$stmt = $pdo->prepare("SELECT * FROM scores WHERE (sortDate <= ? AND sport = ?) AND (homeID = ? OR awayID = ?) ORDER BY gameDate DESC"); $stmt->execute([$today, $sportID, $teamID, $teamID]); $results = $stmt->fetchAll(PDO::FETCH_OBJ);
3. 开发阶段排查技巧
建议在开发时开启错误提示,或者手动检查SQL执行结果,比如:
$result = mysqli_query($conn, $sql); if (!$result) { echo "SQL错误:" . mysqli_error($conn); // 直接输出具体的SQL错误信息 exit; }
这样能快速定位SQL层面的问题,而不是只看到PHP的属性访问错误。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

