Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-开始准备语句,但它们看起来很笨拙_Php_Mysql_Pdo - Fatal编程技术网

PHP-开始准备语句,但它们看起来很笨拙

PHP-开始准备语句,但它们看起来很笨拙,php,mysql,pdo,Php,Mysql,Pdo,我有一个网站,我连接到一个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']; 它是有效的。但我一直在阅

我有一个网站,我连接到一个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
  • 正常更新查询

上面这些都很好,而且很快就可以“正常”完成,但似乎它们会使用准备好的语句占用更多的行

一种常见的方法是将数据库功能包装到类中。下面是一个实现预处理语句缓存的简单示例:

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) {
  ...
}

也许你应该读一读@Gustav,我会接受这个链接和相关摘录作为答案。。。