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

AJAX传递Div ID至PHP时遇数组键未定义等错误的解决求助

问题解决步骤

核心问题分析

  • AJAX数据传递格式错误:直接传递字符串product且设置了processData: false和contentType: false,导致PHP无法解析为$_POST["data"]键值对
  • 变量未初始化:$response仅在数据库查询有结果时赋值,无匹配结果时会触发未定义警告
  • SQL注入风险:直接将用户输入拼接到SQL语句中,存在安全隐患

1. 修正AJAX代码

将传递的数据改为键值对格式,移除不必要的processData和contentType配置(这两个配置仅用于上传文件等特殊场景):

$(function () { 
    $('.product').on('click', function (e) {
        var product = $(this).attr('id');
        
        $.ajax({
            type: "post",
            url: 'php/recipe-container.php',
            data: { data: product }, // 改为键值对格式,对应PHP的$_POST["data"]
            success: function(response) {
                $(".display_recipe").html(response);
            }
        });
    });
});

2. 修正PHP代码

初始化$response、添加参数合法性检查、改用预处理语句避免SQL注入:

<?php
function display(){
    // 提前初始化响应变量,避免无查询结果时的未定义警告
    $response = '';
    
    // 检查POST参数是否存在
    if(!isset($_POST["data"])){
        $response = "缺少必要参数";
        echo $response;
        return;
    }
    $product = $_POST["data"];

    // 建立数据库连接,增加连接失败的错误处理
    $con = mysqli_connect("localhost", "root", "", "cookbook");
    if(!$con){
        $response = "数据库连接失败: ".mysqli_connect_error();
        echo $response;
        return;
    }

    // 使用预处理语句防止SQL注入,这是安全规范
    $sql = "SELECT * FROM product WHERE name = ?";
    $stmt = mysqli_prepare($con, $sql);
    mysqli_stmt_bind_param($stmt, "s", $product);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);

    while($row = mysqli_fetch_assoc($res)) {
        $name = $row['name'];
        $description = $row['description'];
        $date = $row['date'];

        $response = $name.'<br>';
        $response .= $description.'<br>';
        $response .= $date.'<br>';
    }

    // 无匹配数据时给出提示
    if(empty($response)){
        $response = "未找到对应菜品的信息";
    }

    echo $response;
    mysqli_close($con);
}

if ($_SERVER['REQUEST_METHOD'] === 'POST'){ 
    display(); 
}
?>

额外说明

HTML中直接requirePHP文件的操作,会在页面首次加载时触发一次GET请求,此时不会执行display()函数,属于正常逻辑,不影响AJAX请求的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:09:13