2009-08-22 12 views
1

Wie lesen Sie den folgenden Code über pg_query_params und pg_prepare?Um Abfragen in PHP zu verstehen PG -vorbereitete Statements

$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" 
    ); 
} 

Diese Frage bezieht sich auf my thread wo ich möchte nicht zweimal die vorbereitete Anweisung erklären.

Der Unterschied zwischen Anweisungen ist, dass der andere einen Namen hat get_flagged_status_list, während der andere nicht. Ich kann das verstehen, wie

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

jedoch folgt, ist dies nicht der Fall, da der Code zu pg_prepare in der zweiten Iteration läuft. 1.

Antwort

7

Ihr angegebenes Beispiel macht keinen Sinn - pg_prepare() und pg_query_params() sind unabhängige Funktionen mit unterschiedlichen Zwecken, die Sie normalerweise nicht in Verbindung verwenden würden.

pg_prepare() bereitet eine Anweisung (eine Abfrage) für die spätere Ausführung über pg_execute() vor. Dies geschieht als eine mögliche Optimierung - wenn Sie im Voraus wissen, dass Sie die Anweisung oft hintereinander ausführen müssen, kann die Vorbereitung im Voraus einige Arbeit auf dem Datenbankserver sparen, da sie nicht (neu) vorbereiten muss die Aussage für jeden Anruf.

pg_query_params() (sowie seine 'einfachere' Version pg_query()) führt die Anweisung (Abfrage) nur direkt aus und zwingt den Datenbankserver, die Anweisung jedes Mal neu zu erstellen, wenn die Funktion aufgerufen wird.

kurz Also, das

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

Sie sich diese im zweiten Fall

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

Der einzige Unterschied ist genau das gleiche Ergebnis geben, dass Sie immer noch die vorbereitete Anweisung haben, bereit für weitere Aufrufe an pg_execute() wiederzuverwenden - deshalb können Sie ihm einen Namen geben, da Sie auf diese Weise verschiedene vorbereitete Anweisungen für die gleiche Verbindung haben können, die Sie beliebig oft ausführen können, in beliebiger Reihenfolge.

+0

Ich habe das 'pg_prepare' in einer Funktion. ** Wie können Sie die erneute Deklaration der vorbereiteten Aussage einschränken? ** - Ich muss natürlich die * pg_query_params * entfernen. –

+0

Wenn es sich innerhalb einer Funktion befindet, verschieben Sie entweder den Aufruf pg_prepare außerhalb der Funktion (und entfernen Sie pg_query_param), oder entfernen Sie einfach den Aufruf pg_prepare, und verwenden Sie nur pg_query_param. Gibt es einen Grund, warum du pg_prepare benutzen willst? Es riecht nach voreiliger Optimierung. –

+0

Vielen Dank für Ihre Antwort! Es ist sehr hilfreich. –

Verwandte Themen