2016-09-29 15 views
0

私はついに準備文を使い始めることにしました。しかし、私は50/50で何が正しいかではない。私は準備されたステートメントでログインページを作ろうとしています。上記のコメントと同様にセッションの準備文

$username = $_POST['username']; 
     $password = md5($_POST['password']); 

     $sql = "SELECT * FROM users WHERE BINARY username=? AND BINARY password=?"; 
      if($stmt = $db->prepare($sql)){ 
       $stmt->bind_param("ss",$username,$password); 
       $stmt->execute(); 
       $result = $stmt->get_result(); 
       $num_rows = $result->num_rows; 

       if($num_rows >= 1){ 

        $_SESSION['loggedin'] = $username; 
        $_SESSION['country'] = $num_rows['country']; 
        $_SESSION['email'] = $num_rows['email']; 
        $_SESSION['avatar'] = $num_rows['u_avatar']; 
        $_SESSION['is_gm'] = $num_rows['is_gm']; 
        $_SESSION['user_lvl'] = $num_rows['user_lvl']; 
        $_SESSION['totalposts'] = $num_rows['post_total']; 
        $_SESSION['totalcoins'] = $num_rows['coins_total']; 
        $_SESSION['totalvotes'] = $num_rows['vote_total']; 
        $_SESSION['secquest'] = $num_rows['sec_quest']; 
        $_SESSION['secanswer'] = $num_rows['sec_answer']; 
        $_SESSION['join_date'] = $num_rows['join_date']; 

        header("Location: /index.php"); 
        exit(); 

       } else { 
        echo "<p class='error_msg'>No accounts could be found with the given credentials.</p>"; 
       } 

       $stmt->free_result(); 
       $stmt->close(); 
       $db->close(); 
      } 
+2

' - > get_result()'呼び出しの後、mysqliの 'fetch_ * 'フレーバー、' _assoc() 'または' _row() '、同じドリル – Ghost

+1

' $ num_rows'が行の__number__ 、行配列/オブジェクトではないので '$ num_rows ['country']'は無効です。サーバーログに警告/エラーが表示されるはずです –

+0

'' username'はDB戻り値を使用していないので動作します。 '$ username = $ _POST ['username']; '。 – chris85

答えて

2

、あなたが->get_result()を使用した後、その時間をフェッチする:

それはユーザ名を除いて $_SESSION

を任意のセッション値を取得しないようにしかし、それはここに私のコードだと思われます

$stmt->execute(); 
$result = $stmt->get_result(); 
$num_rows = $result->num_rows; 

if($num_rows >= 1) { 
    $row = $result->fetch_assoc(); // fetch it first 
    $_SESSION['loggedin'] = $username; 
    $_SESSION['country'] = $row['country']; 
    $_SESSION['email'] = $row['email']; 
    $_SESSION['avatar'] = $row['u_avatar']; 
    $_SESSION['is_gm'] = $row['is_gm']; 
    $_SESSION['user_lvl'] = $row['user_lvl']; 
    $_SESSION['totalposts'] = $row['post_total']; 
    $_SESSION['totalcoins'] = $row['coins_total']; 
    $_SESSION['totalvotes'] = $row['vote_total']; 
    $_SESSION['secquest'] = $row['sec_quest']; 
    $_SESSION['secanswer'] = $row['sec_answer']; 
    $_SESSION['join_date'] = $row['join_date']; 

    header('Location: /index.php'); 
    exit(); 
} 

$num_rows['join_date']を使用することは意味がありません。実際には実際の行数が得られることがわかっているので、必要な値は含まれていません。あなたはすでに数字が含まれていることを確認しましたif($num_rows >= 1) {

Sidenote:それはmd5を捨て、password_hash + password_verifyのコンボを使用し始めます。

+1

2つ以上のレコードが必要な場合は、 '$ result-> fetch_assoc'をループしてください(ただし、ユーザー名/パスワードのレコードが1つ以上あるのは設計上の欠陥のようです)。クエリに 'limit 1 'を追加してください。 – chris85

+0

@ chris85誰かが同じ/重複した資格情報を持っていて、最初に起こらないようにすると狂ってしまうでしょう。 – Ghost

+0

私はこのフェッチで1つの行を見つけることを目指しています。この回答をありがとう、@Ghost – Synyster