使用 Mysqli 进行 PHP 登录
Posted
技术标签:
【中文标题】使用 Mysqli 进行 PHP 登录【英文标题】:PHP login with Mysqli 【发布时间】:2012-08-08 06:56:08 【问题描述】:我对 php / mysqli 比较陌生,我无法验证用户身份,我不确定如何获取一行并验证数据,然后将用户重定向到新页面或显示错误(我只知道我需要使用_SESSION)。 基本上我在使用 fetch() 例程时遇到问题,编写此代码的正确方法是什么?
<?php
session_start();
$username = trim($_POST['username']);
$password = trim($_POST['password']);
/* Create a new mysqli object with database connection parameters */
$mysqli = mysqli_connect('localhost', 'root', '', 'draftdb');
if(mysqli_connect_errno())
echo "Connection Failed: " . mysqli_connect_errno();
exit();
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT Login_ID, Login_PW,
FROM login
WHERE Login_ID=? AND Login_PW =?"))
/* Bind parameters
s - string, b - boolean, i - int, etc */
$stmt -> bind_param("ss", $username, $password);
/* Execute it */
$stmt -> execute();
/* Bind results */
$stmt -> bind_result($username, $password);
/* Fetch the value */
if($stmt->fetch() == true)
$row =$query -> fetch();
$_SESSION['name'] = $row;
header("Location:/in.php");
exit();
else
echo 'Invalid Login';
/* Close statement */
$stmt -> close();
/* Close connection */
$mysqli -> close();
?>
【问题讨论】:
您确实需要对您的密码进行加盐和哈希处理。永远不要存储纯文本(甚至加密......)密码。 【参考方案1】:按照这个顺序
-
准备查询
$stmt->prepare()
如果使用占位符$stmt->bind_param("ss", $username, $password);
,则绑定参数
执行
将结果绑定到变量$stmt->bind_result($username, $password)
现在可以使用$stmt->fetch()
获取数据
关闭准备好的语句$stmt->close
我认为您不清楚$stmt->bind_result()
已经设置了变量。在您的情况下,您可能只从表中获取 1 行,所以 $stmt->fetch()
就足够了。如果您有多行,则需要一个循环来使用数据。
示例:
$a = array();
while ($stmt->fetch())
$a = array('username' => $username, 'password' => $password);
关于用户和密码匹配: 你现在有
$_POST['username'];
$_POST['password'];
$username;
$password;
因此您必须创建一个检查$_POST['username'] == $username && $_POST['password'] == $password
的if 语句。如果这是真的,你可以设置你的登录标志。
要让用户保持登录状态,只需设置一个 $_SESSION 变量。您可以设置$_SESSION['logged_in'] = true;
,如果设置了此变量,您可以知道用户已经通过身份验证。如果用户想结束他的会话,只需取消设置变量(并销毁会话)。
我还注意到一件事:
if($stmt->fetch() == true) // equals: if ($stmt->fetch())
【讨论】:
是的,我的问题是使用 with fetch() 从表中检索行然后检查参数的语法是什么? @Undermine2k Leon 描述了整个过程。只需阅读手册即可了解哪些参数接受此功能以及它们检索到的内容。你做对了。【参考方案2】:这有重大的安全问题,但要回答你的问题:
你可以这样做:
$sql = "SELECT Login_ID, Login_PW,
FROM login
WHERE Login_ID=?
";
$stmt = $mysqli->prepare( $sql );
// Do your thing...
// Make sure the user is found.
if ( ! $stmt->rowCount() )
return false;
// Retrieve your results as an associative array.
$user = $stmt->fetch();
// Check the password.
if ( ! $_POST['password'] == $user['Login_PW'] ) )
return false;
$_SESSION['name'] = $user['Login_ID'];
header("Location:/in.php");
exit();
您可能会发现这些有用:Why you Should be using PHP’s PDO for Database AccessSecure Passwords with Phpass
【讨论】:
以上是关于使用 Mysqli 进行 PHP 登录的主要内容,如果未能解决你的问题,请参考以下文章