我正在尝试为类的项目测试一个简单的用户帐户注册页面,我正在尝试创建一个检查,通知用户他们的电子邮件是否已经在数据库中,因此不会将它们添加到数据库中再次。这是我的PHP代码。
<?php
$collegeid = mysql_real_escape_string('1');
$email = mysql_real_escape_string('abc@test.com');
$password = mysql_real_escape_string(md5('test1'));
$name = mysql_real_escape_string('Test Test');
$bday = mysql_real_escape_string('1900-01-01');
$class = mysql_real_escape_string('Freshman');
//echo "<p>Test</p>";
$servername = "localhost";
$username = redacted;
$serverpassword = redacted;
$dbname = redacted;
$conn = new mysqli($servername, $username, $serverpassword, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$checkquery = "SELECT * FROM Student WHERE Email = '$email'";
$insertquery = "INSERT INTO Student (CollegeID, Name, Birthday, Email, Classification, Password) VALUES ('$collegeid', '$name', '$bday', '$email', '$class', '$password')";
if (mysql_num_rows($conn->query($checkquery)) > 0)
{
echo "Error: Email already in use";
}
else
{
$conn->query($insertquery);
echo "Account Created.";
}
?>
但是,它总是告诉我帐户已创建,无论该用户是否在数据库中。
答案 0 :(得分:4)
你正在混合mysql和mysqli函数。您不应该使用mysql函数,因为它们已被弃用,并且您似乎使用mysqli几乎所有内容,除了转义您的值并检查找到的行数。
问题是由您使用mysql_real_escape_string
引起的。如果找不到mysql_*
数据库连接,则会返回false
,这相当于一个空字符串,因此您要检查数据库中的空值,并且每次找不到时,都会添加新的一行。
为了保护自己免受mysqli上的sql注入,你应该切换到预备语句,而不是使用mysqli_real_escape_string
。
修改:如果出现错误,也会mysql_num_rows
返回false ...