PHP-开始准备语句,但它们看起来很笨拙
我有一个网站,我连接到一个mySQL数据库,以通常的方式进行大量查询。我没有做比以下更复杂的事情: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']; 它是有效的。但我一直在阅
$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,我会接受这个链接和相关摘录作为答案。。。