3

私はmySQLデータベースに接続して、通常の方法でいくつかのクエリを実行するWebサイトを持っています。私は以下よりも複雑なことは何もしていません:

$result = mysql_query('SELECT * FROM table WHERE condition = "'.mysql_real_escape_string($_POST['condition']).'"');
$row = mysql_fetch_assoc($result);
echo $row['var1'].' '.$row['var2'];

そしてそれは動作します。しかし、私はプリペアドステートメントについて読んでいて、それらはより高いセキュリティを提供するようであり、それらを使用してデータベース呼び出しをいくつかのプリペアドステートメントに置き換えたいので、mysqliクラスを見てきました。

しかし、同じことを実現するためのコードははるかに多いようです。上記を取得するには、これを行う必要があることを理解しています。

$stmt = $db->stmt_init();
if($stmt->prepare('SELECT * FROM table WHERE condition = ?')) {
$condition = $_POST['condition'];
$stmt->bind_param('s', $condition);
$stmt->execute();

$stmt->bind_result($var1, $var2, ...);
if ($stmt->fetch()) {
    echo $var1 . ' - ' . $var2;
}
}

ですから、それはもっとたくさんのコードの地獄のようで、管理するのが少し難しいようです。私はこれらの使い方を誤解していますか、それとも「通常の」PHPのことを行うためのより短い方法がありますか?

  • $ rowにデータを入力します。これは、データベースからの1行を表す配列です。
  • 行をループし、$rowに「次の行」を補充します。
  • 通常のUPDATE照会。

上記はすべて「通常」実行するのに便利で迅速ですが、プリペアドステートメントを使用するとさらに多くの行が必要になるようです。

4

1 に答える 1

0

一般的な方法は、データベース機能をクラスにラップすることです。プリペアドステートメントのキャッシングを実装する簡単なものは次のとおりです。

class DB {
  protected $db;
  protected $cache;

  public function __construct($host, $database, $user, $pass, $charset = 'utf8') {
    $this->db = new PDO(sprintf('mysql:dbname=%s;host=%s', $database, $host, $charset),
                        $user, $pass);
    $this->cache = array();
    $this->db->query(sprintf('SET NAMES %s', $charset));
  }

  public function query($query, $vars = array()) {
    //You may input a simple value, no need for arrays with a single argument                              
    if (!is_array($vars))
      $vars = array($vars);

    //Short names inside the function                                                                      
    $db = &$this->db;
    $cache = &$this->cache;

    //Ensure the prepared statement is in cache                                                            
    if (!isset($cache[$query]))
      $cache[$query] = $db->prepare($query);

    //Execute the statement and return all rows                                                            
    $stmt = $cache[$query];
    if ($stmt->execute($vars))
      return $stmt->fetchAll();
    else
      return false;
  }
}

これの使用法は、古いデータベースインターフェイスに非常に近いものです。例:

$db = new DB(host, database, user, pass);
$result = $db->query('SELECT id, name FROM table WHERE id = ? AND address = ?',
                     array(42, 'home'));
foreach ($result as $row) {
  ...
}
于 2012-06-05T07:48:08.980 に答える