在函数或方法中使用时,可以从PDO Prepared语句中受益

时间:2015-05-11 15:10:53

标签: php pdo

http://php.net/manual/en/pdo.prepared-statements.php

  

查询只需要解析(或准备)一次,但也可以   使用相同或不同的参数执行多次。什么时候   准备好查询,数据库将进行分析,编译和优化   它执行查询的计划。对于复杂查询,此过程可以   占用足够的时间会显着减慢应用程序的速度   如果需要多次重复相同的查询   参数。通过使用准备好的声明,应用程序可以避免   重复分析/编译/优化循环。这意味着准备好了   语句使用更少的资源,因此运行得更快。

因此,使用预准备语句时,以下内容将有助于提高性能:

<?php
...
$stmt=$conn->prepare('SELECT a FROM mytable WHERE x=?');  //I often use globals or similar for $conn
foreach($array as $id){
    $stmt->execute(array($id));
    $data=$stmt->fetchAll(PDO::FETCH_COLUMN);
    ...
}
...
?>

为了消除重复的代码,我希望在函数中执行查询。

在这种情况下,我如何从预先准备的声明的改进性能中受益?

请注意,以下代码没有提供效率优势,实际上比首先不使用预准备语句慢。

<?php
function getStuff($x)
{
    ...
    $stmt=$conn->prepare('SELECT a FROM mytable WHERE x=?');
    $stmt->execute(array($x));
    $data=$stmt->fetchAll(PDO::FETCH_COLUMN);
    ...
    return $data;    
};

...
foreach($array as $x){
    $data=getStuff($x);
    ...
}
...
?>

1 个答案:

答案 0 :(得分:2)

我过去曾用过这个:

function getStuff($x)
{
    global $conn;
    static $stmt;

    if (null === $stmt) {
        $stmt = $conn->prepare('SELECT a FROM mytable WHERE x=?');
    }

如果函数是无状态的,则此方法有效。 例如,将$conn变量作为参数是没有意义的:

function getStuff($conn, $x)
{
    static $stmt;

    if (null === $stmt) {
        $stmt = $conn->prepare('SELECT a FROM mytable WHERE x=?');
    }

因为,静态语句不一定属于提供的连接。

但是你这样做,你需要使语句在函数内持久存在,或者以函数作为工厂使用,并将语句缓存在其他地方。

编辑,测试非oop场景:

echo '<pre>';

function do_something()
{
    static $i = 0;

    echo $i . PHP_EOL;

    $i++;
}

do_something();
do_something();
do_something();
do_something();
do_something();

输出:

0
1
2
3
4