Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 使用PDO函数通过MySQL服务器验证用户名/密码_Php_Mysql_Pdo - Fatal编程技术网

Php 使用PDO函数通过MySQL服务器验证用户名/密码

Php 使用PDO函数通过MySQL服务器验证用户名/密码,php,mysql,pdo,Php,Mysql,Pdo,我在使用PDO功能正确连接MySQL服务器时遇到一些问题。 我不能从数据库中查询我需要什么,我也不太确定使用什么PDO函数。 因此,我得到0。 我希望验证通过数据库输入的密码和用户名,并在信息正确时发出if语句启动会话 这是我的更新代码: <?php // if a value is given if (isset($_POST['username' && 'password')); { // starts the session created if login

我在使用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>

文件夹



您不应该在准备好的语句中使用
,并且
$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 a value is given
if (isset($_POST['username' && 'password'));
{


您不应该在准备好的语句中使用
,并且
$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 a value is given
if (isset($_POST['username' && 'password'));
{


某些数据库可能返回SELECT语句返回的行数。但是,并非所有数据库都能保证这种行为,因此不应依赖于see。您可以使用
COUNT(*)
fetchColumn()
来模拟
rowCount()


某些数据库可能返回SELECT语句返回的行数。但是,并非所有数据库都能保证这种行为,因此不应依赖于see。您可以使用
COUNT(*)
fetchColumn()
来模拟
rowCount()


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

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

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

密码散列 永远不要在数据库中存储普通密码。相反,必须使用专用函数对密码进行哈希运算-

然后,要验证密码,请使用
password\u 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";
    }
}

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

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

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

密码散列 永远不要在数据库中存储普通密码。相反,必须使用专用函数对密码进行哈希运算-

然后,要验证密码,请使用
password\u 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";
    }
}


请不要在数据库中存储纯文本密码。我的用户名和密码在数据库中设置为varchar。我是否应该使用加密来加密$username和$password,并将其与数据库中加密的用户名和密码进行检查?您不应该对其进行加密。但你应该这样做。在我先接通后,这是不是很容易做到的?是的。只要你这么做,不说我,现在就行了请不要在数据库中存储纯文本密码。我的用户名和密码在数据库中设置为varchar。我是否应该使用加密来加密$username和$password,并将其与数据库中加密的用户名和密码进行检查?您不应该对其进行加密。但你应该这样做。在我先接通后,这是不是很容易做到的?是的。只要你这么做,不说我,现在就行了那么,您将如何对服务器进行查询?@FriedBitz这一切都由prepared statement处理hmm okai,我现在正在联系服务器提供商:)为什么会被否决?这是迄今为止最接近正确答案的答案。请注意。谢谢,它现在正在工作@Yogeshuthar,你对rowCount()的意思是什么不能依赖?那么你将如何对服务器进行查询?@FriedBitz这一切都由prepared Statement处理hmm okai,我正在联系服务器提供商:)为什么会被否决?这是迄今为止最接近正确答案的答案。请注意。谢谢,它现在正在运行@Yogeshuthar,你对rowCount()的意思是什么?这完全没有意义。为什么有两个问题?为什么每个人都这么喜欢这个没用的伯爵?看,大卫。你是这里少数几个头脑清醒的人之一,这让我觉得这段代码更令人惊讶。这个答案