【发布时间】:2022-08-04 04:40:18
【问题描述】:
我的代码工作正常,但是这个高效的代码,就像第 16 行(注释)一样吗?我正在考虑使用$row 并与上面提到的变量进行比较,而不是编写另一个 SQL 查询。
我尝试使用变量和$row[\'field name\'],但它抛出了一个错误:
尝试访问 null 类型值的数组偏移量
代码
<?php require(\'../private/autoload.php\'); if(isset($_GET[\'token\'])){ $msg = \"Email verified successfully, thank you.\"; $token = $_GET[\'token\']; $email_status = \"active\"; $sql = \"SELECT `email_token`, `email_status` FROM `users` where `email_token` = ? AND `email_status` = \'inactive\' LIMIT 1\"; $stmt = $conn->prepare($sql); $stmt->bind_param(\"s\", $token); $stmt->execute(); $result = $stmt->get_result(); $exist = $result->num_rows; if($exist == 0 ){ // $row = $result->fetch_array(MYSQLI_ASSOC); $sql = \"SELECT `email_token`, `email_status` FROM `users` where `email_token` = ? AND `email_status` = ? LIMIT 1\"; // Line 16 $stmt = $conn->prepare($sql); $stmt->bind_param(\"ss\", $token, $email_status); $stmt->execute(); $result = $stmt->get_result(); $exist = $result->num_rows; if($exist == 1){ ?> <script> alert(\"Email already verified.\"); window.location = \"../public/index.php\"; </script>; <?php exit(); ?> <?php }else{ ?> <script> alert(\"User not found.\"); window.location = \"../public/index.php\"; </script>; <?php } }else{ $sql = \"UPDATE `users` SET `email_status`= ? where `email_token` = ? LIMIT 1\"; $stmt = $conn->prepare($sql); $stmt->bind_param(\"ss\", $email_status, $token); $stmt->execute(); $stmt->close(); $_SESSION[\'msg\'] = $msg; $_SESSION[\'token\'] = $token; header(\'Location: mobile_verify.php\'); } }else{ header(\'Location: index.php\'); die(); } $conn->close(); ?>
-
查询太多...如果您获取“活跃”用户,这些用户不能同时处于非活跃状态。
-
@LarsStegelitz 那你有什么建议?在第一个查询中,我不应该使用 \"where
email_token= ? \" -
第一个查询已过时,因为您需要的所有信息都包含在第二个查询中。
-
@LarsStegelitz 那么这个怎么样。 \"SELECT
email_token,email_statusFROMuserswhereemail_token= ? LIMIT 1\"; ..... if(exist == 0){ $row = $result->fetch_array(MYSQLI_ASSOC); if($row[\'email_status\'] == \"active\"){ 然后执行此操作 }else{ 执行此操作 } } -
谢谢@LarsStegelitz,它可以完美地使用更少的代码和查询。
标签: php mysqli sql-update token