PHP中sendOTP函数执行成功却始终返回false的问题排查与解决
问题分析与解决方案
这个问题的根源其实非常直接:你的sendOTP函数没有显式返回任何值。在PHP中,如果函数没有写return语句,默认会返回null,而当null被用于布尔判断(比如你的if(sendOTP(...)))时,会被自动转换为false——这就是为什么明明数据库操作成功了,代码却还是走进了else分支。
下面是具体的修复步骤:
1. 让generateOTP返回数据库操作的结果
我们需要让生成OTP的函数返回执行状态,这样才能知道插入操作是否真的成功:
function generateOTP($theUser, $thePhone){ global $pdo; // 先删除旧OTP,记录执行结果 $stmt = $pdo->prepare("DELETE FROM otp WHERE phone = :phone"); $stmt->bindValue(':phone', $thePhone); $deleteSuccess = $stmt->execute(); if (!$deleteSuccess) { // 如果删除失败,可以在这里记录日志或者直接返回false return false; } // 生成新OTP并插入 $otp = rand(1000, 9999); $stmt = $pdo->prepare("INSERT INTO otp(phone, otp, type, validity)VALUES(:phone, :otp, :type, :val)"); $stmt->bindValue(':phone', $thePhone); $stmt->bindValue(':otp', $otp); $stmt->bindValue(':type', 'new'); $stmt->bindValue(':val', date('Y-m-d H:i:s', strtotime('+5 mins'))); // 返回插入操作的结果(成功为true,失败为false) return $stmt->execute(); }
2. 让sendOTP返回generateOTP的执行结果
现在只需要让sendOTP把generateOTP的结果传递回去即可:
function sendOTP($theUser, $thePhone){ global $pdo; // 直接返回generateOTP的返回值 return generateOTP($theUser, $thePhone); }
3. (可选)增加更严谨的错误检查
如果想要更稳妥,可以进一步检查prepare()是否成功(比如SQL语法错误时prepare会返回false),示例如下:
function generateOTP($theUser, $thePhone){ global $pdo; $stmt = $pdo->prepare("DELETE FROM otp WHERE phone = :phone"); if (!$stmt) { // 可以在这里捕获PDO错误,比如var_dump($pdo->errorInfo()); return false; } $stmt->bindValue(':phone', $thePhone); $deleteSuccess = $stmt->execute(); if (!$deleteSuccess) { return false; } $otp = rand(1000, 9999); $stmt = $pdo->prepare("INSERT INTO otp(phone, otp, type, validity)VALUES(:phone, :otp, :type, :val)"); if (!$stmt) { return false; } $stmt->bindValue(':phone', $thePhone); $stmt->bindValue(':otp', $otp); $stmt->bindValue(':type', 'new'); $stmt->bindValue(':val', date('Y-m-d H:i:s', strtotime('+5 mins'))); return $stmt->execute(); }
现在调用sendOTP时,就能正确根据数据库操作的结果进入对应的分支了。
内容的提问来源于stack exchange,提问作者Relaxing Music
相关产品推荐
相关产品推荐

