PHP中如何通过条件语句实现函数的递归调用
解决三元运算符递归调用的问题
嘿,我注意到你想用三元运算符替代原本的if/else逻辑来实现递归,但当前的写法存在语法问题——三元运算符的两个分支必须是表达式,而return $random_number是一条语句,不能直接放在三元运算符里。
错误原因分析
你原来的代码行:
(mysqli_num_rows($run))?rand_num():return $random_number;
这里的问题在于,三元运算符要求?和:后面都得是可以求值的表达式,return是控制语句,不符合这个要求,所以会触发语法错误。
修正后的三元运算符写法
我们可以把return移到三元运算符的外面,让三元运算的结果作为返回值,这样就符合语法规则了:
function rand_num(){ global $conn; $random_number = mt_rand(10000, 99999); $sql = "select * from table where project_enumber = ".$random_number; $run = mysqli_query($conn, $sql); // 正确写法:将三元运算的结果返回,两个分支都是表达式 return mysqli_num_rows($run) ? rand_num() : $random_number; }
这样逻辑和你原本的if/else完全一致:如果查询到该随机数已存在,就递归调用自己生成新的;如果不存在,就返回当前的随机数。
额外的优化建议
- 避免SQL注入风险:虽然这里生成的是数字,但直接拼接SQL仍然不是最佳实践,建议使用预处理语句提升安全性:
function rand_num(){ global $conn; $random_number = mt_rand(10000, 99999); $sql = "select * from table where project_enumber = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "i", $random_number); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); $has_row = mysqli_stmt_num_rows($stmt) > 0; mysqli_stmt_close($stmt); return $has_row ? rand_num() : $random_number; }
- 替换递归为循环:递归存在栈溢出的风险(如果连续生成大量已存在的随机数),改用循环会更稳健,避免触发PHP的递归深度限制:
function rand_num(){ global $conn; do { $random_number = mt_rand(10000, 99999); $sql = "select * from table where project_enumber = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "i", $random_number); mysqli_stmt_execute($stmt); mysqli_stmt_store_result($stmt); $row_count = mysqli_stmt_num_rows($stmt); mysqli_stmt_close($stmt); } while ($row_count > 0); return $random_number; }
内容的提问来源于stack exchange,提问作者bansal
相关产品推荐
相关产品推荐

