Das DB_result-Objekt bietet zwei Wege auf die Daten aus einem Datensatz in der Ergebnismenge zuzugreifen: fetchRow() und fetchInto().
fetchRow() liefert einen Datensatz zurück. fetchInto() weist den Datensatz einer Variable zu und liefert DB_OK.
Die Zeiger in der Ergebnismenge wird bei jedem Aufruf auf den nächsten Datensatz gelegt. Es wird NULL zurückgegeben, wenn das Ende der Ergebnismenge erreicht ist.
Ein DB_Error wird zurückgeliefert, wenn ein Fehler auftrat.
Ergebnismenge holen
<?php
// Create a valid DB object named $db
// at the beginning of your program...
require_once 'DB.php';
$db =& DB::connect('pgsql://usr:pw@localhost/dbnam');
if (PEAR::isError($db)) {
die($db->getMessage());
}
// Proceed with getting some data...
$res =& $db->query('SELECT * FROM mytable');
// Get each row of data on each iteration until
// there are no more rows
while ($res->fetchInto($row)) {
// Assuming DB's default fetchmode is DB_FETCHMODE_ORDERED
echo $row[0] . "\n";
}
// Or, you could have done the same thing using fetchRow()
// while ($row =& $res->fetchRow()) {
// // Assuming DB's default fetchmode is DB_FETCHMODE_ORDERED
// echo $row[0] . "\n";
// }
?>
Die Daten aus einem Datensatz einer Ergebnismenge können auf drei Arten übergeben werden:
ein geordnetes Array (mit Nummer als Schlüssel)
ein assoziatives Array (mit den Spaltennamen als Schlüsseln)
ein Objekt (mit dem Spaltennamen als Objektvariablen)
DB_FETCHMODE_ORDERED (default)
Array
(
[0] => 28
[1] => hi
)
DB_FETCHMODE_ASSOC
Array
(
[a] => 28
[b] => hi
)
DB_FETCHMODE_OBJECT
stdClass Object
(
[a] => 28
[b] => hi
)
Wenn eine Abfrage den gleichen Spaltennamen mehrmals enthält, z.B. beim Verbinden von Tabellen mit gleichen Spaltennamen, und der Modus zum Holen ist DB_FETCHMODE_ASSOC oder DB_FETCHMODE_OBJECT, dann befindet sich der Schlüsselname bzw. Variable trotzdem nur einmal im Array bzw. Objekt. Damit ist der Datensatz unvollständig. Es gibt zwei Möglichkeiten die Situation aufzulösen:
Benutzen Sie Alias-Namen in ihrer Abfrage, wie z.B.: People.Name AS PersonName.
Ändern Sie den Modus auf DB_FETCHMODE_ORDERED.
Der Modus kann bei jedem Aufruf von fetchInto() und fetchRow() gesetzt werden, oder global für jeden Datenbankzugriff mit der setFetchMode()-Methode.
Bestimmung des Modus pro Aufruf
<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM users');
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {
echo $row['id'] . "\n";
}
?>
Änderung des Modus global
<?php
// Once you have a valid DB object named $db...
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$res =& $db->query('SELECT * FROM users');
while ($res->fetchInto($row)) {
echo $row['id'] . "\n";
}
?>
PEAR::DB unterstützt das gezielte herausholen eines Datensatzes über seine Nummer in der Ergebnismenge. Dazu kann der fetchInto() bzw. bzw. fetchRow()-Methode ein dritter Parameter übergeben werden, der die Nummer enthält. Das ist hilfreich, wenn nur ein Teil der gesamten Ergebnismenge benötigt wird, wie z.B. bei der Aufteilung der Ergebnismenge auf mehrere HTML-Seiten.
Datensatz über die Nummer holen
<?php
// Once you have a valid DB object named $db...
// the row to start fetching
$from = 50;
// how many results per page
$resPage = 10;
// the last row to fetch for this page
$to = $from + $resPage;
foreach (range($from, $to) as $rowNum) {
if (!$res->fetchInto($row, DB_FETCHMODE_ORDERED, $rowNum)) {
break;
}
echo $row[0] . "\n";
}
?>
Das DB_common-Objekt bietet verschiedene Methoden, um eine Abfrage zu vereinfachen, inbesondere bei kleinen Mengen. Diese Methoden erwarten die Abfrage, geben die Ergebnismenge als PHP-Datenstruktur zurück und geben belegten Speicher sofort wieder frei. Die Methoden sind: getOne(), getRow(), getCol(), getAssoc() and getAll().
Nach der Verarbeitung einer Ergebnismenge sollte diese wieder freigegeben werden, um Arbeitsspeicher freizumachen. Dazu benutzen Sie die Methode free().
Freeing
<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT name, address FROM clients');
while ($res->fetchInto($row)) {
echo $row['name'] . ', ' . $row['address'] . "\n";
}
$res->free();
?>
Mit DB haben Sie vier Wege Informationen über eine Ergebnismenge zu erhalten:
numRows() liefert die Anzahl der erhaltenen Datensatze einer SELECT-Abfrage.
numRows
<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numRows();
?>
numCols() liefert die Anzahl der Spalten in einer Ergebnismenge einer SELECT-Abfrage.
numCols
<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numCols();
?>
affectedRows() liefert die Anzahl der geänderten Datensätze einer INSERT-, UPDATE- oder DELETE-Abfrage
affectedRows
<?php
// remember that this statement won't return a result object
$db->query('DELETE * FROM clients');
echo 'I have deleted ' . $db->affectedRows() . ' clients';
?>
tableInfo() liefert ein assoziatives Array mit Informationen über die Spalten einer SELECT-Abfrage
tableInfo
<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM phptest');
print_r($db->tableInfo($res));
// That usage works for DB 1.6.0 or later.
// Below is the syntax for earlier versions:
print_r($res->tableInfo());
?>