PHP调用自定义Db类select方法查询MySQL始终返回0结果如何解决
问题排查及解决方法
存在的错误点
- 参数不匹配:Db类的
select方法仅定义了2个入参($colName字段名、$table表名),但调用时传入了4个参数,导致$table实际接收到的值是'toggl_cid'而非你预期的'project',查询的表名完全错误自然返回空结果。 - SQL语法错误:
- 表名不能用单引号包裹,MySQL中表名/字段名如果需要转义应使用反引号
`,用单引号会被识别为普通字符串,无法匹配到对应表 - 你错误地把
Or 1=1直接拼接在表名后面,没有加WHERE关键字,属于SQL语法错误,会导致查询直接执行失败
- 表名不能用单引号包裹,MySQL中表名/字段名如果需要转义应使用反引号
- 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
相关产品推荐
相关产品推荐

