在我的表单页面上,我有两个名为name
和password
的文本框。
当用户点击提交时,它会将该数据发送到名为' name'的MySQL数据库中的两列中。和密码'。
记录数据后(这是我理解并且不需要帮助的部分),我希望用户进入登录页面并键入他/她的姓名和密码,如果数据库中已存在名称和密码数据(我不明白的部分),则允许进入网站。
我会使用以下查询:
SELECT * FROM tablename WHERE name & password = "'$_POST[name]', $_POST[password]'
答案 0 :(得分:2)
您应该使用AND
或&&
而不是单个&符号(&
),并将要绑定的变量与其列名相对应。
在将变量用于查询之前,还应考虑清理变量。您可以使用*_real_escape_string()
来阻止SQL injections。
$name = mysql_real_escape_string($_POST["name"]);
$password = mysql_real_escape_string($_POST["password"]);
"SELECT * FROM tablename WHERE name = '".$name."' AND password = '".$password."'"
但我能给你的最好建议是使用prepared statement而不是deprecated mysql_*
if($stmt = $con->prepare("SELECT * FROM tablename WHERE name = ? AND password = ?")){ /* PREPARE THE QUERY; $con SHOULD BE ESTABLISHED FIRST USING ALSO mysqli */
$stmt->bind_param("ss",$_POST["name"],$_POST["password"]); /* BIND THESE VARIABLES TO YOUR QUERY; s STANDS FOR STRINGS */
$stmt->execute(); /* EXECUTE THE QUERY */
$noofrows = $stmt->num_rows; /* STORE THE NUMBER OF ROW RESULTS */
$stmt->close(); /* CLOSE THE STATEMENT */
} /* CLOSE THE PREPARED STATEMENT */
为了保护密码,您还可以查看password_hash()
。
答案 1 :(得分:1)
请始终使用准备好的声明来执行来自代码外部的变量的SQL代码。将用户输入的变量连接到SQL代码是危险的(考虑SQL注入),您可以将预备语句与mysqli或PDO一起使用(推荐)。
Mysqli示例:
$mysqli = new mysqli("example.com", "user", "password", "database");
// error check you connection here
$query='select * from tablename where user =? AND password=?';
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $user,$password);
$stmt->execute();
if($stmt->num_rows!=1) {
// check failed
}else{
// check success
}
PDO示例(推荐)
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// error check you connection here
$query='select * from tablename where user =? AND password=?';
$stmt = $dbh->prepare($query);
$stmt->bindParam(1,$user);
$stmt->bindParam(2,$password);
$stmt->execute();
if($sth->fetchAll()) {
// check success
}else{
// check failure
}
此外,您还应考虑使用某种形式的单向密码加密(密码散列),然后将其存储在数据库中并将其与散列进行比较(最常用的方法是使用它) Bcrypt)。
答案 2 :(得分:0)
您可以使用类似
的内容
SELECT count(*) FROM tablename WHERE name = "'.$_POST[name].' AND password = "'. $_POST[password].'"
您应该期望count正好为1 - 表示有效用户,0 - 表示无效用户
大于1的任何内容都应该是无效的情况,表明数据库中存在某种不一致...
答案 3 :(得分:0)
您应该将变量分配给name&随后通过。
你可以试试这个:
$con = mysqli_connect("localhost","YOURUSER","YOURPASS","YOURDB");
if (mysqli_connect_errno())
{
echo"The Connection was not established" . mysqli_connect_error();
$user
= mysqli_real_escape_string($con,$_POST['user']);
$pass = mysqli_real_escape_string($con,$_POST['password']);
$query = "select * from tablename where user ='$user' AND password='$pass' ";
$run = mysqli_query($con,$query);
$check = mysqli_num_rows($run );
if($check == 0)
{
echo "<script> alert('Password or Email is wrong,try again!')</script>";
}
else
{
//get a session for user
$_SESSION['user']=$user;
// head to index.php; you can just put index.php if you like
echo"<script>window.open('index.php?login=Welcome to Admin Area!','_self')</script>";
}