2009-08-22 45 views
1

如何阅读以下关于pg_query_paramspg_prepare的代码?在这里我不想宣布两次准备好的语句了解PHP中的查询PG -prepared statemens

$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.

回答

7

您发布的示例没有意义 - pg_prepare()pg_query_params()是具有不同用途的独立功能,您通常不会使用它们。

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

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

总之

所以,这

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

会给你完全相同的结果,因为这

$statement = pg_prepare($query); 
$result = pg_execute($statement, $params); 

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

+0

我在函数内部有'pg_prepare'。 **如何限制准备声明的重新声明?** - 我显然需要删除* pg_query_params *。 – 2009-08-22 20:29:53

+0

如果它在函数内部,则将pg_prepare调用移出函数(并移除pg_query_param),或者仅删除pg_prepare调用并仅使用pg_query_param。是否有你想使用pg_prepare的原因?它闻起来像过早的优化。 – 2009-08-22 21:01:07

+0

非常感谢您的回答!这真的很有帮助。 – 2009-08-22 21:31:11