copyright (c)  2003   useGroup
PHP

Jochen Stärk
PHP-Tutorial
Eine kleine ODBC-Referenz

nach untenVorwort
nach untenODBC_CONNECT(...)
nach untenODBC_CLOSE_ALL()
nach untenODBC_EXEC(...)
nach untenODBC_FETCH_ROW(...)
nach untenODBC_RESULT(...)
nach untenODBC_NUM_ROWS(...)
nach untenODBC_AUTOCOMMIT(...)
nach untenODBC_COMMIT(...)

Vorwort

nach obenVorwort 

Diese "Referenz" zeigt nur die allerwichtigsten ODBC-Befehle. Für eine ausführlichere Referenz empfehle ich die PHP-Referenz.

Viele dieser Befehle sind ähnlich den Datenbankspezifischen aufgebaut. Durch Ersetzen des ODBC_ durch z.B. IBASE_ oder MYSQL_ erreicht man eine höhere Performance und ist nicht auf ODBC angewiesen. Dabei verliert man jedoch auch die Möglichkeit, mit anderen Datenbanken zusammenzusarbeiten (für diese müsste dann der gesamte Code geändert werden). Zu den MySQL-Befehlen lesen Sie bitte auch die MySQL-Referenz.


ODBC_CONNECT(...)

nach obenODBC_CONNECT(...)  int odbc_connect(string dsn, string user, string password, int [cursor_type]);

Ist Voraussetzung in jedem PHP-Programm, das ODBC benutzt. DSNs vergibt man z.B. in der Windows-Systemsteuerung (siehe: ein eigenes Testsystem aufbauen ), Benutzername und Passwort vergibt man sich in der Datenbank(-Verwaltung). Als Cursor-Type ist SQL_CUR_USE_ODBC zu empfehlen. Der Rückgabewert der Funktion identifiziert im weiteren Programmverlauf die Datenbank, ist also wichtig.

$dbh = odbc_connect('testdb', 'aname', 'apwd', SQL_CUR_USE_ODBC);


ODBC_CLOSE_ALL()

nach obenODBC_CLOSE_ALL() 

Schließt alle Datenbankverbindungen und ist am Ende jedes Programmes, das ODBC_CONNECT benutzt hat, aufzurufen.

ODBC_CLOSE(int id)
ist zwar ähnlich, aber ODBC_CLOSE_ALL() ist komfortabler und sicherer -- falls man dann doch mal vergessen sollte eine Datenbank zu schließen.
odbc_close_all();


ODBC_EXEC(...)

nach obenODBC_EXEC(...)  int ODBC_EXEC(int connection_id, String query_string);

führt eine SQL-Anweisung aus. übergeben müssen Sie die ID der Datenbank und den SQL-String. Zurückgeliefert wird false für fehlerhafte Ausführung und ansonsten eine Identifikation des Ergebnisses (z.B. bei Select-Anweisungen wichtig).

$res=odbc_exec ($dbh, "insert into kueche values ('Messer')");


ODBC_FETCH_ROW(...)

nach obenODBC_FETCH_ROW(...)  int odbc_fetch_row(int result_id, int [row_number]);

Lädt in der Form

int odbc_fetch_row(int result_id);
die nächste Zeile und liefert true zurück, falls es eine gibt und in der Form
int odbc_fetch_row(int result_id, int row_number);
lädt es eine bestimmte Zeile.
while(odbc_fetch_row($res)) 
{
   $name=odbc_result("Name"); // angenommen die Datenbank hat eine Spalte namens Name
   echo " $name ";
}


ODBC_RESULT(...)

nach obenODBC_RESULT(...)  string odbc_result(int result_id, mixed field);

"field" ist lediglich entweder die Nummer oder der Name der zurückzuliefernden Spalte. Hierbei ist der Name zu empfehlen, weil sich ansonsten Fehler drohen wenn an den Tabellen noch "geschraubt" wird. Nur nach ODBC_FETCH_ROW(...) anzuwenden ! Um jede Spalte zurückgeliefert zu bekommen ist ODBC_RESULT aus Performancegründen eigentlich eine Todsünde, jedoch in ODBC schwer anders zu realisieren (unter MYSQL geht da die Sache z.b. mit mysql_fetch_object(...) nach einem mysql_db_query(...), in ODBC z.B. mit ODBC_FETCH_INTO()).

