检查用户是否已经存在mysqli Prepared

时间:2014-04-06 09:45:40

标签: php mysqli prepared-statement registration

我试图让注册表格检查用户是否已经存在然后给出错误否则使该帐户但不知何故nto工作(我有点新手准备好的声明)帮助我,谢谢。请不要倒下,我知道已经有了答案,我读了但没有帮助我。

<?php
// Include database connection and functions here.
include 'db_connect.php';
include 'functions.php';

// The hashed password from the form
$password = $_POST['p'];
// Create a random salt
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
// Create salted password (Careful with the chilli)
$password = hash('sha512', $password.$random_salt);
$username = $mysqli->real_escape_string($_POST['username']);
$email = $mysqli->real_escape_string($_POST['email']);
    $stmt = $mysqli->prepare("SELECT * FROM members WHERE username = ? LIMIT 1"); 
    $stmt->bind_param('s', $username);
    $stmt->execute(); // Execute the prepared query.
    $stmt->store_result();
     if($stmt->num_rows == 1) {
        header("Location: '..\..\..\?registrationfailed=1'");
    }
    else
    {
    if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email,     password, salt) VALUES (?, ?, ?, ?)"))
{
$insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
// Execute the prepared query.
$insert_stmt->execute();
header("Location: '..\..\..\?success=1'");

}
else
{
header("Location: '..\..\..\?registrationfailed=1'");
}
    }

?>

1 个答案:

答案 0 :(得分:2)

您在传递给MySQL服务器的数据中使用mysqli_real_escape_string()作为预准备语句的变量。这不会奏效。

当您转义字符串时,该函数会将转义字符添加到单引号和双引号(以及其他字符之间)。当它被组装成一个查询时,SQL解析器会按照你的意图解释转义的字符。

使用预准备语句,查询与变量分开。准备好的阶段将查询传递给服务器,服务器解析查询并准备执行计划。

绑定变量并执行语句时,变量将传递到服务器并在执行计划中替换(查询)。由于解析器无法解析变量,因此未传递变量。如果您已经对它们进行了转义,则您传递的数据包含转义字符,然后解析器解析。因此,您的查询可能会失败。

这为您提供了防止SQL注入的保护,因为SQL注入操作的机制并不存在。这是预准备语句真正目的的一个有用的副作用,即解析和准备一次查询,然后使用不同的可变数据重复执行它。