PHP/MYSQL-只能显示行中的一个元素,可能存在问题吗?
我正在尝试用PHP/MySQLi构建登录验证系统。PHP/MYSQL-只能显示行中的一个元素,可能存在问题吗?,php,mysql,mysqli,Php,Mysql,Mysqli,我正在尝试用PHP/MySQLi构建登录验证系统。\u POST数据是通过AJAX请求/jQuery发送的,但是我已经尽可能简化了代码,允许您在没有不必要的数据的情况下模拟查询。为了简化,我还省略了字符串验证器(FILTER\u SANITIZE\u string等) 代码(简化)如下所示: $email = "mymail@mail.com"; $haslo = "averyhardpassword12345"; if(!filter_var($email, FILTER_VALIDATE
\u POST
数据是通过AJAX请求/jQuery发送的,但是我已经尽可能简化了代码,允许您在没有不必要的数据的情况下模拟查询。为了简化,我还省略了字符串验证器(FILTER\u SANITIZE\u string
等)
代码(简化)如下所示:
$email = "mymail@mail.com";
$haslo = "averyhardpassword12345";
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$output = json_encode(array('type'=>'error', 'text' => 'Email address is not valid.'));
die($output);
}
if(strlen($haslo)<3 || strlen($haslo)>20){
$output = json_encode(array('type'=>'error', 'text' => 'Password must have between 3 and 20 characters.'));
die($output);
}
$mysqli = new mysqli("localhost", "myDbUsername", "myDbPW", "myDbName");
$usercheckquery = "SELECT * FROM users WHERE email='$email'";
$result = $mysqli->query($usercheckquery);
while($row = mysqli_fetch_assoc($result))
$emailbaza = $row['email'];
$haslobaza = $row['haslo'];
echo $haslobaza;
echo $emailbaza;
if (password_verify($haslo, $haslobaza) && $email == $emailbaza && !empty($data)) {
$output = json_encode(array('type'=>'message', 'text' => 'Zalogowano...'));
die($output);
} else {
$output = json_encode(array('type'=>'error', 'text' => 'Podany email lub hasło są nieprawidłowe.'));
die($output);
}
$email=”mymail@mail.com";
$haslo=“averyhardpassword12345”;
如果(!filter_var($email,filter_VALIDATE_email)){
$output=json_encode(数组('type'=>'error','text'=>'电子邮件地址无效');
模具(产量);
}
if(斯特伦($haslo)20){
$output=json_encode(数组('type'=>'error','text'=>'密码必须包含3到20个字符');
模具(产量);
}
$mysqli=newmysqli(“localhost”、“myDbUsername”、“myDbPW”、“myDbName”);
$usercheckquery=“从电子邮件=“$email”的用户中选择*;
$result=$mysqli->query($usercheckquery);
while($row=mysqli\u fetch\u assoc($result))
$emailbaza=$row['email'];
$haslobaza=$row['haslo'];
echo$haslobaza;
echo$emailbaza;
如果(密码验证($haslo,$haslobaza)&&$email==$emailbaza&&!空($data)){
$output=json_编码(数组('type'=>'message','text'=>'Zalogowano…);
模具(产量);
}否则{
$output=json_encode(数组('type'=>'error','text'=>'Podany email lub hasło sąnieprawidłowe');
模具(产量);
}
问题是-我无法找出这段代码的错误。我最后的如果语句从未返回true,我还发现我可以回送行['email']
,但当我回送行['haslo']
时,它什么也不返回
希望有人能告诉我哪里出了错
编辑:
噢,haslo
保存在haslo
列的db中,并通过password\u散列($haslo,password\u BCRYPT)生成代码>Haslo
列是varchar(255)
您的while循环需要大括号来包含您对$row
否则,$row最终将返回null,$haslobaza也将返回null(此时将抛出索引错误)
@斯库奇,我的天,真不敢相信这么简单。。。谢谢D将我的评论移动到一个答案:)让第二双眼睛看到这样的小东西总是好的。问题:如果查询限制为1,并且没有while子句,这会更安全吗?您正在加载一行还是多行?如果有许多行,则每个循环都会覆盖您对数据的使用。每个循环都会向前推动光标,您甚至可能不需要为一个结果执行这样的循环。它意味着查找与给定邮件连接的单个帐户,因此它应该始终只返回一行。我应该在查询中使用限制1
?这会强制对while()
循环进行任何更改吗?让我澄清一下-除非我将两个变量都打括号,否则它只会设置遇到的第一个变量并与第一个$row结果匹配对吗?是的,只有第一个变量会被最后一行的结果填充,而第二个变量会在while用尽null后被命中,$row的赋值发生在测试while之前。省略大括号表示while循环仅在下一行代码上执行。“仅在下一行代码上执行”。应该是:只有下一个语句。您可以在一行上有多个语句;)@彼得·安德沃尔你在技术上是正确的,是最好的正确。
while($row = mysqli_fetch_assoc($result))
{
$emailbaza = $row['email'];
$haslobaza = $row['haslo'];
}