2

我对 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();
    ?>
4

2 回答 2

10

按照这个顺序

  1. 准备查询$stmt->prepare()
  2. 如果使用占位符,则绑定参数$stmt->bind_param("ss", $username, $password);
  3. 执行
  4. 将结果绑定到变量$stmt->bind_result($username, $password)
  5. 数据现在已准备好被拾取$stmt->fetch()
  6. 关闭准备好的语句$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;

所以你必须做一个 if 语句来检查$_POST['username'] == $username && $_POST['password'] == $password. 如果这是真的,您可以设置您的登录标志。

要让用户保持登录状态,只需设置一个 $_SESSION 变量。您可以设置$_SESSION['logged_in'] = true;,如果设置了此变量,这使您有可能知道用户已经通过身份验证。如果用户想结束他的会话,只需取消设置变量(并销毁会话)。

我还注意到另一件事:

if($stmt->fetch() == true) { } // equals: if ($stmt->fetch()) { }
于 2012-08-11T00:15:15.363 回答
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 Access
Secure Passwords with Phpass

于 2012-08-11T02:16:51.633 回答