【问题标题】:mysqli - warning and errormysqli - 警告和错误
【发布时间】:2011-03-21 01:14:18
【问题描述】:

我有这个代码,但我有两个错误。我在 cmets 中输入了错误

if(!empty($_POST['email']) && validateEmail($email)) {
    $email = $_POST["email"];
    if ($sql = $db->prepare("select email from users where email=?")) {

        $sql->bind_param('s', $email);

        $sql->execute();

        $sql->bind_result($email);

        while ($sql->fetch()) {
            $salt = "PiuwrO1#O0rl@+luH1!froe*l?8oEb!iu)_1Xaspi*(sw(^&.laBr~u3i!c?es-l651";

            $password = md5($salt . $userExists["email"]);

            $pwrurl = "www.yoursite.com/reset_password.php?q=" . $password;

            $mailbody = "Dear user,<br><br>If this e-mail does not apply to you please ignore it. It appears that you have requested a password reset at our website www.yoursitehere.com<br>
            To reset your password, please click the link below. If you cannot click it, please paste it into your web browser's address bar.<br> <a href='$pwrurl'>$pwrurl</a>  <br> <br>
            Thanks,\nThe Administration";

            $mail->MsgHTML($mailbody);

            $mail->AddAddress("dxxb@hotmail.com","Nome da Pessoa");

            $mail->IsHTML(true);

            if(!$mail->Send()) {
                echo "Deu erro: " . $mail->ErrorInfo;
            } else {
                echo "Enviado com sucesso";
            }
        }
        $sql->close();
        $db->close();
    }

    ($sql = $db->prepare('insert into password_reset (code) values (?)')); // Warning: mysqli::prepare() [mysqli.prepare]: Couldn't fetch mysqli in

    $sql->bind_param('s', $password); // Fatal error: Call to a member function bind_param() on a non-object

    $sql->execute();
    $sql->fetch();
    $sql->close();
    $db->close();
}

所有代码都可以正常工作,但现在我需要在数据库中插入盐但我不能,我不知道为什么

谢谢

将代码编辑到最新版本

【问题讨论】:

    标签: php mysql database mysqli


    【解决方案1】:

    执行查询后,fetch 返回一个结果。可能还有更多——可能还有很多很多——所以你应该循环调用fetch 来获取它们。在处理完旧查询之前,您不应该prepare 一个新查询,这通常意味着fetching 结果的每一行和closeing(在您的情况下)$sql。否则,当您尝试发出另一个请求时,数据库仍在响应一个请求。

    【讨论】:

    • 不可能不止一个,因为我在注册前会检查每封电子邮件
    • 你仍然需要循环直到fetch返回NULL,然后调用close。您可能只需调用close 就可以逃脱惩罚,但最好让您的代码验证第二个fetch 确实返回NULL,否则假设代码中的其他内容可能依赖于(即只能返回一个结果)为假。
    • 你可能是对的,但我认为你的建议不能解决我的问题,因为我需要在另一个查询中进行查询,或者它是另一种方式?
    • 为什么需要在另一个查询中进行查询?如果您在执行第二个之前已经 closed 第一个,那么您的代码中的哪些内容将不起作用?
    • 我需要检查数据库中是否存在电子邮件,生成盐,存储在数据库中并发送电子邮件。所以我需要一个查询来检查电子邮件,另一个来存储盐,或者我错了?
    【解决方案2】:

    第一个错误说明了一切 - 您一次不能有超过 1 个“正在运行”的准备好的语句/查询。当您尝试准备另一条语句 (insert into ...) 时,您尚未完成从第一个查询 (select email ...) 中获取数据。

    【讨论】:

    • 好的,但是我该如何解决这个问题呢?用传统的mysql?我需要在该本地进行查询
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多