next up previous contents index
Next: PHP & HTTP Up: Einführung PHP Previous: PHP & HTML

Unterabschnitte


PHP & mySQL

Jetzt kommen wir zu dem Punkt, auf den wir schon die ganze Zeit hingearbeitet haben: Die Verbindung von PHP und mySQL. In diesem Kapitel werden die Befehle beschrieben. Weiter unten werden noch Befehlsfolgen für gewisse Aufgaben aufgelistet.

Hier werden jetzt Befehle von PHP und mySQL verwendet. Zwischen diesen beiden Sprachen ist streng zu trennen!

Syntax


mysql_connect

Syntax:
int mysql_connect(string hostname , string username , string password);
Mit mysql_connect() wird eine Verbindung zum Server geöffnet.

Wenn der zurückgegebene Wert positiv ist, verlief die Verbindung erfolgreich; bei Null gab es einen Fehler. Bei einem zweiten Aufruf mit denselben Parametern wird keine neue Verbindung erstellt, aber es wird der `link_identifier` zurückgegeben. Der ` link_identifier` wird benötigt, um bei mehreren Verbindungen eine eindeutig bestimmen zu können.

Als `hostname` ist in unserem Fall immer localhost zu nehmen. Für ` username` und `password` sind die von uns bzw. von Dir selbst zugewiesenen Werte zu nehmen.

Die Verbindung wird automatisch bei Beenden des Scripts geschlossen; sie kann aber auch mit mysql_close() explizit geschlossen werden.


mysql_close

Syntax:
int mysql_close(int link_identifier);
mysql_close schließt eine bestehende Verbindung zum Server.

Es wird entweder `true` bei Erfolg oder `false` bei einem Fehler zurückgegeben.

Mit `link_identifier` kann explizit angegeben werden, welche Verbindung geschlossen werden soll. Wenn nichts angegeben wurde, wird die zuletzt geöffnete Verbindung geschlossen.

mysql_select_db

Syntax:
int mysql_select_db(string database_name , int link_identifier);
Mit mysql_select_db wird die Datenbank ausgewählt, auf die sich die Anfragen beziehen soll.

Es wird entweder `true` bei Erfolg oder `false` bei einem Fehler zurückgegeben.

Wenn kein `link_identifier` angegeben wurde, wird die zuletzt geöffnete Verbindung zum Server genommen.


mysql_query

Syntax:
int mysql_query(string query , int link_identifier);
mysql_query sendet die Befehlsfolge `query` an den Server mit der DB, die durch den `link_identifier` festgelegt ist. Wird kein `link_identifier` angegeben, wird die zuletzt geöffnete Verbindung genutzt.

Es wird ein sogenannter Zeiger auf das Ergebnis (result pointer) zurückgegeben. Wenn dieser (Result-)Zeiger den Wert 0 hat, gibt es einen Fehler. Mit dem Zeiger an sich kann man aber nicht viel anfangen; vielmehr benötig man ihn, um die folgenden Funktionen nutzen zu können. Dort wird er als Parameter result übergeben.


mysql_fetch_array

Syntax:
array mysql_fetch_array(int result [, int resulttype]);
Dies ist eine erweiterte Version von `mysql_fetch_row` (siehe nächste Funktion). Die Indizes des Arrays werden nicht von 0 ausgehend durchgezählt, sondern nach den Spaltennamen benannt.

Die Funktion ist in der Ausführung nur unwesentlich langsamer als ` mysql_fetch_row`, obwohl es deutlich angenehmer zu programmieren ist.

Wenn beim Join zweier Tabellen zwei Spalten denselben Namen haben, müssen ihnen mit Hilfe der SELECT-Anweisung andere Namen gegeben werden. Beispiel:

SELECT t1.s1 AS foo, t2.s1 AS bar FROM t1, t2
Die Spalte s1 der Tabelle t1 hat nun den Namen foo und s1 aus t2 hat den Namen bar.

Das optionale zweite Argument result_type in mysql_fetch_array ist eine Konstante und kann die folgenden Werte annehmen: MYSQL_ASSOC, MYSQL_NUM und MYSQL_BOTH.

<?php
mysql_connect($host,$user,$password);
mysql_select_db("database");
$result = mysql_query("SELECT user_id, fullname FROM users");
while($row = mysql_fetch_array($result)) {
  echo $row["user_id"];
  echo $row["fullname"];
}
?>


mysql_fetch_row

Syntax:
array mysql_fetch_row(int result);
Holt eine Zeile aus der DB-Abfrage, gibt diese als Array zurück und setzt den Result-Zeiger auf die nächste Zeile. Für `result` muß der Rückgabewert (=Zeiger) der `mysql_query`-Funktion genommen werden.

Dasselbe Beispiel wie bei mysql_fetch_array:

<?php
mysql_connect($host,$user,$password);
mysql_select_db("database");
$result = mysql_query("SELECT user_id, fullname FROM users");
while($row = mysql_fetch_row($result)) {
  echo $row[0];
  echo $row[1];
}
?>


mysql_error

Syntax:
string mysql_error([int link_identifier]);
Gibt die Fehlermeldung des letzten SQL-Befehls zurück. Wenn es keinen Fehler gab, wird nichts zurück gegeben. Wird kein `link_identifier` angegeben, wird die zuletzt geöffnete Verbindung genutzt.


mysql_errno

