使用JS+PHP插入数据库时出现Maximum call stack size exceeded错误
解决jQuery中「Maximum call stack size exceeded」错误
嗨,我来帮你排查这个问题!首先先指出你代码里一个明显的小失误,再分析栈溢出的核心原因:
首先看JavaScript部分的拼写错误:你把lname写成了lanme:
var lanme = $("#lname").val(); // 这里的变量名应该是lname,不是lanme
这个错误会导致lname参数无法正确传递给PHP,但它通常不会直接引发栈溢出,真正的问题大概率出在其他地方,下面是最可能的原因和解决办法:
1. tableData()函数引发了循环事件触发
你在AJAX请求成功后调用了tableData(),如果这个函数内部存在以下操作,就会形成无限循环,最终耗尽调用栈:
- 重复绑定了
#submitBtn的点击事件(比如每次调用tableData()都重新执行一次$("#submitBtn").on("click", ...),导致事件叠加,每次点击触发N次回调) - 间接触发了表单提交动作(比如刷新页面后自动触发提交,或者函数里的逻辑意外触发了按钮点击)
解决建议:
- 打开
tableData()的代码,检查是否有上述问题,确保它只负责刷新表格数据,不会触发表单提交或重复绑定事件 - 如果确实需要在
tableData()里绑定事件,记得先解绑再绑定,避免叠加:$("#submitBtn").off("click").on("click", function(e) { // 你的回调逻辑 });
2. 事件绑定重复执行
如果你的页面脚本存在重复执行$(document).ready()代码的情况(比如tableData()里又加载了这段绑定代码),会导致#submitBtn被多次绑定点击事件,每次点击触发大量AJAX请求,极端情况下就会出现栈溢出。
解决建议:
- 把按钮点击事件的绑定代码放在只会执行一次的位置,或者用上面提到的
off()方法先解绑再绑定,确保每次只有一个事件回调生效
修复后的JavaScript代码(先修正拼写错误)
$(document).ready(function(){ // 先解绑再绑定,避免事件叠加 $("#submitBtn").off("click").on("click",function(e){ e.preventDefault(); var fname = $("#fname").val(); var lname = $("#lname").val(); // 修正拼写错误 $.ajax({ url : "insertData.php", type : "POST", data : {fname:fname, lname:lname}, success : function(data){ if(data == 1){ tableData(); // 请确保这个函数不会引发循环事件 }else{ alert("Can't save record"); } } }); }) });
先修正拼写错误,然后重点排查tableData()函数的逻辑,这是引发栈溢出最常见的原因。
内容的提问来源于stack exchange,提问作者Sami Ullah
相关产品推荐
相关产品推荐

