当前,我正在创建一个注释系统,有时我必须验证将插入数据库中的ID是否存在。如果不存在,则返回,否则,再次生成。
这是我的功能:
function checkId($n) {
global $mysqli;
$query = mysqli_query($mysqli, "SELECT id FROM comments WHERE id = ".$n.""); //line error
if (!$query) {
die('Error: ' . mysqli_error($mysqli));
}
if(mysqli_num_rows($query) > 0){
checkId($n++);
return;
} else {
return $n;
}
}
可能您会告诉我使用AUTO_INCREMENT
,但是在这种情况下我无法执行。
错误是:Fatal error: Maximum function nesting level of '100' reached, aborting!
我已经尝试过自己修复它,但是我无法解决,您能帮我吗?谢谢。
答案 0 :(得分:1)
尝试这个简单的练习:在checkId函数内添加一个echo / print语句,该语句将打印$ n的值...您应注意,$ n的值将是连续发生100次,直到发生致命错误。
原因:在表达式checkId($n++)
中,您将++
用作“后缀增量”运算符。这意味着,$n
变量仅在调用嵌套的checkId(...)
函数之后 递增。基本上是这样:
checkId($n++)
...只是这个的简写:
checkId($n)
$n = $n + 1
对checkId
的第二次调用(具有相同的$n
值)将最终调用checkId($n++)
,这将触发 third 并使用完全相同的$n
值进行调用,然后一直执行直到PHP说“这太多了”,并因“致命错误”而崩溃……这是“堆栈溢出”错误,由方式:P
相反,使用prefix increment表达式checkId(++$n)
或诸如checkId($n + 1)
之类的简单表达式。 或者更好,通过一次对mysqli_query
的调用来弄清楚如何完成工作(顺便说一句,这是一个独立的问题)。认为您可以查询很多次,直到找到正确的东西,这意味着如果/当有很多人使用它时,您的应用程序将不会具有可伸缩性。 只要让数据库来完成繁重的工作即可。:)