PHP mysqli实现网页电影检索展示功能的报错排查
异常根因定位
- SQL语法不兼容列名规则:
filme表中Nume Film、Actori、Data aparitiei等字段名包含空格,未使用反引号包裹时MySQL无法识别字段定义,查询直接返回语法错误,mysqli_query()执行失败返回布尔值false,后续对该值调用fetch_assoc()方法即触发致命错误。 - 查询逻辑顺序颠倒:原代码在拿到查询返回值后,先调用
fetch_assoc()取数据,再通过mysqli_num_rows()判断结果数,完全违背了MySQLi的执行逻辑。 - 跳转逻辑导致变量丢失:
header()跳转属于全新HTTP请求,原请求中赋值的$row数组不会被保留;跳转后的URL仅携带info=exist参数,未携带搜索关键词,后续匹配到info=exist分支时,代码根本未执行数据库查询流程,直接尝试输出未定义的$row变量,触发未定义变量提示。 - 跳转代码未终止执行:调用
header()后未加exit,代码会继续向下运行,引发额外逻辑混乱。
修正实现方案
核心调整思路
去掉多余的跳转逻辑,所有检索、判断、输出流程在同一请求内完成;规范SQL字段写法,调整查询执行顺序,补充安全防护。
修正后代码
数据库连接文件 connect.php(原有代码无需调整)
<?php $connect = mysqli_connect('localhost','username','password','databasename'); if (!$connect){ die('Conectarea la baza de date nu a reusit'); } ?>
检索展示主文件 movies.inc.php
<?php session_start(); require 'connect.php'; $page_content = ''; // 处理搜索请求 if(!empty($_GET['search']) && isset($_GET['search'])) { $searched_keyword = trim($_GET['search']); // 带空格字段名用反引号包裹,使用预处理语句避免SQL注入 $sql = "SELECT * FROM `filme` WHERE `Nume Film` = ?"; $stmt = mysqli_prepare($connect, $sql); mysqli_stmt_bind_param($stmt, 's', $searched_keyword); mysqli_stmt_execute($stmt); $query_result = mysqli_stmt_get_result($stmt); // 校验查询结果有效性 if($query_result && mysqli_num_rows($query_result) > 0) { $movie_info = mysqli_fetch_assoc($query_result); // 构造电影信息展示块,对输出内容做转义避免XSS $page_content = ' <div style="max-width: 600px; margin: 20px auto; padding: 20px; border: 1px solid #f0f0f0; border-radius: 8px;"> <h3>'.htmlspecialchars($movie_info['Nume Film']).'</h3> <p>主演:'.htmlspecialchars($movie_info['Actori']).'</p> <p>上映日期:'.htmlspecialchars($movie_info['Data aparitiei']).'</p> <p>Box Office 数据:'.htmlspecialchars($movie_info['Box Office']).'</p> <p>用户评分:'.htmlspecialchars($movie_info['Rating']).'</p> </div> '; } else { // 输出不存在提示 $page_content = '<p style="text-align: center; color: red; font-size: 20px;">Filmul nu este in baza de date!</p>'; } mysqli_stmt_close($stmt); } // 渲染完整页面 echo '<!DOCTYPE html><html><body style="padding: 20px;">'; // 嵌入搜索表单 echo ' <form method="GET" action="movies.inc.php" autocomplete="off"> <input type="text" name="search" placeholder="Cauta un film..."> <input style="background-color: #111111; color: white; cursor: pointer;" type="submit" value="Cauta"> </form> '; echo $page_content; echo '</body></html>'; ?>
调整说明
- 完全移除了原有的跳转逻辑,避免跨请求的变量丢失问题,按Rating字段检索的场景也可直接复用该逻辑,不会再出现未定义变量提示。
- 所有含空格的字段统一用反引号包裹,解决SQL语法报错问题。
- 调整查询执行顺序:先校验返回的结果集有效性,再取行数、取数据,杜绝对布尔值调用方法的致命错误。
- 引入预处理语句替代字符串拼接SQL,规避SQL注入风险;所有输出内容做转义处理,避免XSS漏洞。
内容的提问来源于stack exchange,提问作者user15414733
相关产品推荐
相关产品推荐

