2017-11-25 7 views
0

私はログインしているすべてのユーザーからさまざまな統計情報を取得しようとしています。現在ログインしているときに私はユーザー名でセッションを設定しています。次に、私はこのユーザー名からIDを取得し、同じIDを持つテーブルを再度チェックし、そのテーブルから行をフェッチしようとしています。ユーザー名と一致IDをセッションとして取得する方法は?

私の推測では、ログイン時にユーザー名のみのセッションを開始しているので、セッションがID行を提供しないためデータを取得するコードが動作しません。私はそれをする方法を確信している、または私はそれについても正しい場合。

私はすべての助けを感謝します、私は本当にここで立ち往生しています。

これは私のログインコードです:

$query = "SELECT password FROM users WHERE username = '$username'"; 
    $result = mysqli_query($conn, $query); 
    $row = mysqli_fetch_assoc($result); 

    //USERDATA 
    $dbPassword = $row['password']; 

    if (password_verify($password, $dbPassword)) 
    { 
     // echo "The details are correct."; 
     $_SESSION['loggedin'] = $username; 
    require_once('../../frontend/templates/account-actions.php'); 
    } 
    else 
    { 
     echo "Passwords do not match!"; 
    } 

これは、ログインしたユーザ名のIDからの統計データをフェッチするために私のコードです:

$id = $_SESSION['loggedin']; 
$query = "SELECT * FROM stats WHERE id='$id'"; 
$stmt = mysqli_query($conn, $query); 
$result = mysqli_fetch_all($stmt,MYSQLI_ASSOC); 
+0

あなたのアプローチを修正する必要があります。原則として、すべてのテーブルに常にAuto Increment IDがあります。これにより、各エントリに固有の価値が与えられます。ユーザーのテーブルも同じです。ログインするときは、ログインしたユーザーのユーザーテーブルから自動インクリメントIDを保存します。だからSELECT *の代わりにSELECT *、言い表せないほどです。いいえ、あなたの統計表には、関係を持つためにここにユーザーテーブルからの自動増分IDを格納します。 –

+0

あなたはページの一番上にsession_startを作成しました – whoami

+0

@MohammedAkhtarZuberi私は、自分のユーザーテーブルに自動インクリメントIDを持っています。私のSELECTを見て、それを変更するためにiveが始めました。この関係を作成する必要がありますか?私はセレクトパスワードの代わりにSELECT *を使うとログインがパスワードを確認する方法を本当に理解していませんか? – Peterssoen

答えて

1

私は準備mysqliにコードを変換しています手続き的アプローチによるステートメント。あなたが適切SESSION変数を格納した後

$username = "username_to_search"; 
$password = "password"; //Password is in plain text since password hash has been used. 

$stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE username = ?"); 

/* bind parameters for markers */ 
mysqli_stmt_bind_param($stmt, "s", $username); //"s" defines the type of data in the following variables, i.e. String for $username. 

/* execute query */ 
mysqli_stmt_execute($stmt); 

mysqli_stmt_store_result($stmt); 

$total_rows = mysqli_stmt_num_rows($stmt); 

mysqli_stmt_bind_result($stmt, $id_fetched, $username_fetched, $password_fetched); //store every field fetched from the table in sequence. Note that I have added _fetched to make it easier to identify later. 

if ($total_rows > 0) { 
    while(mysqli_stmt_fetch($stmt)) { 
     if (password_verify($password, $password_fetched)) { 
      $_SESSION['user_id'] = $id_fetched; 
      $_SESSION['username'] = $username_fetched; 

      require_once('../../frontend/templates/account-actions.php'); 
     } 
     else { 
      echo "Invalid Password!"; 
     } 
    } 
} else { 
    echo "Invalid Username!"; 
} 

、今では簡単にこれに関連するすべてのものを見つけることができます。ユーザーに$_SESSION["user_id"]を検索させてください。

+0

ありがとう! SHA1の代わりにパスワードハッシュを使用して更新することは可能でしょうか? – Peterssoen

+0

パスワードハッシュでコードを修正しました。私は変更後にそれをテストしていないことに注意してください、しかしそれは動作するはずです。 –

+0

このエラーが発生すると、mysqli_stmt_bind_result():バインド変数の数が、行44のプリペアドステートメントのフィールド数と一致しません。 – Peterssoen

関連する問題