Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使使用错误的用户名和密码(PHP/mySql),登录也会指向主页_Php_Mysql - Fatal编程技术网

即使使用错误的用户名和密码(PHP/mySql),登录也会指向主页

即使使用错误的用户名和密码(PHP/mySql),登录也会指向主页,php,mysql,Php,Mysql,我的登录表单即使使用错误的用户名和密码也能正常工作。我试着寻找答案,但找不到我的错误。代码如下: <?php include 'database.php'; ?> <?php if($_SERVER["REQUEST_METHOD"] == "POST"){ $username = mysqli_real_escape_string($connect,$_POST['username']); $password = mysqli_re

我的登录表单即使使用错误的用户名和密码也能正常工作。我试着寻找答案,但找不到我的错误。代码如下:

<?php
include 'database.php'; ?>

<?php

    if($_SERVER["REQUEST_METHOD"] == "POST"){
        $username = mysqli_real_escape_string($connect,$_POST['username']);
        $password = mysqli_real_escape_string($connect,$_POST['password']);

        $query = "SELECT username, password FROM tbl_membership WHERE username = 
        '$username' AND password = '$password'";
        $result = mysqli_query($connect, $query);
        $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
        $active = $row['active'];

        $count = mysqli_num_rows($result);

        if(mysqli_num_rows($query) > 0){
            $_SESSION["username"] = $username;
            $_SESSION["password"] = $password;
            header("location: welcome.php");
            exit();
        }if (mysqli_num_rows($query) != 0){
            echo "Invalid.";
        }
    }
?>

1:

请看这一行:

if(mysqli_num_rows($query) > 0) {
变量
$query
在这里是一个字符串。您需要使用刚刚设置的
$count
变量

// Check if we have a result and just one result
if($count == 1) {
2:

如果行有一个结果,则只需要获取行内容

$count = mysqli_num_rows($result);
if ($count == 1) {
    $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
    $active = $row['active'];
}
3:

尽量使用准备好的语句来避免SQL注入。在这种情况下,转义字符串是一个好的开始

$stmt = $conn->prepare("SELECT username, password FROM tbl_membership WHERE username =? AND password =?");

$stmt->bind_param('ss', $username, $password);

$stmt->execute();
$get_result = $stmt->get_result();
$row_count = $get_result->num_rows;
if ($row_count == 1) {
    $row = $get_result->fetch_assoc();
    $active = $row['active'];
    $_SESSION["username"] = $username;
    header("location: welcome.php");
    exit();
} else {
    echo "Invalid.";
}
4:


不要将密码保存为纯文本。强烈建议不要这样做,这会给您的客户/访客带来安全问题。使用某种形式的散列

永远不要以明文形式存储密码!。只存储密码哈希!使用PHP的和。如果您运行的PHP版本低于5.5(我真的希望您不是),您可以使用来获得相同的功能。了解防止SQL注入的准备语句在If
mysqli\u num\u rows($query)
中使用$count而不是mysqli\u num\u rows($query)
$query
是一个字符串…您是否检查了错误日志?一个好主意是在本地PHP环境中打开
display\u errors
。请在此处阅读更多:。这很可能会给你一些错误和警告。没有任何解释吗?一个好的答案包括一个关于你改变了什么,为什么以及如何解决这个问题的解释。不要仅仅发布一段代码,因为它不是建设性的。顺便说一句,OP不应该使用这两种方式,因为它没有使用预先准备好的语句,并且仍然依赖于使用明文密码。@MagnusEriksson我的老师告诉我没有不好的问题和好的答案。答案“回答”问题时有效。不过,有些解释很有用:)@Peter不是那个家伙,但我强烈反对你的老师。:-)
$stmt = $conn->prepare("SELECT username, password FROM tbl_membership WHERE username =? AND password =?");

$stmt->bind_param('ss', $username, $password);

$stmt->execute();
$get_result = $stmt->get_result();
$row_count = $get_result->num_rows;
if ($row_count == 1) {
    $row = $get_result->fetch_assoc();
    $active = $row['active'];
    $_SESSION["username"] = $username;
    header("location: welcome.php");
    exit();
} else {
    echo "Invalid.";
}