You need to enable JavaScript to run this app. PHP mysqli实现网页电影检索展示功能的报错排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 06:57:10