Ajax请求报mysqli_stmt_execute(): Property access is not allowed错误如何解决
错误原因分析
- 预处理语句使用流程错误:你初始化了
mysqli_stmt对象后,没有调用mysqli_stmt_prepare()将SQL语句和语句对象绑定,直接执行mysqli_stmt_execute()就会触发你看到的报错。而且你当前直接拼接SQL语句,完全没有用到预处理的参数绑定功能,还存在严重的SQL注入风险。 - 参数解码重复:前端已经用
encodeURIComponent()对参数编码,PHP的$_REQUEST会自动完成URL解码,你额外调用urldecode($c)会导致带特殊字符的公司名称匹配错误。 - 结果集读取错误:
mysqli_stmt_get_result()返回的是结果集对象,不能直接用[0]取数据,需要先调用fetch_assoc()/fetch_row()方法读取行数据。 - 错误输出导致颜色值非法:PHP执行报错时会输出HTML格式的错误信息,不是合法的十六进制颜色值,color输入框识别失败就会默认回退到
#000000。
修正后的PHP代码
<?php $c = $_REQUEST["c"] ?? ""; require 'database.php'; if ($c !== "") { // 预处理SQL语句使用占位符,避免注入风险 $sql = "SELECT color FROM dreiecke WHERE firma = ?"; $stmt = mysqli_stmt_init($conn); // 先将SQL语句和预处理对象绑定 if (mysqli_stmt_prepare($stmt, $sql)) { // 绑定参数,s表示参数为字符串类型 mysqli_stmt_bind_param($stmt, "s", $c); // 绑定完成后再执行语句 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 读取结果集的第一行数据 $row = mysqli_fetch_assoc($result); echo isset($row['color']) ? $row['color'] : "#ff22ff"; mysqli_stmt_close($stmt); } else { echo "#ff22ff"; } } else { echo "#ff22ff"; } ?>
可选优化建议
- 可以在AJAX请求的
onload回调里加一层格式校验,确认返回值是合法的十六进制颜色格式再赋值,避免异常输出导致输入框显示异常。 onkeyup事件可以加防抖逻辑,避免频繁输入时发送大量无用请求。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

