mySQLi和php新手,所以我一直试图将登录/注册系统作为练习。
完成了创建帐户页面,但在登录文件中,我想对其进行验证,以便在输入不存在的用户名时,它将回显出来"用户名不存在"
这里是php:
include("Database.php");
if(isset($_POST["login"])) {
$username = $_POST["username"];
$password = $_POST["password"];
$checkUsername = "SELECT username FROM Users WHERE username=$username";
$connected->query($checkUsername);
if(mysqli_num_rows($checkUsername) !=0 ){
$alreadyExists = "User Already Exists";
echo $alreadyExists;
} else {
echo "User does not exist";
}
}
它继续说用户名不存在,即使我选择了数据库中的用户名,所以我随后运行了这段代码:
echo "User does not exist" .mysqli_error($connected);
然后给了我这个错误信息:
Unknown column 'testuser' in 'where clause'
(测试用户是我输入的用户名,在数据库中)
我阅读了其他一些Stack Overflow的答案并尝试了这个:
"SELECT username FROM users WHERE $username=username"
和此:
"SELECT username FROM users WHERE username= ". '$username'"
似乎没什么用。
理想情况下,如果用户名已存在,则应该回显#34;用户名已经存在"
答案 0 :(得分:1)
我看到两个问题,都在上面的评论中提到过。
在MySQL查询中,字符串值需要引用它们 您看到的“未知列”错误表明存在此问题。
$checkUsername = "SELECT username FROM Users WHERE username='$username'";
另外,我养成quoting column names with backticks的习惯。
$checkUsername = "SELECT `username` FROM `Users` WHERE `username`='$username'";
(实际上,我习惯使用PDO ......但稍后会更多地使用参数化语句。)
num_rows
是查询result的一个属性,但您在字符串上尝试它。
$result = $connected->query($checkUsername);
if (mysqli_num_rows($result)>0) { ....
确定了您的代码的直接问题后,我同意@GordonLinnof和其他人使用parameterized queries和particularly object-oriented style所表达的观点,这是一种有用的开发方法
基本工作流程
准备好的语句执行包括两个阶段:准备和执行。在准备阶段,将语句模板发送到数据库服务器。服务器执行语法检查并初始化服务器内部资源以供以后使用。
这是一个基本的例子:
// build the query string. notice the question mark placeholder.
$sql = "SELECT `username` FROM `Users` WHERE `username`=?";
// prepare the statement. returns a statement object.
$stmt = $mysqli->prepare($sql);
// bind a parameter to the statement. note the "s" for "string" type.
$stmt->bind_param("s",$username);
// execute the statement.
$stmt->execute();
// get the number of rows from the statement result.
$row_count = $stmt->num_rows();
有关详细参考,请参阅:
Give me parameterized SQL, or give me death
When should I use prepared statements?
答案 1 :(得分:0)
您需要在您提供的示例中引用$ username。 "SELECT username FROM users WHERE username='$username'"
如前所述,您应该使用?
或将:username
命名为 <div class="col-md-6 to-animate-2">
<h3>Reservation Form</h3>
<div class="form-group ">
<form enctype="multipart/form-data" action="sendreservation.php" method="POST" name="reservations">
<label for="name" class="sr-only">Name</label>
<input id="name" class="form-control" placeholder="Name" type="text">
<label for="email" class="sr-only">Email</label>
<input id="email" class="form-control" placeholder="Email" type="email">
<label for="partysize" class="sr-only">Party Size</label>
<select class="form-control" id="partysize">
<option>Select a Party Size</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>10+</option>
</select>
<label for="occation" class="sr-only">Occassion</label>
<select class="form-control" id="occassion">
<option>Select an Occasion</option>
<option>Wedding Ceremony</option>
<option>Birthday</option>
<option>Others</option>
</select>
<label for="date" class="sr-only">Date</label>
<input id="datetime" class="form-control" placeholder="Date & Time" type="text">
<label for="message" class="sr-only">Message</label>
<textarea name="message" id="message" cols="30" rows="5" class="form-control" placeholder="Message"></textarea>
<div class="form-group ">
<input class="btn btn-primary" value="Send Message" type="submit" name="send">
</form>
</div>
</div>
</div>
,而不是来自用户输入的$ username。