PHP/MYSQL-只能显示行中的一个元素,可能存在问题吗?

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

我正在尝试用PHP/MySQLi构建登录验证系统。
\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'];
}