2017-05-28 8 views
0

私のデータベースからデータを抽出する際に問題があります。sqlデータをPHP変数に変換する

私がしたいのは、ログインフォームを使用してログインすることです。このフォームには、ユーザー名とパスワードが含まれています。データベースには、user_typeというフィールドがあります。

ログイン後、入力ユーザー名はPHP変数に入れられ、$ _SESSIONに入れられます。これはうまく動作します。

しかし、user_typeは変数には入れません。コードを参照してください:

$sql = "select name, password FROM users WHERE name='$username' AND 
password='$shapassword'"; 

$sql1 = SELECT user_type FROM users WHERE name='$username'"; 

$resultaat = mysqli_query($connection, $sql); 
$counter = mysqli_num_rows($result); 

$usertype = mysqli_query($connection, $sql1); 

if ($counter == 1) { 
    session_regenerate_id(); 
    $_SESSION['session_login']'= array (
     "username"=> $username, 
     "usertype"=> $usertype); 
    header ("location:../index.php"); 
    session_write_close(); 
    mysqli_close($connection); 
} 

echo $_SESSION['session_login']['usertype']; 

私が間違っていることを教えていただけますか?

+1

あなたは '$ sql1'に最初の引用符がありません。したがって、クエリは決して実行されず、 '$ usertype'は決して設定されません。 –

+0

なぜ2つのクエリ? – RamRaider

答えて

0

元のコードにはいくつかの問題がありましたが、いくつかは単純に印刷されている可能性があります。コードはSQLインジェクションに対して脆弱ですので、可能な限り準備文を使用する必要があります。

2番目のクエリの結果に関係なく2番目のクエリが実行されたため、2つのSQLクエリを使用する必要はないようでしたが、なぜuser_typeフィールドを同時に選択しないのですか?

指定されたコードスニペット内で定義されていない変数ではなく、レコードセットから値を選択する必要があります。

$sql = "select `name`, `password`, `user_type` FROM `users` WHERE `name`='$username' AND `password`='$shapassword'"; 
$result = mysqli_query($connection, $sql); 
if($result && mysqli_num_rows($result)==1){ 
    while($rs=mysqli_fetch_result($result)){ 
     $_SESSION['session_login']=array (
      'username'=> $rs['name'], 
      'usertype'=> $rs['user_type'] 
     ); 
    } 
    mysqli_close($connection); 
    session_regenerate_id(); 
    header ("location:../index.php"); 
} 
+0

PHP 7.0を使用しているので、これはほとんど私のために働いたmysqli_fetch_resultはもう動作しません。しかし、mysqli_fetch_assoc($ result)を使うと、私に必要な結果が得られました。 Ram Raiderに感謝します。 – tinus087

0

あなたがしようとしているコードは非常に厄介です。あなたは1つで2つのクエリを実行できます。 (私の理解から)

あなたのコードは、次の操作を行う必要があります。

  1. チェックし、データベースに入力されたユーザ名&入力されたパスワードが行に等しい場合。あなたは、SQLインジェクションを防ぐためにベストプラクティスを使用する必要がありますので、私はprepared statementsを使用することをお勧め行数= 1

場合

  • は、ユーザーのタイプを取得します。

    私の意見では、動作するはずのコードのより安全で最適化されたバージョンです。

    $sql = "select name, password, user_type FROM users WHERE name= :username"; 
    
    $stmt = $connection->prepare($sql); 
    $stmt->bindParam(':username', $username); 
    $stmt->execute(); 
    $result = $stmt->fetch(PDO::FETCH_ASSOC); 
    $stmt->closeCursor(); // closes connection to DB. 
    
    if($stmt->rowCount() === 1) 
    { 
    //Do check to see if password matches (not sure if you have it hashed or not) 
    if($password === $result['password']) //basic password checker. 
    { 
        session_regenerate_id(); 
        $_SESSION['session_login']= array (
        "username"=> $result['username'], 
        "usertype"=> $result['user_type']; 
    } 
    
    echo $_SESSION['session_login']['usertype']; 
    
  • 関連する問題