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。これが true の場合、loggedin フラグを設定できます。

ユーザーのログインを維持するには、$_SESSION 変数を設定するだけです。を設定できます$_SESSION['logged_in'] = true;。これにより、この変数が設定されている場合、ユーザーが既に認証されていることを知ることができます。ユーザーがセッションを終了したい場合は、変数の設定を解除してください (そしてセッションを破棄してください)。

また、もう1つ気づいたこと:

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();

これらが役に立つかもしれません:
データベース アクセスに PHP の PDO を使用すべき理由
Phpass を使用した安全なパスワード

于 2012-08-11T02:16:51.633 に答える