Der Browser wird vom Benutzer (Client) gestartet.
Der WWW-Server ist das Bindeglied zwi- schen Browser und Datenbank.
Der WWW-Server stellt die Datenbankver- bindung (ODBC, OLE DB, JDBC) her.
Der Datenbank-Server verwaltet die Daten- bank selbstständig.
Kleine Systeme verwalten Datenbank und
Browser
WebServer
DB-Server
Hinweise zum Arbeiten mit PHP in der Vorlesung
¾ Erstellen der HTML/PHP-Dateien mit einem beliebigen WEB-Editor
¾ Arbeiten mit dem Apache WWW-Server rfhs8012.fh-regensburg.de
Verwenden dieses Servers:
¾ Laufwerk U: unter WindowsXP in U511/514:
o Verzeichnis public_html im Hauptverzeichnis erstellen
o Leserechte für alle auf dem Hauptverzeichnis
o Lese- und Ausführungsrechte für alle auf public_html
¾ Zugriff auf den WWW-Server erfolgt mittels der URL:
Aufbau einer HTML-Datei
<html>
<!-- Kopf: -->
<head>
<title>Text des Titels</title>
</head>
<!—Rumpf: -->
<body>
Text, Verweise, Grafikreferenzen usw.
…
…
</body>
<!-- Tabellenstruktur -->
<table border cellpadding=3>
<tr>
<th>Kopfzelle</th>
<th>Kopfzelle</th>
…
</tr>
<tr>
<td>Datenzelle</td>
<td>Datenzelle</td>
…
<form action="HTML-/PHP-Datei" method="post">
<!-- Formularelemente -->
<!-- Verschiedene Eingabefelder: -->
<input type="text" size=x maxlength=x
name="Elementname" value="Text">
<input type="password" size=x maxlength=x
name="Elementname">
<!-- Buttons: -->
<input type="submit" value="OK-Beschriftung">
<input type="reset" value="Abbruch-Beschriftung">
</form>
<form action="HTML-/PHP-Datei" method="post">
<select multiple name="Elementname" size=x>
<option> Eintrag
<option> anderer Eintrag
<option selected> Vorauswahl
<option value="Wert"> weiterer Eintrag
</select>
<!-- Radio-Buttons und Check-Boxen: -->
<input type="radio" name="Name" value="Wert"> Text
<input type="checkbox" name="Name" value="Wert"> Text
<html>
<head>
<title>Erstes Beispiel einer Formularseite</title>
</head>
<body>
<center><h1>Vorlesung DB</h1></center>
<center><h3>Edwin Schicker</h3></center>
Diese Seite ist die Einstiegsseite zur ...
<p>
Folgende Seiten stehen zur Verfügung:
<p>
<table cellpadding=10>
<tr>
<td align=right> <form action="name.html">
<input type="Submit" value="Erstes PHP-Beispiel">
</form>
</td>
<td valign=top> Aufruf der Datei <i>name.html</i>.
<!-- PHP-Beispiel, Datei name.html -->
Bitte Daten eingeben und Weiter-/Rücksetz-Button klicken.
<form action="name.php" method=post> <!-- name.php -->
<table cellpadding=10>
<tr> <td align=right>Bitte geben Sie Ihren Namen ein: </td>
<td> <input size=30 maxlength=30 name=Name> </td>
</tr>
<tr> <td align=right>Ihre Anrede: </td>
<td> Herr<input type=radio name=Anrede
value="Sehr geehrter Herr">
Frau<input type=radio name=Anrede
value="Sehr geehrte Frau">
</td>
</tr>
<!--Auslesen der mit POST uebergebenenen Daten: -->
<?php
$Name = $_POST['Name'];
$Anrede = $_POST['Anrede'];
echo "$Anrede $Name! Sie haben es ";
?>
geschafft! Die erste PHP-Seite wurde ausgeführt.</p>
<p>Das erste PHP-Beispielprogramm wäre damit bearbeitet.
Mit dem folgenden Link kehren Sie zur Anfangsseite zurück.</p>
<p>
<center><a href="index.html">Startseite</a></center>
</p>
</body>
</html>
Zugriff auf Datenbanken, Schritt für Schritt Schritt 1: Eingabe der Verbindungsdaten
<form action="db_anf.php" method="post">
<table><tr>
<td>Kennung: </td>
<td><input type=Text name=Kennung size=20></td>
</tr><tr>
<td>Passwort: </td>
<td><input type=Password name=Passwort size=20></td>
</tr></table>
<p><input type="Submit" value="Bestätigen"></p>
</form>
Verbindungen mit PHP zu einer Datenbank
oci_connect Einloggen in eine Oracle Datenbank.
oci_pconnect Einloggen in eine persistente Oracle Datenbank, sonst wie oci_connect.
oci_close Schließen einer Datenbankverbindung zu Oracle
mysqli Objektkonstruktor zum Einloggen in die MySQL Datenbank.
->close Schließen einer Datenbankverbindung zu MySQL.
odbc_connect Einloggen in eine ODBC Datenbank
odbc_pconnect Einloggen in eine persistente ODBC Datenbank odbc_close Schließen einer Datenbankverbindung zu ODBC
Schritt 2: Einloggen in eine Oracle-Datenbank
<?php
echo "<br>Aufbau einer Verbindung zu Oracle.<br>";
$conn = oci_connect($_POST['Kennung'],
$_POST['Passwort'], "rfhs8012_ora9i")
or die("Verbindung zu Oracle gescheitert<br>");
Verbindungen mit PHP zu einer Datenbank
oci_parse Analysieren einer Abfrage mit Rückgabe eines Statements.
oci_execute Ausführen eines Statements.
oci_free_statement Freigeben aller mit dem Statement verbundenen Ressourcen.
->query Ausführen eines SQL-Befehls, liefert ein Query-Objekt zurück
->close Freigeben der Query-/Statement-Ressourcen (Query- Objekt!)
odbc_exec Ausführen eines SQL-Befehls
odbc_free_result Freigeben aller mit dem Ausführen verbundenen Ressourcen
Schritt 3: Ausführen eines SQL-Befehls
$sql = "Select Name, Ort From Personal Where Persnr=2";
$wert = oci_parse($conn, $sql) // Ueberpruefen
or die("Fehler im Select-Befehl");
oci_execute($wert,OCI_DEFAULT) // Ausfuehren
or die("Fehler beim Ausfuehren des Select-Befehls");
Auslesen eines Select-Befehls aus einer Datenbank
oci_fetch_array Lesen der nächsten Ergebniszeile in ein assoziatives/nummeriertes Feld
->fetch_array Lesen der nächsten Ergebniszeile in ein Feld (Query-Objekt!).
odbc_fetch_array Lesen der nächsten Ergebniszeile in ein assoziatives/nummeriertes Feld
Schritt 4: Auslesen eines Select-Befehls
if ($erg = oci_fetch_array($wert)) { // Einlesen der Daten
echo "Der Mitarbeiter mit der Persnr 2 heißt ", "$erg[NAME] und wohnt in $erg[ORT].<br>";
}
else {
echo "Der Mitarbeiter existiert nicht!<br>";
}
Transaktionsbetrieb mit PHP
oci_commit Abschließen einer Transaktion.
oci_rollback Rückgängigmachen einer Transaktion.
->commit Abschließen einer Transaktion (Verbindungsobjekt) ->rollback Rückgängigmachen einer Transaktion.
->autocommit Einstellen, ob mit oder ohne Autocommit.
odbc_commit Abschließen einer Transaktion
odbc_rollback Rückgängigmachen einer Transaktion odbc_autocommit Einstellen, ob mit oder ohne Autocommit
Schritt 5: Beenden einer Datenbankverbindung
oci_commit($conn);
oci_free_statement($wert);
oci_close($conn);
?>
Wichtige Informationen zu einer DB-Verbindung
oci_field_name Zurückgeben des Spaltennamens
oci_num_rows Anzahl der betroffenen Zeilen (Vorsicht beim Select!) oci_num_fields Zurückgeben der Anzahl der Spalten
->field_count Eigenschaft enthält Anzahl der Spalten der letzten Abfrage ->affected_rows Eigenschaft enthält die Anzahl der manipulierten Zeilen ->fetch_field Zurückgeben eines Info-Objekts mit Spalteninfos (Query-
Objekt!)
->num_rows Query-Eigenschaft enthält die Anzahl der ausgelesenen Zeilen
odbc_field_name Zurückgeben des Spaltennamens
odbc_num_rows Anzahl der betroffenen Zeilen (Vorsicht beim Select!)
Fehlerfunktionen in PHP
oci_error Liefern des letzten Fehlers stmt|conn|global zurück oder FALSE, falls fehlerfrei
mysqli_connect_errno Liefern des letzten Verbindungsfehlers oder 0, falls fehlerfrei
mysqli_connect_error Liefern des letzten Verbindungsfehlertextes oder ' ' ->errno Liefern der letzten Fehlernummer oder 0, falls fehlerfrei
->error Liefern des letzten Fehlertextes oder ' ', falls fehlerfrei ->sqlstate Liefern des SQLSTATE-Status
Ausgabe eines Select-Befehls (1)
<?php
if (isset($_POST['Kennung'])) {
$Name = trim($_POST['Name']); // Leerzeichen entfernen if (strlen($Name) == 0) {
echo "Es wurden im Formular keine Angaben gemacht";
} else {
echo "Mitarbeitersuche mit Teilstring $Name.<br>";
$conn = oci_connect($_POST['Kennung'],$_POST['Passwort'], "rfhs8012_ora9i") or die("DB-Verbindung gescheitert");
$sql = "Select Persnr, Name, Ort, GebDatum, Gehalt, Vorgesetzt
From Personal
Where Upper(Name) Like Upper('%$Name%');";
Ausgabe eines Select-Befehls (2)
$wert = oci_parse($conn, $sql) or die("Parse-Fehler");
oci_execute($wert,OCI_DEFAULT) or die("Fehler");
// Ausgeben der gelesenen Daten:
if (!($erg = oci_fetch_array($wert))) {
echo "Gesuchter Mitarbeiter existiert nicht!";
} else {
?>
Ergebnis:<br>
<table border cellpadding=10><tr>
<th>Persnr </th> <th>Name </th>
<th>Ort </th> <th>GebDatum </th>
// In einer Schleife ausgeben:
do {
echo "<td> $erg[PERSNR] </td>";
echo "<td> $erg[NAME] </td>";
echo "<td> $erg[ORT] </td>";
echo "<td> $erg[GEBDATUM]</td>";
echo "<td> $erg[GEHALT] </td>";
echo "<td>($erg[VORGESETZT] == null)?
'Ja': 'Nein'</td>";
echo "</tr>";
} while ($erg = oci_fetch_array($wert));
echo "</table>"
}
oci_commit($conn); // TA beenden oci_free_statement($wert);
oci_close($conn); // DB schliessen } // endif
} // endif
Typische Ausgabe von Select-Abfragen:
while ( $erg = oci_fetch_array($wert) )
// Zeile auslesen bis Ende {
// Attribute dieser Zeile in assoziativem Feld
// $erg["SPALTENNAME"]
// abgelegt, mittels echo ausgeben
} // end while
Auslesen von Kunden- und Teiledaten
$conn = oci_connect($_POST['Kennung'],$_POST['Passwort'], "rfhs8012_ora9i") or die("DB-Verbindung gescheitert");
$sql1 = "Select Nr, Name From Kunde";
$sql2 = "Select Teilnr, Bezeichnung From Teilestamm";
$wert1 = oci_parse($conn,$sql1) or die();
$wert2 = oci_parse($conn,$sql2) or die();
oci_execute($wert1,OCI_DEFAULT) or die();
oci_execute($wert2,OCI_DEFAULT) or die();
Auslesen von Kundendaten in eine Combobox
<td align=right> Bitte wählen Sie einen Kunden aus: </td>
<td><select name="Kundnr" size=1>
<?php do {
echo "<option value=\" $erg1[NR] \"> $erg1[NAME]";
} while ($erg1 = oci_fetch_array($wert1));
?>
</select> </td>
Versteckte Datenfelder übergeben
<input type="hidden" name="Kennung"
value="<?echo $_POST['Kennung'];?>">
<input type="hidden" name="Passwort"
value="<?echo $_POST['Passwort'];?>">
Aufbereiten der ausgewählten Daten
$sql = "Select A.Auftrnr As Auftrag, Datum, Persnr, Anzahl, Gesamtpreis From Auftrag A, Auftragsposten AP Where A.Auftrnr = AP.Auftrnr
And Kundnr = $_POST[Kundnr]
And Teilenr = $_POST[Teilnr]";
$wert = oci_parse($conn,$sql)
or die("Parse-Fehler");
oci_execute($wert,OCI_DEFAULT)
or die("Zugriffs-Fehler");
Fehlerbehandlung
@oci_execute($wert,OCI_DEFAULT); // keine Fehlermeldung!
$fehler = oci_error($wert); // Fehler in Variable merken
if ($fehler['code']) {
echo "Fehler $fehler[message] beim Select-Zugriff";
die();
}
Fehlerbehandlung und Exception-Handling
try {
// ...
@oci_execute($wert,OCI_DEFAULT); // ohne Fehlermeldung $fehler = oci_error($wert); // Fehler merken
if ($fehler['code']) // Fehler?
throw new Exception($fehler['message'],
$fehler['code']);
// ...
}
catch (Exception $e) {
echo "<p>Fehler ", $e->getMessage(), " in Zeile ",
$e->getLine(), " mit Code ", $e->getCode(), "</p>";
}
Fehlerbehandlung in Oracle Fehler beim Einloggen:
$conn = @oci_connect( ... );
if (!$conn) {
$fehler = oci_error(); // ohne Parameter // ...
}
Fehler beim Parsen:
$wert = @oci_parse($conn, ... );
if (!$wert) {
$fehler = oci_parse($conn); // Parse aufrufen!
// ...
}
Eingabe und Ausführen eines SQL-Befehls
Textbereich definieren:
<form action="select.php" method="post">
<table cellpadding=20>
<tr>
<td>
<table >
<tr><td>SQL-Befehl (ohne Semikolon!): </td></tr>
<tr><td><textarea name="Eingabe" rows=10 cols=60 wrap="virtual"><?
echo isset($_POST['Eingabe'])?
trim($_POST['Eingabe']):"" ?>
</textarea> </td></tr>
</table>
</td>
<td>
Textbereich auslesen und Datenbank aufrufen:
$Eingabe = trim($_POST['Eingabe']);
$pos = strpos($Eingabe, " "); // erstes Leerzeichens if ($pos === false)
die("Kein korrekter SQL-Befehl");
$erstesWort = substr($Eingabe, 0, $pos); // Erstes Wort $wert = @oci_parse($conn,$Eingabe);
$fehler = oci_error($wert); // Fehler explizit merken if ($fehler['code'])
{ die ("Fehler $fehler[message] beim SQL-Befehls");
}
oci_execute($wert,OCI_DEFAULT) // Ausfuehren or die("Fehler beim Ausfuehren des SQL-Befehls");
Select-Befehl auswerten und ausgeben:
if (strCaseCmp($erstesWort,"SELECT")==0) // Select!
{
$nspalten = oci_num_fields($wert); //
Spaltenanzahl
echo "<table border=2 cellpadding=2><tr>";
for ( $i = 1; $i <= $nspalten; $i++ ) { // Spaltennamen ausgeben:
{ echo "<th>", oci_field_name($wert,$i), "</th>";
}
while ( $erg = oci_fetch_array($wert) )
{ echo "</tr><tr>"; // Spalten ausgeben:
for ( $i = 1; $i <= $nspalten; $i++ ) { echo "<td> $erg[$i] </td>";
} }
echo "</tr></table>";
}
Andere Befehle ausgeben:
elseif (strCaseCmp($erstesWort,"INSERT")==0)
{ echo oci_num_rows($wert), " Zeilen eingefügt.<br>";
}
elseif (strCaseCmp($erstesWort,"UPDATE")==0)
{ echo oci_num_rows($wert), " Zeilen geändert.<br>";
}
elseif (strCaseCmp($erstesWort,"DELETE")==0)
{ echo oci_num_rows($wert), " Zeilen gelöscht.<br>";
}
else
{ echo "Ein DDL-Befehl wurde ausgeführt.<br>";
}
oci_commit($conn);
Sessionvariable (seit PHP 4.0 bzw. 4.3)
Erste Zeile einer HTML/PHP-Seite:
<?php
session_start();
?>
Verwendung:
$_SESSION['Kennung'] = "abc12345"; // Kennung wird gesetzt
$_SESSION['Nr'] = 17; // Nr wird gesetzt
if (isset($_SESSION['Kennung'])) {
echo "Kennung ist gesetzt und wird nun wieder entfernt";
unset($_SESSION['Kennung']); // Variable ungueltig }
Beispiel:
if (!isset($_SESSION['Kennung']) ||
!isset($_SESSION['Passwort'])) die ("Zur <a href="start.html">Startseite</a>");
// Jetzt kann auf die Datenbank zugegriffen werden:
$conn = oci_connect($_SESSION['Kennung'],
$_SESSION['Passwort'], "");
// ...
Datenbankunabhängiges Programmieren
Oracle:
$conn = oci_connect($kennung, $passwort, $connection);
ODBC:
$conn = odbc_connect($dsn, $kennung, $passwort);
MySQL:
$conn = new mysqli($server, $kennung, $passwort, $db);
Abstraktionsschicht dbx
Abstraktionsschicht in PHP mit Unterstützung von
mySQL
Microsoft SQL Server ab V4.0 ODBC
Oracle ab V4.3
Klassen in PHP
class DB {
var $db_name; // Datenbank bzw. Connectstring var $db_typ; // Datenbank-Typ (Oracle, ODBC) // Konstruktor, gibt DB-Typ und Connect-String vor:
function DB ($typ ="Oracle", $connect ="rfhs8012_ora9i") {
$this->db_typ = $typ;
$this->db_name = $connect;
} }
Login-Funktion in der Klasse
function login($kennung, $passwort) { switch ($this->db_typ)
{
case "Oracle":
$conn=oci_connect($kennung,$passwort,$this->db_name);
break;
case "ODBC":
$conn = odbc_connect
($this->db_name,$kennung,$passwort);
break;
case "mySQL":
$conn = new mysqli("localhost",$kennung,
$passwort,$this->db_name);
Verwendung der Klasse in PHP-Programm
include 'db_modul.inc'; // DB-Modul wird eingebunden
$dbx = new DB($_SESSION['DB_Typ'],$_SESSION['Connect']);
$conn = $dbx->login($_SESSION['Kennung'],
$_SESSION['Passwort']) or die("Verbindung zur RADL-DB gescheitert");