PHP调用get_episode_by_police查询无返回值,$result为空问题求助
问题排查及修复方案
核心错误点
- 参数使用错误:调用
get_episode_by_police时传入的是$Ermittler[$x][0](单个字符串值),但方法内部将入参$Ermittler当成数组取$Ermittler[0],实际拿到的是字符串的第一个字符,和预期查询条件完全不符。 - SQL语句变量解析错误:单引号包裹的SQL语句不会解析PHP变量,语句中的
$Ermittler[0]会被当成纯文本而非变量值传入数据库。 mysqli_query用法错误:原生mysqli_query仅支持数据库连接+SQL语句两个入参,不支持直接写%s占位符传参,当前写法属于语法错误,直接导致查询失败。- 多余的数据库实例化:方法内部重复
new mysqli($db)完全多余,外部已经传入了可用的数据库连接$db,重复创建反而可能导致连接冲突。 - 可选问题:字段名
Ertaussstrahlung大概率是拼写错误,德语正确拼写为Erstausstrahlung(首播含义),字段名错误也会导致查询无返回。
修复后的代码
方法实现修复
public function get_episode_by_police($db, $ermittler) { // 用预处理语句防SQL注入,同时解决参数传递问题 $stmt = mysqli_prepare($db, "SELECT titel, Erstausstrahlung, stadt FROM folge WHERE Ermittler = ?"); mysqli_stmt_bind_param($stmt, "s", $ermittler); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 处理查询结果,支持多条数据返回,仅需单条的话可以只调用一次fetch $data = []; while ($row = mysqli_fetch_assoc($result)) { $data[] = $row; } mysqli_stmt_close($stmt); return $data; }
调用端优化
原代码中循环内每次赋值$result会覆盖上一次的结果,建议用数组存储所有查询结果:
$gateway = new EpisodeGateway(); $db = $gateway->acces_db(); $Ermittler = $gateway->get_hauptkommissar($db); $allResult = []; // 存储所有查询结果 for($x=0; $x < sizeof($Ermittler); $x++) { echo "<strong>".$Ermittler[$x][0]."</strong>"; echo "<br>"; $allResult[] = $gateway->get_episode_by_police($db, $Ermittler[$x][0]); }
额外排查建议
- 打开PHP错误提示:在代码顶部加
error_reporting(E_ALL); ini_set('display_errors', 1);,可以直接看到语法报错信息,快速定位问题。 - 每次查询后加错误判断:比如
if(!$result) echo mysqli_error($db);可以直接输出数据库返回的错误详情。
内容的提问来源于stack exchange,提问作者Math142
相关产品推荐
相关产品推荐

