PHP-Funktionen - ausprobiertpg_update()
Wie Sie wahrscheinlich schon vermuten, kann man mit dieser Funktion Tabellen aktualisieren, vorausgesetzt, es existiert ein assoziatives Array sowie eine korrespondierende Tabelle, deren Feldnamen den Arrayindizes entsprechen und deren Spaltenwerte identisch mit den Werten der Arrayelemente sind. Um nun Datensätze zu überschreiben, muss man ein zweites Array definieren, mit dessen Werten die Werte in den entsprechenden Spalten der Tabelle überschrieben werden. Mit anderen Worten: Man nuss sowohl für den alten als auch für den neuen Datensatz ein assoziatives Array definieren. Wir benutzen die Definitionen für Tabelle und Arrays aus pg_convert.php
mixed pg_update ( resource connection, string table_name, array data, array assoc_array [, int options])
ACHTUNG: Im PHP-Manual heisst das assoziative Array condition. (data enthält die neuen Werte, assoc_array bzw. condition enthält die bisherigen Werte, die überschrieben werden sollen.)
eindimensionale Arrays
Die Tabelle enthalte die folgenden Datensätze:
sorte | region | haendler | preis
--------+------------+------------------+-------
apfel | bodensee | Kurt's Obstladen | 1.25
birne | Südtirol | Obst&Gemüse |
kiwi | neuseeland | Kiwi-Connection | 0.36
orange | Spanien | Salvatore | 2.09
banane | Costa Rica | Banana Joe | 1.34
Der Datensatz für die banane soll aktualisiert werden. Definieren wir nun ein assoziatives Array mit den Daten dieser Zeile (Parameter assoc_array/condition):
$banane = array ("sorte" => "banane",
"region" => "Costa Rica",
"haendler" => "Banana Joe",
"preis" => "1.34");
Ausserdem brauchen wir noch ein assoziatives Array, mit dem wir die Tabelle aktualisieren wollen: (Parameter data)
$upddata = array ("sorte" => "banane",
"region" => "brasilien",
"haendler" => "Banana Joe",
"preis" => "1.16");
$upddata hat dieselbe Struktur wie $banane aber andere Werte. Mit diesen Werten soll die entsprechende Zeile in der Tabelle überschrieben werden. Nach dem Ausführen der Anweisung
<?php
$upd = pg_update($conn, 'obst', $upddata, $banane);
?>
sehen Sie, dass die Datenbanktabelle aktualisiert ist. Der Eintrag mit der banane wurde durch $upddata mit den neuen Werten überschrieben und $upd hat den Wert TRUE.
sorte | region | haendler | preis
--------+------------+------------------+-------
apfel | bodensee | Kurt's Obstladen | 1.25
birne | Südtirol | Obst&Gemüse |
kiwi | neuseeland | Kiwi-Connection | 0.36
orange | Spanien | Salvatore | 2.09
banane | brasilien | Banana Joe | 1.16
Wenn das Array $upddata nicht die volle Anzahl der Elemente enthält wie der zu aktualisierende Datensatz, so wird nichts aktualisiert, und es wird keine Fehlermeldung ausgegeben. Sie können nicht mit der Funktion pg_affected_rows() die Anzahl der betroffenen Datensätze ermitteln, dies wird von PostgreSQL mit einer Warnung
Warning: pg_affected_rows(): supplied argument is not a valid PostgreSQL result resource in ...
quittiert, da $upd kein Resultset repräsentiert, sondern einen booleschen Wert. Allerdings wird in dem oben beschriebenen Szenario auch dann TRUE zurückgegeben, wenn die Operation nicht ausgeführt werden konnte. Um festzustellen, ob der Update geklappt hat, bleibt beispielsweise ein SELECT-count(*)-Kommando, das die Anzahl der Datensätze mit sorte = 'apfel' zurückgibt. Ist diese Anzahl 0, wurden die Datensätze aktualisiert. Es wird im PHP-Manual darauf hingewieden, dass diese Funktionen noch in der Erprobungsphase sind.
zweidimensionale Arrays
Wie man in eine leere Tabelle ein zweidimensionales Array einfügt, wird auf der Seite pg_insert.php beschrieben. Gehen wir davon aus, dass bereits ein Array in der Tabelle enthalten ist.
phptest=# select * from obst;
sorte | region | haendler | preis
--------+----------+------------------+-------
apfel | bodensee | Kurt's Obstladen | 1.25
orange | spanien | Kurt's Obstladen | 1.40
kiwi | italien | Kurt's Obstladen | 1.60
(3 rows)
Auf dieser Tabelle führen wir nun mit der folgenden Anweisung einen Update mit dem oben definierten eindimensionalen Array $upddata aus.
<?php
foreach ($obstarr as $k2 => $v2) {
$upd = pg_update($conn, 'obst',$upddata, $v2);
}
?>
Nach dieser Aktion sieht die Tabelle so aus:
phptest=# select * from obst;
sorte | region | haendler | preis
--------+-----------+-------------+-------
banane | brasilien | Frischmarkt | 1.20
banane | brasilien | Frischmarkt | 1.20
banane | brasilien | Frischmarkt | 1.20
(6 rows)
Alle Datensätze der Tabelle haben dieselbe Struktur wie $upddata und ihre Werte stimmen mit den Arraywerten in $obstarr überein. Folgerichtig wurden sie überschrieben. Falls Sie jetzt die Tabelle editieren, beispielsweise die sorte auf 'ananas' setzen und dasselbe Kommando nochmals ausführen, bleibt der Inhalt der Tabelle unverändert, obwohl die Funktion pg_update() TRUE zurückgibt.
Um das gesamte zweidimensionale Array mit einem ebenfalls zweidimensionalen Array zu überschreiben, muss man für den Parameter data ein neues Array definieren, das die Arrayeinträge in der Tabelle komplett ersetzt. Im Folgenden die Definition dieses neuen Arrays $upddata, die auszuführenden PHP-Kommandos und das Ergebnis als SELECT auf der Tabelle obst.
<?php
$upddata = array (
array ("sorte" => "birne",
"region" => "reichenau",
"haendler" => "Grossmarkt",
"preis" => "1.25"),
array ("sorte" => "ananas",
"region" => "costa rica",
"haendler" => "Tante Emma",
"preis" => "1.40"),
array ("sorte" => "kokosnuss",
"region" => "ägypten",
"haendler" => "Kurt's Obstladen",
"preis" => "1.60"));
foreach ($obstarr as $k => $v) {
$upd = pg_update($conn, 'obst', $upddata[$k], $v);
}
?>
phptest=# select * from obst;
sorte | region | haendler | preis
-----------+------------+------------------+-------
birne | reichenau | Grossmarkt | 1.25
ananas | costa rica | Tante Emma | 1.40
kokosnuss | ägypten | Kurt's Obstladen | 1.60
(3 rows)
©cornelia boenigk 2003 |