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

PHP调用自定义Db类select方法查询MySQL始终返回0结果如何解决

问题排查及解决方法

存在的错误点

  • 参数不匹配:Db类的select方法仅定义了2个入参($colName字段名、$table表名),但调用时传入了4个参数,导致$table实际接收到的值是'toggl_cid'而非你预期的'project',查询的表名完全错误自然返回空结果。
  • SQL语法错误:
    1. 表名不能用单引号包裹,MySQL中表名/字段名如果需要转义应使用反引号`,用单引号会被识别为普通字符串,无法匹配到对应表
    2. 你错误地把Or 1=1直接拼接在表名后面,没有加WHERE关键字,属于SQL语法错误,会导致查询直接执行失败
  • PHP语法错误:调用Db类select方法时,name用了反引号包裹,在PHP中反引号是执行系统命令的语法,会导致此处传入的值不是字符串'name',产生非预期结果
  • 字段查询逻辑错误:你的Db类select方法只接收单个$colName参数,无法同时查询id、name、toggl_cid三个字段,就算参数传对了也只能拿到单个字段的值,后续输出另外两个字段会报错。

修正后的代码

1. 修正classDb.php中的Db类select方法

public function select($colNames, $table)
{
    // 字段名基础转义处理,生产环境建议用预编译语句
    $colNames = array_map(function($col){
        return "`".trim($col, "`")."`";
    }, explode(',', $colNames));
    $colStr = implode(',', $colNames);
    // 表名转义,修正SQL语法
    $table = "`".trim($table, "'`")."`";
    $sql = "SELECT $colStr FROM $table";
    $result = $this->conn->query($sql);
    if ($result && $result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Toggl_cid: " . $row["toggl_cid"]. "<br>";
        }
    } else {
        // 调试阶段可打开输出错误信息,上线后删除
        // echo "查询错误: " . $this->conn->error;
        echo "0 results";
    }
    $this->conn->close();
}

2. 修正classProject.php中的调用逻辑

public function select(){
    // 多个字段用逗号拼接成字符串,第二个参数传入表名
    $this->Db->select('id,name,toggl_cid', 'project');
}

额外优化建议

  • 生产环境不要直接拼接SQL语句,使用PDO或者mysqli的预编译语句避免SQL注入风险
  • 不要在数据库操作类中直接输出内容,改为返回结果数组由上层逻辑处理输出,复用性更强
  • 不要每次查询后直接关闭数据库连接,避免后续其他查询触发连接失效报错,可统一在脚本执行结束时自动关闭连接

内容的提问来源于stack exchange,提问作者Zyfella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 09:30:03