3

我有一个网站,我可以在其中连接到 mySQL 数据库,以通常的方式进行一些查询。我没有做任何比以下更复杂的事情:

$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,这是一个数组,表示数据库中的一行。
  • 循环遍历行,并用“下一行”重新填充 $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 回答