我有以下PHP文件:
<!DOCTYPE html>
<html>
<body>
<?php
$name = $_POST["username"];
$password = $_POST["password"];
$con = mysql_connect("localhost", "root", "");
if (!$con) {
die('Connection Failed' . mysql_error());
}
mysql_select_db("login", $con);
$result = mysql_query("UPDATE data SET password ='$password' WHERE username='$name'");
if (!$result) {
echo "FAIL";
} else {
echo "Update successfully";
}
?>
</body>
</html>
这是HTML文件:
<body>
<form method="post" action="Edit.php">
<label>Name:</label>
<input type="text" name="username">
<br><br>
<label>PasswordL</label>
<input type="password:" name="password">
<br>
<input type="submit" value="edit">
</form>
无论我输入什么用户名,都会打印出更新成功。
如何检查数据库中是否存在用户名?我的PHP代码有问题吗?
答案 0 :(得分:1)
我的PHP代码有问题吗?
mysql_query
将始终返回true
甚至更新。要使用PDO
rowCount()
来检查是否有任何行受到影响。mysql_*
现已从PHP7
开始弃用
的问题。建议您切换到mysqli_*
或PDO
扩展。这是PDO
示例:<?php
if(isset($_POST["username"]) and isset($_POST["password"])){
$servername = "localhost";
$username = "user";
$password = "pass";
$dbname = "db";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//construct the sql query. I'm not sure if password is a reserved mysql keyword, be careful with that.
//http://dev.mysql.com/doc/refman/5.7/en/keywords.html
$sql = "UPDATE data SET password = :password WHERE username = :name ";
// Prepare statement
$stmt = $conn->prepare($sql);
//bind the post parameters to $sql
$stmt->bindParam(':password', $_POST["password"], PDO::PARAM_STR);
$stmt->bindParam(':name', $_POST["username"], PDO::PARAM_STR);
// execute the query
$stmt->execute();
// check if rowCount() returns 1 or more affected rows.
if($stmt->rowCount()){
echo "UPDATED SUCCESSFULLY";
}else{
echo "NOT UPDATED";
}
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
}else{
echo "Form is incomplete!";
}
答案 1 :(得分:0)
您没有收到错误的原因是,要求数据库在某些条件下更新记录并导致没有更新记录不是错误。如果存在语法错误,则只会出错。
使用当前代码,您可以使用lastApplied
检查是否有任何行已更新。
请注意,您使用的Mysql库已弃用且不安全。相反,您应该使用PDO或mysqli驱动程序来使用预准备语句。
答案 2 :(得分:0)
更新后您可以使用另一个select语句来检查记录是否存在用户名和密码。正如其他人所说,开始使用PDO并哈希密码(如果你还没有这样做)。你对sql注入黑客很开放。
SELECT 1 FROM db.table WHERE Username = ? AND Password = ? Limit 1