要理解PHP PG -prepared语句中的查询

时间:2009-08-22 19:36:53

标签: php postgresql

您如何阅读以下有关pg_query_paramspg_prepare的代码?

$result = pg_query_params ( $dbconn,        
    "SELECT flagged_for_moderator_removal           // unsure about Repetition here
    FROM questions 
    WHERE question_id = $1",
    array ( $_GET['question_id'] ) );

if ( pg_num_rows ( $result ) == 0 ) { 
    $result = pg_prepare ( $dbconn, "get_flagged_status_list",    
        "SELECT flagged_for_moderator_removal       // unsure about Repetition here
        FROM questions 
        WHERE question_id = $1"
    );  
} 

这个问题与my thread有关,我不想宣布两次准备好的陈述。

语句之间的区别在于另一个语句的名称为 get_flagged_status_list ,而另一个语句没有。我理解代码如下

Iteration |  1                     2
----------------------------------------------------------------------
           run pg_query_params    run pg_qeury_params
           run pg_prepare         
           run pg_execute         run pg_execute

然而,事实并非如此,因为代码在第二次迭代中也会运行pg_prepare。  1。

1 个答案:

答案 0 :(得分:8)

您发布的示例没有意义 - pg_prepare()pg_query_params()是具有不同目的的独立函数,通常不会同时使用。

pg_prepare()准备一个语句(查询),以便以后通过pg_execute()执行。这是作为潜在的优化完成的 - 如果您事先知道需要连续多次执行该语句,那么事先准备它可以节省数据库服务器上的一些工作,因为它不需要(重新)准备每次通话的声明。

pg_query_params()(以及它的'simpler'版本pg_query())只是直接执行语句(查询),强制数据库服务器在每次调用函数时(重新)准备语句。

总之,这个

$result = pg_query_params($query, $params);

将为您提供与此

完全相同的结果
$statement = pg_prepare($query);
$result = pg_execute($statement, $params);

唯一的区别是,在第二种情况下,你仍然有准备好的声明,准备重用以更多地调用pg_execute() - 这就是为什么你可以给它一个名字,因为这样你可以有不同的在同一个连接上准备好的语句,你可以按任意顺序多次执行。