要理解PHP PG -prepared statemens中的查询

Léo*_* 준영 1 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"
    );  
} 
Run Code Online (Sandbox Code Playgroud)

这个问题与我的帖子有关,不想在两次声明中声明两次.

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

Iteration |  1                     2
----------------------------------------------------------------------
           run pg_query_params    run pg_qeury_params
           run pg_prepare         
           run pg_execute         run pg_execute
Run Code Online (Sandbox Code Playgroud)

但是,事实并非如此,因为代码pg_prepare也在第二次迭代中运行.1.

Hen*_*pel 8

您发布的示例没有意义 - pg_prepare()并且pg_query_params()是具有不同目的的独立函数,您通常不会将它们结合使用.

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

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

所以总之,这个

$result = pg_query_params($query, $params);
Run Code Online (Sandbox Code Playgroud)

会给你与此完全相同的结果

$statement = pg_prepare($query);
$result = pg_execute($statement, $params);
Run Code Online (Sandbox Code Playgroud)

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