Php 使用PDO函数通过MySQL服务器验证用户名/密码
我在使用PDO功能正确连接MySQL服务器时遇到一些问题。 我不能从数据库中查询我需要什么,我也不太确定使用什么PDO函数。 因此,我得到0。 我希望验证通过数据库输入的密码和用户名,并在信息正确时发出if语句启动会话 这是我的更新代码: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
<?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()的意思是什么?这完全没有意义。为什么有两个问题?为什么每个人都这么喜欢这个没用的伯爵?看,大卫。你是这里少数几个头脑清醒的人之一,这让我觉得这段代码更令人惊讶。这个答案