使用 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-&gt;prepare() 如果使用占位符$stmt-&gt;bind_param("ss", $username, $password);,则绑定参数 执行 将结果绑定到变量$stmt-&gt;bind_result($username, $password) 现在可以使用$stmt-&gt;fetch() 获取数据 关闭准备好的语句$stmt-&gt;close

我认为您不清楚$stmt-&gt;bind_result() 已经设置了变量。在您的情况下,您可能只从表中获取 1 行,所以 $stmt-&gt;fetch() 就足够了。如果您有多行,则需要一个循环来使用数据。

示例:

$a = array();
while ($stmt->fetch()) 
    $a = array('username' => $username, 'password' => $password);

关于用户和密码匹配: 你现在有

$_POST['username'];
$_POST['password'];
$username;
$password;

因此您必须创建一个检查$_POST['username'] == $username &amp;&amp; $_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 登录的主要内容,如果未能解决你的问题,请参考以下文章

mysqli 简单的php注册登录功能

不能用哈希密码登录 - Mysqli PHP

登录php和mysqli

Mysqli 上 Php 的登录注销脚本问题

使用Mysqli从SQL生成XML

PHP登录页面因root用户错误而拒绝访问,并期望参数1为mysqli,bool给定[重复]