数据库不会使用mysqli第二次更新

时间:2014-02-11 13:58:35

标签: php mysql sql mysqli

我目前正在PHP中创建一个登录脚本。当用户尝试在短时间内登录<5次时,该帐户将被临时锁定,并且用户会收到一封电子邮件,以便立即重新激活该帐户。这一切都正常,用户登录失败,数据库更新,电子邮件发送。然后,当我尝试使用第二或第三封电子邮件第二次执行此操作时,数据库根本不会更新。使其适用于下一封电子邮件的唯一方法是删除从数据库中第一封电子邮件创建的所有值。

以下是登录php文件的相关代码。

<?php
include_once 'db_connect.php';
include_once 'functions.php';

...

}   elseif (login($email, $password, $mysqli) == 2)
        $theid = getId($email, $mysqli); /// this is a function that get´s id based on email located in functions.php
        if ($stmt = $mysqli->prepare("SELECT emailSent FROM login_attempts WHERE user_id = ? LIMIT 1")) 
        { 
            $stmt->bind_param('i', $theid);                 
            $stmt->execute();       
            $stmt->bind_result($skickat); 
            $stmt->fetch();
            $stmt->close();
            if ($skickat == '0') /// email sent
            {
                $thehash = md5( rand(0,10000) ); /// Just a random md5 hash for reactivation
                $emailsent = 1;
                if ($insert_stmt = $mysqli->prepare("UPDATE `secure_login`.`login_attempts` SET `ResetHash` = ?, `emailSent` = ? WHERE `login_attempts`.`user_id` = ?")) {
                    $insert_stmt->bind_param('sss', $thehash, $emailsent, $theid);
                    if (! $insert_stmt->execute()) {
                        header('Location: ../error.php?err=Registration failure: INSERT');
                        exit();
                    }
                }
                else {
                    header('Location: ../error.php?err=Registration failure: INSERT');
                    exit();
                }
            else /// alread sent,  we already sent email. Show error that decribe email is sent and it´s locked
            {           
                $_SESSION['lgnerror']= '<p class="error">Error 2</p>';
                header('Location: ../login.php');
                exit();
            }  
/// Email code starts from here
$_SESSION['lgnerror']= '<p class="error">Error 1</p>';

这是位于functions.php

中的getId函数
function getId($email, $mysqli) 
{   
    if ($stmt = $mysqli->prepare("SELECT id FROM members WHERE email = ? LIMIT 1")) 
    { 
        $stmt->bind_param('i', $email);                
        $stmt->execute();       
        $stmt->bind_result($resultat); 
        $stmt->fetch();
        $stmt->close();
        return $resultat; 
    } 
    else 
    {        
        // Could not create a prepared statement        
        header("Location: ../error.php?err=Database error: cannot prepare statement");        
        exit();    
    }
}

为什么代码仅适用于第一封电子邮件而不是第二次尝试时?我认为错误位于上面提供的代码中,如果需要只是注释,我将提供更多代码。

测试代码在第5次尝试时显示$ _SESSION ['lgnerror']“错误2”,当它在5号attemt显示“错误1”时。这表明$ skickat!='0',即使数据库指示第二封电子邮件ID的emailSent =='0'。我认为错误可能是用户ID没有更新,所以它只检查第一个电子邮件ID =='1'。我仍然是PHP和Mysqli的初学者,所以这可能不是错误所以请看看,让我知道你的想法。您认为错误是什么?我如何解决这个问题,以便我可以将其用于更多帐户而不是一个帐户,最好是使用预准备语句的安全性?

1 个答案:

答案 0 :(得分:1)

我不确定,但我认为你在这里犯了一个错误。

在函数getId中,您将整个电子邮件的bind_param作为一个整数,它应该是一个字符串。

应该是这样的:

function getId($email, $mysqli) 
{   
    if ($stmt = $mysqli->prepare("SELECT id FROM members WHERE email = ? LIMIT 1")) 
    { 
        $stmt->bind_param('s', $email);                
        $stmt->execute();       
        $stmt->bind_result($resultat); 
        $stmt->fetch();
        $stmt->close();
        return $resultat; 
    } 
    else 
    {        
        // Could not create a prepared statement        
        header("Location: ../error.php?err=Database error: cannot prepare statement");        
        exit();    
    }
}