1

我在使用 PDO 功能正确连接到 MySQL 服务器时遇到了一些问题。我无法从数据库中查询我需要什么,我也不太确定要使用哪些 PDO 函数。因此,我得到 0。我希望验证我通过数据库输入的密码和用户名,并在信息正确的情况下创建一个 if 语句来启动会话。

这是我的更新代码:

<?php
// if a value is given
if (isset($_POST['username' && 'password'));
{

    // starts the session created if login info is correct
    session_start();

    // connectivity to MySQL server
    $db = new PDO('mysql:host=host;dbname=name', 'username', 'password');

    // information entered in form made into a variable
    $username = PDO::quote($_POST['username']); 
    $password = PDO::quote($_POST['password']);

    // after pressing login, checking if the variables exist in the database
    if ($_POST['button'] == 'Login')
    {
        $query = $db->query("SELECT COUNT(*) FROM login WHERE username=:username AND password=:password");
        $query->bindValue(':username', $username, PDO::PARAM_STR);
        $query->bindValue(':password', $password, PDO::PARAM_STR);
        $query->execute();

        // Check the number of rows that match the SELECT statement 
        if($query = $db->fetch(PDO::FETCH_OBJ)) 
        {
            echo "No records found";
        }
        else
        {
            header("Location: members.php");
            $_SESSION['username'] = $_POST['username'];
        }
    }   
    // After pressing register, stores variable and adds it in register field
    else if ($_POST['register'] == 'Register')
    {
        header("Location: register.php");
        $_SESSION['usernamereg'] = $_POST['username'];
    }

    // If no button is pressed, send to index
    else
    {
        header("Location: http://www.gjertgjersund.com");
    }

// closes the if value is given statement
}
?>

<!DOCTYPE html>
<html>
<head>
    <title> Folder </title>
    <link rel="stylesheet" type="text/css" href="frontpage.css">
</head>
<body>

    <div id="box">
    <div id="wrap">


        <center>
        <img src="./img/logo.png" alt="logo">

        <form action='index.php' method='POST' autocomplete='off'>

        <div class="usernameform">
        <input type='text' name='username' style='border: none; font-size: 20px;'>
        </div>

        <br />

        <div class="passwordform">
        <input type='password' name='password' style='border: none; font-size: 20px;'>
        </div>

        <br />

        <div class="registerlogin">
        <input type='submit' name='button' value='Login' class='input'>
        <input type='submit' name='register' value='Register' class='inputtwo'>
        </div>

        </form>
        </center>

    </div>
    </div>

</body>
</html>
4

3 回答 3

1

这是一个非常好的问题,部分原因是它展示了许多糟糕的做法,遗憾的是,这些做法一直存在到今天,距离这个问题发布已经近十年了。让我们整理一下

联系

我在使用 PDO 功能正确连接到 MySQL 服务器时遇到了一些问题。

这是一个公平的问题,任何地方的连接都只是一行代码。М必须设置任何重要的选项,请参阅我编写的规范连接示例。您可以将连接代码存储在单独的文件中,然后将其包含在脚本中。

密码哈希

您永远不应该在数据库中存储纯密码。相反,必须使用为此目的制作的专用函数对密码进行哈希处理 - password_hash()

然后,要验证密码,您可以使用password_verify()

在您正确散列密码之前,请不要再移动。请注意,散列密码的字段大小必须为 60 个字符。

验证用户名和密码的代码

最后,现在我们可以编写代码了。它可能更简单,只需几行。实际上,只需要一个条件。我们不应该提供有关是否找不到登录名或用户名的任何详细信息 - 只是“登录名和密码不匹配”。所以这里是:

<?php
if (isset($_POST['username']))
{
    // get the PDO instance
    include 'pdo.php';

    // getting the record for the given username
    $stmt = $pdo->prepare("SELECT * FROM login WHERE username=?");
    $stmt->execute([$_POST['username']]);
    $user = $stmt->fetch();
    // verifying the password
    if ($user && password_verify($_POST['password'], $user['password']))
    {
        // starts the session created if login info is correct
        session_start();
        $_SESSION['username'] = $user['username'];
        header("Location: members.php");
        exit;
    } else {
        $error = "Login and password don't match";
    }
}

在这里,我们正在检查是否存在这样的用户以及密码是否在单个条件下匹配。

于 2013-06-11T11:26:36.463 回答
0

您不必'在准备好的语句中使用并且$username是字符串而不是整数

$query = $db->query("SELECT * FROM login WHERE username=:username AND password=:password");
$query->bindValue(':username', $username, PDO::PARAM_STR);
$query->bindValue(':password', $password, PDO::PARAM_STR);
$query->execute();
$row_count = $query->rowCount();
 //{ remove it

你的if条件是错误的改变

// if a value is given
if (isset($_POST['username' && 'password'));
{

// if a value is given
if (isset($_POST['username']) and isset($_POST['password']))
{

键盘

于 2013-06-10T11:04:54.143 回答
0

某些数据库可能会返回 SELECT 语句返回的行数。但是,不能保证所有数据库都可以使用此行为,因此不应依赖此行为,请参阅Manual。您可以在以下查询中使用COUNT(*)andfetchColumn()来模拟rowCount().

$query = $db->query("SELECT COUNT(*) FROM login WHERE username=:username AND password=:password");
$query->bindValue(':username', $username, PDO::PARAM_STR);
$query->bindValue(':password', $password, PDO::PARAM_STR);
$query->execute();
    // Check the number of rows that match the SELECT statement 
    if($query->fetchColumn() == 0) {
        echo "No records found";
     }else{
            //CODE FOR Success 
            //Etc
    }
于 2013-06-10T12:37:31.203 回答