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
相关产品推荐
相关产品推荐

