Как вы читаете следующий код о pg_query_params
и pg_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" ); }
Этот вопрос связан с моей нитью, где я не хочу объявлять дважды подготовленное заявление.
Разница между утверждениями заключается в том, что у другого есть имя 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.
Ваш опубликованный пример не имеет смысла – pg_prepare()
и pg_query_params()
являются независимыми функциями с разными целями, которые вы обычно не использовали бы совместно.
pg_prepare()
готовит оператор (запрос) для последующего выполнения через pg_execute()
. Это делается как потенциальная оптимизация – если вы заранее знаете, что вам нужно будет выполнять оператор много раз подряд, подготовка его заранее может сэкономить некоторую работу на сервере базы данных, поскольку она не должна (повторно) готовиться утверждение для каждого вызова.
pg_query_params()
(а также его «более простая» версия pg_query()
) просто выполняет оператор (запрос) напрямую, заставляя сервер базы данных (re) готовить инструкцию каждый раз при вызове функции.
Короче говоря, это
$result = pg_query_params($query, $params);
даст вам тот же результат, что и этот
$statement = pg_prepare($query); $result = pg_execute($statement, $params);
Единственное различие заключается в том, что во втором случае у вас все еще есть подготовленный оператор, готовый к повторному использованию для большего количества вызовов pg_execute()
– вот почему вы можете присвоить ему имя, так как вы можете иметь разные подготовленные операторы на одном и том же соединение, которое вы можете выполнять, как вам угодно, много раз, в произвольном порядке.