PHP 7.2中mysqli_stmt::execute传数组无效,是否必须用bind_param?
问题分析与解决
是否必须使用bind_param?
不是必须的,PHP 7.2.18完全支持mysqli_stmt::execute()直接传入数组作为参数,无需提前调用bind_param。你遇到的无数据插入且无报错的情况,大概率是以下某个细节没处理到位:
常见问题排查点
占位符使用错误
MySQLi仅支持匿名占位符?,不能用命名占位符(比如:cityName)。如果你的SQL语句里用了命名占位符,传数组不会生效,且默认不会抛出错误。数组参数与占位符数量/类型不匹配
比如SQL里有3个?,但你传入的数组只有2个元素;或者字段是整数类型,但传了非数值字符串,这时候execute会静默失败,不会插入数据。未开启错误报告,忽略了执行失败的信息
MySQLi默认是错误静默模式,execute失败时只会返回false,不会主动报错。你需要手动开启错误报告,才能看到具体问题:// 放在数据库连接前,开启严格错误报告 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);预处理语句初始化失败
如果prepare方法执行失败(比如SQL语法错误、表不存在),你直接调用execute也不会有任何效果,且默认不会报错。必须确保prepare成功生成了语句对象。
正确示例代码
// 开启错误报告,方便排查问题 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 初始化数据库连接 $conn = new mysqli('localhost', '你的用户名', '你的密码', '你的数据库名'); // 正确的SQL语句,用?作为占位符 $sql = "INSERT INTO myCity (name, countryCode, population) VALUES (?, ?, ?)"; $stmt = $conn->prepare($sql); // 传入与占位符数量、类型匹配的数组 $params = ['Guangzhou', 'CHN', 15000000]; $stmt->execute($params); // 验证插入结果 echo "成功插入 " . $stmt->affected_rows . " 条数据";
总结
只要确保占位符正确、参数数组匹配,且开启错误报告排查潜在问题,就可以不用bind_param直接传数组给execute。如果还是有问题,开启错误报告后抛出的异常会直接告诉你具体原因。
内容的提问来源于stack exchange,提问作者Jose Manuel Abarca Rodríguez
相关产品推荐
相关产品推荐

