You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:31:12