1

PDO に関するほとんどの問題を説明したこのトピックから続けて、非推奨の mysql_* 関数を使用して古い mysql-php コードを正常に書き直すには? 準備されたステートメントの理解について...だから、mysql_*文字列を削除するためにいくつかの例があります. :

in config.php: 
$db = new dbConn('127.0.0.1', 'root', 'pass', 'people', 'login');
in login.php
$db->selectDb("login");
$query = mysql_query("SELECT * FROM account WHERE id='".$_session["id"]."' LIMIT 1");  
$result = mysql_fetch_array($query);

$_session["id"] は実際にログインするときに定義されるため、これを行うためのいくつかのオプションがあります。

In config.php:
$db_people = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass');
$db_login = new PDO('mysql:host=127.0.0.1;dbname=login;charset=UTF-8', 'root', 'pass');

And in login.php 1):
$stmt = $db_login->prepare("SELECT * FROM account WHERE id=? LIMIT 1");
$stmt->execute(array($_session["id"]));
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

または、クエリを除外する場合、これの方が優れていますか? それとも前の方がいいですか?

And in login.php 2):    
$query = "SELECT * FROM account WHERE id=? LIMIT 1";
$parameters = array($_session["id"]);
$statement = $db_login->prepare($query);
$statement->execute($parameters);
$results = $statement->fetch(PDO::FETCH_ASSOC);

そして、このログインフォーム:

  public function login($user, $password)
  {
    global $web, $db;    
    if (!empty($user) && !empty($password))
    {    
      $user = $web->esc($user);
      $password = $web->doHash($user, $password);

      $db->selectDb('login');
      $qw = mysql_query("SELECT * FROM account WHERE username='".$user."' AND pass_hash='".$password."'");

      if (mysql_num_rows($qw) > 0)      
      {    
        $result = mysql_fetch_array($qw); 
        $_session['name'] = $result['username'];
        $_session['id'] = $result['id'];  
        return true;          
      }
      else
        return false;        
    }
    else
      return false;
  }

このフォームに転送:

  public function login($user, $password)
  {
    global $web, $db_login;    
    if (!empty($user) && !empty($password))
    {    
      $user = $web->esc($user);
      $password = $web->doHash($user, $password);

      $stmt = $db_login->prepare("SELECT * FROM account WHERE username=? AND pass_hash=?");
      $stmt->execute(array($user, $password));
      $rows = $stmt->rowCount();

      if ($rows > 0)      
      {    
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
        $_session['name'] = $result['username'];
        $_session['id'] = $result['id'];  
        return true;          
      }
      else
        return false;        
    }
    else
      return false;
  }

大丈夫ですか、それとも別のクエリを実行しますか、それとも完全に異なる方法で実行しますか? 皆さん、ありがとうございました。

また、複数の stmt がある場合、別の名前を使用する必要がありますか? たとえば、stmt を 1 回使用し、result2 で stmt を 2 番目に実行した後、result1 を作成します。stmt 変数にも別の名前を選択する必要がありますか?

4

1 に答える 1

0

わかりましたので、解決策login.php 1)はシンプルで急いでいないようです。また、ログインページは正常に機能しているように見えるため、すべてのルールに従っている必要があり、問題ありません:)

于 2012-06-07T21:15:42.570 に答える