while(odbc_fetch_row($res)) 
{
   $name=odbc_result($res,"Name"); // angenommen die Datenbank hat eine Spalte namens Name
   echo " $name ";
}
Hinweis: ODBC_RESULT gibt Ihnen bei SQL-Anfragen wie
SELECT MAX(ID) FROM MYTABLE 
oder
SELECT AVG (INCOME) FROM HOUSEHOLDS
, also bei Anfragen in der kein Spaltenname existiert, das Ergebnis entweder in der 0ten Spalte zurück oder in dem feld mit der Arithmetischen Operation.
 $res=odbc_exec ($dbh, "SELECT MAX(name) FROM NAMEN");
 if odbc_fetch_row($res)
 {
   $name=odbc_result($res,0); 
   $name=odbc_result($res,"MAX(name)"); 

 }


ODBC_NUM_ROWS(...)

nach obenODBC_NUM_ROWS(...)  int odbc_num_rows(int result_id);

Liefert die Anzahl der Zeilen im Ergebnis zurück. Nützlich z.B. bei Selects mit einer Where-Bedingung oder eben um die Anzahl der Datenbankeintragungen zu wissen.

$zeile=odbc_num_rows($res)-10;
if ($zeile<0) $zeile=0;
while(odbc_fetch_row($res,$zeile))
{
   $zeile++;
   $name=odbc_result("Name"); // angenommen die Datenbank hat eine Spalte namens Name
   echo " $name ";  // gibt die letzten 10 Namen aus.
}


ODBC_AUTOCOMMIT(...)

nach obenODBC_AUTOCOMMIT(...)  bool odbc_autocommit(resource connection_id [,bool OnOff]);

Legt fest, ob nach jedem ODBC-Befehl automatisch ein Datenbank-Commit ausgelöst wird (Standard: On). Wenn ja, wird jeder Befehl als abgeschlossene Transaktion behandelt. Die Einstellung Off erlaubt also, mehrere ODBC-Befehle zu einer Transaktion zusammen zu fassen.

// Dieses Beispiel führt eine Überweisung über $betrag von $konto1 auf $konto2 durch.
// Wenn ein Konto nicht existiert, wird weder die Abbuchung, noch die Zubuchung durchgeführt
$dbh=odbc_connect('bank','','',SQL_CUR_USE_ODBC);
odbc_autocommit($dbh,"Off");
odbc_exec($dbh,'update konto set kontostand=kontostand-'.$betrag.' where kontonummer='.$konto1);
odbc_autocommit($dbh,"On");
// Beim nächsten ODBC-Befehl wird das DB-Commit ausgelöst
odbc_exec($dbh,'update konto set kontostand=kontostand+'.$betrag.' where kontonummer='.$konto2);
// ...


ODBC_COMMIT(...)

nach obenODBC_COMMIT(...)  bool odbc_commit(resource connection_id);

Löst das ODBC-Commit manuell (nicht-automatisch) aus. Dadurch wird die Transaktion ganz durchgeführt. Komplementär ist int odbc_rollback(int connection_id), welches das Datenbanksystem veranlasst, die Transaktion garnicht durchzuführen.

// Dieses Beispiel führt eine Überweisung über $betrag von $konto1 auf $konto2 durch.
// Wenn konto1 zu wenig Geld hat, wird nichts durchgeführt.
$dbh=@odbc_connect('bank','','',SQL_CUR_USE_ODBC);
odbc_autocommit($dbh,"Off");
odbc_exec($dbh,'update konto set kontostand=kontostand-'.$betrag.' where kontonummer='.$konto1);
odbc_exec($dbh,'update konto set kontostand=kontostand+'.$betrag.' where kontonummer='.$konto2);
$res=odbc_exec($dbh,'select kontostand from konto where kontonummer='.$konto1);
$kontostand=odbc_result($res,'kontostand');
if ($kontostand<0)
{odbc_rollback($dbh);}
else
{odbc_commit($dbh);}
// ...


copyright (c)  2003   useGroup