在PHP中为数据库调用重新使用PDO语句的效率
将prepare返回的PDOStatement保存到某个类变量,然后重用该statement对象,而不是在执行同一调用时重新准备,这样做是否有效在PHP中为数据库调用重新使用PDO语句的效率,php,mysql,database,pdo,pdostatement,Php,Mysql,Database,Pdo,Pdostatement,将prepare返回的PDOStatement保存到某个类变量,然后重用该statement对象,而不是在执行同一调用时重新准备,这样做是否有效 Class QueryClass { public static $getSomeData; } Class Foo { $pdo = $pdo (PDO) $id; $first_name; $last_name; $email; $city; public function __
Class QueryClass {
public static $getSomeData;
}
Class Foo {
$pdo = $pdo (PDO)
$id;
$first_name;
$last_name;
$email;
$city;
public function __construct(PDO $pdo, $id) {
$this->pdo = $pdo;
$this->id = $id;
}
public function searchDB(Array $find) {
$query = "SELECT " . prepare_array($find);
$query .= "FROM some_database ";
$query .= "WHERE id = ?";
// Option 1.) Prepare Normally
$statement = $this->pdo->prepare($query);
// Option 2.) Prepare conditionally depending on what the query
// was the last time the method was called. So it should only be called
// when either (A) The method has never been called OR (B) The user
// has changed the query string by entering different data in the
// $find parameter
if (!QueryClass::$getSomeData instanceof PDOStatement
|| QueryClas::$getSomeData->queryString != $query)
{
QueryClass::$getSomeData = $this->pdo->prepare($query);
}
// Executing Option 1
$statement->execute(Array($this->id));
// Exectuting Option 2
QueryClass::$getSomeData->execute(Array($this->id));
}
}
// And then using like this (I know that I havent actually created the PDO, just assume
// that I'm providing it). The second searchDB() call should use the same PDOStatement
// object created when the first object used it
$var = new Foo($pdo, 5);
$var2 = new Foo($pdo, 10);
$var->searchDB(Array('first_name', 'last_name', 'email'));
$var2->searchDB(Array('first_name', 'last_name', 'email'));
// Then makeing a call like this would cause the method to re-prepare the
// PDOStatement because the params provided are different
$var2->searchDB(Array('first_name', 'city'));
这比每次调用查询或方法时只准备一个新语句更有效吗?在我看来不错,但如果您不绑定参数,为什么还要麻烦准备它呢?您可以执行它,让查询缓存对重复查询执行它的操作。好问题。我相信,通过查看与您的RDBMS匹配的PDO库的源代码,可以看出模块从中受益的地方。。。我只是没有包括它们,因为我试图使示例尽可能简单。我对代码进行了编辑,使其更具体一些