2

私はまだコード内の古いmysql_*コマンドをやり直して削除しています。セッションログインフォームの古いコードを転送しようとしましたが、これはこれまでに取得したものです。

  public function login($user, $password)
  {
    if (!empty($user) && !empty($password))
    {    
      $password = $web->doHash($user, $password); // in this function is (return sha1(strtoupper($user).':'.strtoupper($password))
      $stmt = $db_login->prepare("SELECT * FROM account WHERE username=:user AND pass_hash=:password");
      $stmt->bindValue(':user', $user, PDO::PARAM_STR);
      $stmt->bindValue(':password', $password, PDO::PARAM_STR);
      $stmt->execute();
      $rows = $stmt->rowCount();

      if ($rows > 0)      
      {    
        $results_login = $stmt->fetch(PDO::FETCH_ASSOC);
        $_SESSION['user_name'] = $results_login['username'];
        $_SESSION['user_id'] = $results_login['id'];  
        return true;
      }
      else
      {
        return false;
      }
    }
    else
    {
      return false;
    }
  }

その後、ユーザーがサイトにログオンしているかどうかのチェックを使用しています。

  public function isLogged()
  {
    return (!empty($_SESSION['user_id']) && !empty($_SESSION['user_name']));
  }

しかし、どうやら-$ _SESSIONがPDOに存在しないため、この関数は常に空を返しますか?そしてもちろん、私のサイトではログアウトがこの形式で使用されています。

  public function logout()
  { 
      unset($_SESSION['user_id']);
      unset($_SESSION['user_name']);       
  } 

しかし、PDOにはセッションの処理方法が異なると思いますか?何も見つかりませんでした。コードをあまり変更せずに、どういうわけかPDOに$ _SESSIONを追加できますか?

私は変数$_SESSION['user_name']を使用$_SESSION['user_id']しており、Webプロジェクト全体で使用しています。

概要:

1)PDOでセッションを正しく使用するにはどうすればよいですか?

$stmt->fetch(PDO::FETCH_ASSOC);2)使用との違いは何ですか$stmt->fetchAll();

ありがとうございました。

4

3 に答える 3

3

答えは次のとおりです。

  1. session_start()セッションを使用しているすべてのページの上部に電話してください。
  2. 違いは、$stmt->fetch()1つの行fetchAll()をフェッチし、結果セット全体をフェッチすることです。
于 2012-06-09T16:25:48.360 に答える
2

PDOStatement::rowCount()mysqlは機能しないため、$rowsは何も返しません。さらに、PDOはセッションとは何の関係もありません。これは、データベースを処理するための拡張機能です。

結果の数を数えたい場合は、

$stmt->execute();
$results = $stmt->fetchAll();
$results = count($results);
于 2012-06-09T15:54:28.643 に答える
1

回答:

1)Sessionsを使用するすべてのページの開始時にsession_start()が呼び出されていることを確認します

2)クエリからデータが返されていることを確認します

さらに詳しい情報

PDO::FETCH_ASSOC列名でインデックス付けされたデータを取得します。つまり、連想配列

私の意見では、PDO::FETCH_ASSOCどのデータがフェッチおよび処理されているかが非常に明確であるため、常にを使用することをお勧めします。

必要に応じて、このコードを使用して、連想配列形式ですべての行をフェッチすることもできます。fetchAll(PDO::FETCH_ASSOC)

FetchAllPDO機能の詳細については、こちらをご覧ください。

于 2012-06-09T16:37:06.087 に答える