在PHP中为数据库调用重新使用PDO语句的效率

在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 __

将prepare返回的PDOStatement保存到某个类变量,然后重用该statement对象,而不是在执行同一调用时重新准备,这样做是否有效

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库的源代码,可以看出模块从中受益的地方。。。我只是没有包括它们,因为我试图使示例尽可能简单。我对代码进行了编辑,使其更具体一些