Einführung - Ergebnismengen

Einführung - Ergebnismengen – Daten aus einer Abfrage verarbeiten

Description

Datensätze aus der Ergebnismenge holen

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";
// }
?>

Format der zurückgegebenen Datensätze

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.

Wie der Modus gesetzt wird

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($rowDB_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";
}
?>

Datensätze über ihre Nummer holen

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($rowDB_FETCHMODE_ORDERED$rowNum)) {
        break;
    }
    echo 
$row[0] . "\n";
}
?>

Die vollständige Ergebnismenge holen

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().

Ergebnismengen freigeben

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();
?>

Zusatzinformationen über eine Ergebnismenge erhalten

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());
?>

Fehlerprüfung

Benutzen Sie isError() um zu prüfen, ob eine Aktion ein DB_Error-Objekt zurückgeliefert hat.

Abfragen durchführen (Previous) Vorbereitung und Ausführung von SQL-Anweisungen (Next)
Last updated: Sun, 19 Dec 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.