Php Mysqli查询结果出现问题
我正在尝试使用mysqli方法创建登录表单。我没有收到任何错误,但在这两种情况下(正确或不正确的身份验证),我都会收到IF条件结果的第二部分“您不被允许!”Php Mysqli查询结果出现问题,php,mysql,mysqli,Php,Mysql,Mysqli,我正在尝试使用mysqli方法创建登录表单。我没有收到任何错误,但在这两种情况下(正确或不正确的身份验证),我都会收到IF条件结果的第二部分“您不被允许!” 我有一个名为users的表和两列(email,pass),其中包含用户的电子邮件和密码。现在你能告诉我我做错了什么吗?感谢您忘记运行查询。请参阅。首先连接到数据库,然后使用mysql\u query($query)执行查询 出于某种原因,您正在使用mysql和mysqli函数。这应该得到更新。这也是假设变量$mysqli包含有效的mysql
我有一个名为users的表和两列(email,pass),其中包含用户的电子邮件和密码。现在你能告诉我我做错了什么吗?感谢您忘记运行查询。请参阅。首先连接到数据库,然后使用
mysql\u query($query)执行查询代码>
出于某种原因,您正在使用mysql和mysqli函数。这应该得到更新。这也是假设变量$mysqli
包含有效的mysqli数据库连接:
<?php
include_once('db.php');
$eMail = mysqli_real_escape_string($mysqli,$_POST["eMail"]);
$passWord = mysqli_real_escape_string($mysqli,$_POST["psword"]);
$query = $mysqli->query("SELECT count(*) FROM users WHERE (email='$eMail' AND pass='$passWord') LIMIT 1");
if( $mysqli->num_rows($query) > 0 ) {
echo "You are allowed.";
}else{
echo "You are not allowed!.";
}
mysqli_free_result($query);
$mysqli->close();?>
为了支持mysqli
和/或pdo
函数,不鼓励使用mysql扩展
您的代码失败,因为没有调用mysql\u query
函数,因此在这一行代码中:
$query > 0
您所做的只是验证字符串是否大于0,这就是为什么总是得到错误结果的原因
我已经将我的面向对象登录方法修改为(大部分)过程登录方法
下面是通过将参数绑定到准备好的语句来处理用户输入的不同方法:
function login($email, $password, $mysqli){
if($login_stmt = $mysqli->prepare("SELECT Pass,Salt from Users WHERE Email = ? LIMIT 1")){
$login_stmt->bind_param('s',$email);
//The line above prevents SQL Injection
$login_stmt->execute();
$login_stmt->store_result();
$rows = $login_stmt->num_rows;
$login_stmt->bind_result($db_pass,$salt); //Stores the result in the $db_pass and $salt variables
$login_stmt->fetch();
$password = hash('sha512',$password.$salt); //This is a method I'm using to encrypt using sha512 encription
if($rows==1){//The user exists
if($db_pass==$password){
//User logged in, do your stuff here
return true;
} else {
//password not correct
return false;
}
} else{
return false; //no user
}
} else {
//Prepared statement failed
return false;
}
}
这里的主要区别在于,prepared语句和bind_param
将如何防止代码上的SQL注入
我希望这有帮助。干杯请不要在新代码中使用mysql_*函数。它们不再得到维护,社区已开始恢复。看到了吗?相反,你应该学习并使用或。如果你不能决定,将帮助你做出选择。如果你想学习,这里是。这是你的完整代码吗?如果是这样,你就错过了很多步骤。更不用说,混合和匹配MySQL库。嗨,Jason,完整的代码是什么意思?如果您指的是HTML和连接到数据库部分,我已经将它们放在了单独的文件中,如include_once('db.php')和login.index,您能告诉我您的确切意思吗?代码中的$query
是一个字符串,而不是查询或结果。您必须使用mysqli对象进行查询,例如:$db->query($query)
。如果下面的一个答案是正确的,请检查示例,请将其标记为正确,否则堆栈溢出将永远不会知道您的问题已经解决。考虑一些有问题的投票问题,其他类似问题的用户可以更容易地找到答案。HI VLCEKMI3,我正在使用MyQuLi库。我仍然需要运行MySqLQuyIE()方法约翰吗?我正在使用MyQuLi库。我仍然需要运行MySqLQueIE()方法吗?您的代码显示您正在使用旧的MySqL**函数。mysqli函数都以mysqli开始(以过程格式使用时)。而且,是的,您仍然需要调用mysql\u query()或mysqli\u query()来实际执行您的sql。嗨,Samuel,我用了您的代码,现在什么都没有得到。这只是一个空白页
<?php
include_once('db.php');
$eMail = mysqli_real_escape_string($mysqli,$_POST["eMail"]);
$passWord = mysqli_real_escape_string($mysqli,$_POST["psword"]);
$query = $mysqli->query("SELECT count(*) FROM users WHERE (email='$eMail' AND pass='$passWord') LIMIT 1");
if( $mysqli->num_rows($query) > 0 ) {
echo "You are allowed.";
}else{
echo "You are not allowed!.";
}
mysqli_free_result($query);
$mysqli->close();?>
$query > 0
function login($email, $password, $mysqli){
if($login_stmt = $mysqli->prepare("SELECT Pass,Salt from Users WHERE Email = ? LIMIT 1")){
$login_stmt->bind_param('s',$email);
//The line above prevents SQL Injection
$login_stmt->execute();
$login_stmt->store_result();
$rows = $login_stmt->num_rows;
$login_stmt->bind_result($db_pass,$salt); //Stores the result in the $db_pass and $salt variables
$login_stmt->fetch();
$password = hash('sha512',$password.$salt); //This is a method I'm using to encrypt using sha512 encription
if($rows==1){//The user exists
if($db_pass==$password){
//User logged in, do your stuff here
return true;
} else {
//password not correct
return false;
}
} else{
return false; //no user
}
} else {
//Prepared statement failed
return false;
}
}