Syntax:
int mysql_errno([int link_identifier]);
Gibt die Fehlernummer des letzten SQL-Befehls zurück. Wenn es keinen Fehler gab, wird 0 zurückgegeben. Wird kein `link_identifier` angegeben, wird die zuletzt geöffnete Verbindung genutzt.


mysql_insert_id

Syntax:
int mysql_insert_id(int link_identifier);
Gibt die Nummer zurück, die beim letzten INSERT dem Feld mit AUTO_INCREMENT zugewiesen wurde.


mysql_num_rows

Syntax:
int mysql_num_rows(int result);
Gibt die Anzahl der Zeilen im Ergebnis zurück.

Übung

Ergebnis-Tabelle ausgeben I

Als Vertiefung und Übung zu dem bisher Gesagten eine kleine Aufgabe:
Es soll eine Funktion geschrieben werden, die das Ergebnis einer SQL-Abfrage tabellarisch darstellt. Die Ausgabe soll im Prinzip die Tabelle, die man beim mySQL-Prompt bekommt, in HTML umsetzen (inkl. Spaltennamen).

Wenn man zum Beispiel am mySQL-Prompt alle Mitarbeiter abfragen will, kommt folgende Ausgabe zu Stande:

mysql> select * from Mitarbeiter;
+-----+------+-------+----------------+------------+--------------+
| MNr | VNr  | AbtNr | Name           | GebDat     | Telefon      |
+-----+------+-------+----------------+------------+--------------+
|   1 | NULL |     3 | Christoph Reeg | 1979-05-13 | NULL         |
|   2 |    1 |     1 | junetz.de      | 1998-03-05 | 069/764758   |
|   3 |    1 |     1 | Uli            | NULL       | NULL         |
|   4 |    3 |     1 | JCP            | NULL       | 069/764758   |
|   5 |    1 |     2 | Maier          | NULL       | 06196/671797 |
|   6 |    5 |     2 | Meier          | NULL       | 069/97640232 |
+-----+------+-------+----------------+------------+--------------+
6 rows in set (0.00 sec)

mysql>

Um das in einer HTML-Tabelle darzustellen, ist folgender (vereinfachter) HTML-Code notwendig:

<html>
<body>
<table>
  <tr>
    <th>MNr</th>
    <th>VNr</th>
    <th>AbtNr</th>
    <th>Name</th>
    <th>GebDat</th>
    <th>Telefon</th>
  </tr>
  <tr>
    <td>1</td>
    <td></td>
    <td>3</td>
    <td>Christoph Reeg</td>
    <td>1979-05-13</td>
    <td></td>
  </tr>
  <tr>
    <td>2</td>
    <td>1</td>
    <td>1</td>
    <td>junetz.de</td>
    <td>1998-03-05</td>
    <td>069/764758</td>
  </tr>
  <tr>
    <td>3</td>
    <td>1</td>
    <td>1</td>
    <td>Uli</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>4</td>
    <td>3</td>
    <td>1</td>
    <td>JCP</td>
    <td></td>
    <td>069/764758</td>
  </tr>
  <tr>
    <td>5</td>
    <td>1</td>
    <td>2</td>
    <td>Maier</td>
    <td></td>
    <td>06196/671797</td>
  </tr>
  <tr>
    <td>6</td>
    <td>5</td>
    <td>2</td>
    <td>Meier</td>
    <td></td>
    <td>069/97640232</td>
  </tr>
</table>
</body>
</html>

Als kleine Hilfe hier das Rahmenprogramm für die Funktion:

<?php
$db_host   =       "localhost";
$db_user   =       "cr";
$db_pass   =       "123";

$datab  =          "cr";


function print_result_table($result){
// hier das Richtige schreiben
}

// Hauptprogramm

/* Verbindung zur Datenbank aufbauen */
$db = @mysql_connect($db_host,$db_user,$db_pass) or die(mysql_error());
@mysql_select_db($datab,$db) or die(mysql_error());

/* HTML-Startcode ausgeben */
echo "<html>\n<body>\n";

/* SQL-Abfrage */
$result = @mysql_query("SELECT * FROM Mitarbeiter");
print_result_table($result);

/* HTML-Endcode ausgeben */
echo "</body>\n</html>\n";
?>

Tipps zur Lösung

Die Aufgabe in mehreren Schritten lösen:
  1. Nur in der 1. Zeile die 1. Spalte ausgeben.
  2. Mit einer Schleife für alle Zeilen die 1. Spalte ausgeben.
  3. Mit einer 2. Schleife alle Spalten ausgeben (vorher in der Dokumentation nachsehen, mit welcher Funktion man die Spaltenanzahl abfragen kann).
  4. Als letztes noch die Spaltennamen ausgeben.

Eine Lösung befindet sich in Anhang B.1.

Ergebnis-Tabelle ausgeben I

Das Hauptprogramm aus der vorigen Aufgabe soll etwas erweitert werden. Bei meiner Vorgabe ist bis jetzt noch keine Fehlerprüfung enthalten. Was für Fehler können auftreten? Bei dem ersten Fehler soll die Fehlermeldung von mySQL ausgegeben werden, beim zweiten ``Keine Datensätze gefunden``. Das Hauptprogramm soll entsprechend erweitert werden.

Eine Lösung befindet sich in Anhang B.2.


next up previous contents index
Next: PHP & HTTP Up: Einführung PHP Previous: PHP & HTML
Christoph Reeg(http://reeg.net/)