ich meine vorbereitete Erklärung erstellen, wie:PHP/PostgreSQL: überprüfen, ob eine vorbereitete Anweisung existiert bereits
pg_prepare('stm_name', 'SELECT ...');
Heute habe ich ein Problem hatte (zweimal eine Funktion für Fehler Aufruf), wenn eine vorbereitete Anweisung mit derselben erklärt Name zweimal:
Warning: pg_prepare() [function.pg-prepare]: Query failed: ERROR: prepared statement "insert_av" already exists in xxx on line 221
so, wie die Frage, Titel, es ist ein Weg zu überprüfen, ob eine Anweisung mit dem gleichen Etikett bereiten bereits vorhanden ist, und in dem Fall, überschreibt?
Ich weiß, dass dieser Fehler von meinem Fehler herrührt und gelöst wird, indem ich einfach die vorbereiteten Anweisungen am Anfang meines Codes deklariere, aber ich frage mich, ob es eine Lösung gibt, mehr Kontrolle über sie zu haben.
EDIT:
Nach der Milen Antwort ist ganz einfach, wenn die vorbereitete Anweisung zu überprüfen Verwendung ist bereits in einfach die DB für die pg_prepared_statements Tabelle abfragt:
try{
$qrParamExist = pg_query_params("SELECT name FROM pg_prepared_statements WHERE name = $1", array($prepared_statement_name));
if($qrParamExist){
if(pg_num_rows($qrParamExist) != 0){
echo 'parametized statement already created';
}else{
echo 'parametized statement not present';
}
}else{
throw new Exception('Unable to query the database.');
}
}catch(Exception $e){
echo $e->getMessage();
}
Aber ich glaube nicht, dass dies eine gute Lösung ist, weil ich jedes Mal die Datenbank abfragen muss.
Ok, normalerweise werden die vorbereiteten Anweisungen am Anfang des Skripts deklariert und dann einfach wiederverwendet, aber ich habe eine Klasse schön verkabelt und ich mag es nicht, 10 vorbereitete Anweisungen zu deklarieren, wenn ich nur 3 davon verwenden werde Sie.
Also, ich glaube ich einen einfachen PHP-Array verwenden werde, halte die Aussagen verfolgen ich erstellen und dann mit isset()
Funktion zu überprüfen, ob es existiert oder erstellt werden muss:
try{
$prepare = pg_prepare('my_stmt_name', "SELECT ...");
if($prepare){
$this->rayPrepared['my_stmt_name'] = true;
}else{
throw new Exception('Prepared statement failed.');
}
}catch(Exception $e){
echo $e->getMessage();
}
Können Sie mir bitte sagen, wie Sie die Warnmeldung erhalten? Wenn ich diese Warnmeldung nicht habe, verbrachte ich fast eine Stunde, um zu verstehen, warum mein Code fehlschlägt. Danke –
@EnsomHodder versuchen Sie mit 'error_reporting (E_ALL);' und mit 'pg_last_error' wenn Ihr Ergebnis von' pg_prepare' oder 'pg_query' fehlschlägt (zB false) – Strae