2016-03-29 6 views
-1

まず、これはと関係がある。PDOフェッチ(PDO :: FETCH_ASSOC)が値を返さない

データベースの値を$ _SESSSION変数に格納しようとしています。最初は、username = userとpassword = passwordのような行をすべて選択しようとしました。

> 0を返した場合は、(PDO :: FETCH_ASSOC)をフェッチしてその行を取得しようとしました。 問題は、> 0を返しますが、FETCH_ASSOCは値を返しません。

これまで私が試したことは次のとおりです。あなたの状態の場合に、あなたの配列を比較することはできませんので、列0

から始まる、あなたの結果 セットに返されるPDO::FETCH_NUM:

<?php 
if(isset($_POST['btn_Save'])){ 
    $uname = $_POST['username']; 
    $pword = $_POST['password']; 
    $q = "SELECT * FROM `users` WHERE `username` = :username AND `password` = :password"; 
    $sql = $db->prepare($q); 
    $sql->bindParam(":username",$uname); 
    $sql->bindParam(":password",$pword); 
    $sql->execute(); 
    $rows = $sql->fetch(PDO::FETCH_NUM); 
    if($rows > 0){ 
    $rows2 = $sql->fetch(PDO::FETCH_ASSOC); 
    echo $rows2['userID']; 
    $_SESSION['account'] = $rows2['userID']; 
    $_SESSION['name'] = $rows2['firstName']; 
//echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 
    } 
    else{ 
    echo"<script>alert('No user found!');</script>"; 
    // echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 

    } 
+1

'$ rows = $ sql-> fetch(PDO :: FETCH_NUM);を削除します。if($ rows> 0){'はコードから取り出し、' $ rows2 = $ sql-> fetch(PDO :: FETCH_ASSOC);を使用します。 if(count($ rows2)> 0){' – Saty

+1

パスワードをデータベースに平文で保存しないでください。サーバーの所有者がすべてのパスワードを見ることができるというプライバシーの懸念が非常に高くなります。 ['password_hash()'](http://www.php.net/password_hash)と['' password_verify() '](http://www.php.net/password_verify)を使ってパスワードをハッシュしたままにすることができます暗号化不可)をデータベースに保存します。 PHPのバージョンが5.5未満の場合は、PHP> = 5.3.7で動作する[password_compat](https://github.com/ircmaxell/password_compat)を使用できます。お使いのバージョンが古い場合は、2014年8月にサポートを5.3に戻してインストールをアップグレードする必要があります。 – h2ooooooo

+0

ありがとうございます。次回はそのことを覚えておいてください。 – Jerlon

答えて

0

は、列番号をインデックスとする配列を返します。以下

$rows = $sql->fetch(PDO::FETCH_NUM); 
if($rows > 0){ 

あなたのコードでは、fetch data two timesにしようとしています。あなたは

rowCount

プラス、あなたのデータベースにプレーンなパスワードを格納している

読み取りパスワードのハッシュ化技術

http://php.net/manual/en/function.password-hash.php読む

$q = "SELECT * FROM `users` WHERE `username` = :username AND `password` = :password"; 
$sql = $db->prepare($q); 
$sql->bindParam(":username", $uname); 
$sql->bindParam(":password", $pword); 
$sql->execute(); 

$rows2 = $sql->fetch(PDO::FETCH_ASSOC); 
if (count($rows2) > 0) { 
    $_SESSION['account'] = $rows2['userID']; 
    $_SESSION['name'] = $rows2['firstName']; 
    //echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 
} else { 
    echo"<script>alert('No user found!');</script>"; 
    // echo" <meta http-equiv='refresh' content='0;url=index.php'>"; 
} 

としてそれを使用して、単一の時間に

を行うことができます

http://php.net/manual/en/faq.passwords.php

+1

ありがとうSaty!私は 'FETCH_ASSOC'が任意の数の整数値を返すとは考えていませんでした。 – Jerlon

+0

あなたのコメントをアップしました。私はdownvoteしなかった。 – Jerlon

+0

このコードの実際の問題は、二重フェッチです。これは修正しましたが、言及しませんでした。 –