PHP Teil 2 - smiffy.de

Transcription

PHP Teil 2 - smiffy.de
Fakultät IWI
DB & IS II - WS 2015
PHP Teil 2
• Zugriff auf Datenbanken
• Objektorientierung in PHP5
Andreas Schmidt
PHP - Teil 2
1/22
Fakultät IWI
DB & IS II - WS 2015
Datenbankzugriff mit PHP
• verschiedene Varianten
• ODBC Funktionen (z.B. odbc_fetchRow(...)
• native Schnittstelle (mysql_<x>, ora_<x>, ...)
• PEAR MDB2 Paket (PHP Extension and Application Repository)
• Eigenschaften der PEAR MDB2 Klassen
• einheitliche API für verschiedene Datenbanken
• kein Einrichten auf Client (z.B. wie bei ODBC) notwendig
• durchgängiges objektorientiertes Design (ala JDBC)
• Reihe von Zusatzfunktionalitäten (z.B. Sequenzen, Range von Ergebnissen, ...)
• einheitlicher Zugriff auf Metainformationen der unterschiedlichen Datenbanken
• einheitliche Fehlermeldungen/Bezeichner
Andreas Schmidt
PHP - Teil 2
2/22
Fakultät IWI
DB & IS II - WS 2015
Auswahl: Methoden für Datenbankzugriff (1)
$db = MDB2::connect($dsn, $options)
$db->disconnect();
// Connects to a database
// Disconnects from a database
$ok = PEAR::isError($res)
// Determines if a variable is a DB_Error object
$res = $db->query($sql)
// Sends a query to the database
$sth = $db->prepare($sql)
$res = $sth->execute($data)
// Prepares a SQL statement for later execution
// Executes a prepared SQL statment
$row = $res->fetchRow($fetchmode)
// Fetches a row from a result set
$res->numCols()
$res->numRows()
// Gets number of columns in a result set
// Gets number of rows in a result set
$db->exec($sql)
// executes an Modification DML-Statement
// (insert, update, delete).
// returns the number of affected rows
Andreas Schmidt
PHP - Teil 2
3/22
Fakultät IWI
DB & IS II - WS 2015
Auswahl: Methoden für Datenbankzugriff (2)
$db->beginTransaction();
$db->commit()
$db->rollback()
// Commits the current transaciton
// Rolls back the current transaciton
$id = $db->nextId($seq_name)
$id = $db->currId($seq_name);
// Returns the next free id of the sequence
// returns the cuurent number of the sequence
$db->setLimit($start, $num)
// sets a limit for the next query
// ($num datasets, starting at position $start)
$value = $db->quote($value,
$datatype)
$res->getColumnNames()
$db->queryRow($sql)
$db->queryAll($sql)
$db->queryOne($sql)
$db->queryCol($sql)
Andreas Schmidt
// quote data
// returns a dictionary with names of columns
// as keys and the position as value
//
//
//
//
liefert
liefert
liefert
liefert
einen datensatz zurück
alle datensätze zurück
1. spalte des 1. datensatzes zurück
1. spalte aller datensätze zurück
PHP - Teil 2
4/22
Fakultät IWI
DB & IS II - WS 2015
Verbindungsaufbau
• PEAR Klasse abstrahiert von zugrundeliegendem Datenbanksystem
• Durch Datasourcename (dsn) werden spezifische Treiber für DB geladen
• Aufbau DSN
$dbType://$dbuser:$dbpass@$dbhost/$dbName
$dbType://$dbuser:$dbpass@$dbhost_spec
• Beispiele:
• $dsn = "mysql://florian:gehoim@localhost/mondial";
• $dsn = "oci8://wi2:wi2@oracledbwi";
• Standardmäßig werden MySQL Treiber geladen, die anderen müssen in der
php.ini explizit angegeben werden (php_oci8.dll, ...)
Andreas Schmidt
PHP - Teil 2
5/22
Fakultät IWI
DB & IS II - WS 2015
Beispiele für den Zugriff auf Datenbanken
include 'MDB2.php';
Ausgabe:
$dsn = 'mysql://root:@localhost/mondial';
$./php5/php.exe select-berg.php
- Mount Everest 8848 (87, 28)
- Mount Godwin Austen 8611 (77, 36)
- Pik Kommunizma 7494 (72, 39)
- Pik Lenina 7134 (72.55, 39.2)
- Pik Pobeda 7439 (80.1, 42)
$db = MDB2::connect($dsn);
if (PEAR::isError($db))
die("Verbindungsfehler mit $dsn:".$db->getMessage());
$sql = "SELECT name, height, longitude, latitude
FROM mountain
WHERE height > ? ";
$stmt = $db->prepare( $sql );
if (PEAR::isError($stmt))
die("<pre>$sql </pre>:".$stmt->getMessage());
$res = $stmt->execute(array(7000));
if (PEAR::isError($res))
die("execute: <pre>$sql</pre>:".$res->getMessage());
while($row = $res->fetchRow()) {
echo "- $row[0] $row[1] ($row[2], $row[3])\n";
}
$db->disconnect();
Andreas Schmidt
PHP - Teil 2
6/22
Fakultät IWI
DB & IS II - WS 2015
Beispiele für den Zugriff auf Datenbanken
<?php
include 'MDB2.php';
$ds = 'mysql://root:@localhost/mondial';
$db = MDB2::connect($ds);
if (PEAR::isError($db))
die("Verbinungsfehler mit $ds:".$db->getMessage());
$sql = "INSERT INTO mountain (name, height, longitude, latitude)
VALUES (?, ?, ?, ?)";
$stmt = $db->prepare( $sql, null, MDB2_PREPARE_MANIP);
if (PEAR::isError($stmt))
die("prepare: <pre>$sql </pre>:".$stmt->getMessage());
$affected_rows = $stmt->execute(array('Mahlberg', 613, 8.22, 48.50));
if (PEAR::isError($affected_rows))
die("execute: <pre>$sql</pre>:".$affected_rows->getMessage());
if ($affected_rows != 1)
die("Datensatz konnte nicht eingetragen werden");
$db->commit();
$db->disconnect();
Andreas Schmidt
PHP - Teil 2
7/22
Fakultät IWI
DB & IS II - WS 2015
Beispiele für den Zugriff auf Datenbanken
include 'MDB2.php';
$ds = 'mysql://root:@localhost/mondial';
$db = MDB2::connect($ds);
if (PEAR::isError($db))
die("Verbinungsfehler mit $ds:".$db->getMessage());
$name = $db->quote('Mount Everest');
$new_height = $db->quote(8850);
$sql = "UPDATE mountain set height=$new_height
WHERE name='$name'";
$affected_rows = $db->exec($sql);
if (PEAR::isError($affected_rows))
die("execute: <pre>$sql</pre>:".$affected_rows->getMessage());
if ($affected_rows == 0)
die("dataset $name not modified");
print("$affected_rows dataset(s) modified");
$db->commit();
$db->disconnect();
Andreas Schmidt
PHP - Teil 2
8/22
Fakultät IWI
DB & IS II - WS 2015
Vollständiges Beispiel
<?php
include 'MDB2.php';
$datasource = 'mysql://root:@localhost/mondial';
$db = MDB2::connect($datasource);
$sql = "SELECT name, height
FROM mountain
WHERE height > 6000
ORDER BY height desc";
$stmt = $db->prepare( $sql );
$res = $stmt->execute();
?>
<html>
<head>
<title>Mondial DB: Mountains</title>
</head>
<body>
<h1 align="center"> High Mountains </h1>
<table align="center" border="1">
<tr>
<th>name</th>
<th>Altitude</th>
</tr>
<?php while($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC)) { ?>
<tr>
<td><?php echo $row['name'] ?></td>
<td><?php echo $row['height'] ?></td>
</tr>
<?php } ?>
</table>
</body>
</html>
<?php
$db->disconnect();
?>
Andreas Schmidt
PHP - Teil 2
9/22
Fakultät IWI
DB & IS II - WS 2015
Ausgabe
Andreas Schmidt
PHP - Teil 2
10/22
Fakultät IWI
DB & IS II - WS 2015
Onlinequellen zu MDB2
• Package Information: MDB2
http://pear.php.net/package/MDB2
• http://www.installationwiki.org/MDB2
Andreas Schmidt
PHP - Teil 2
11/22
Fakultät IWI
DB & IS II - WS 2015
Objektorientierung in PHP
• Konzepte:
• Klassen
• Instanzen- /Klassenvariablen
• Instanzen- /Klassenmethoden
• Konstruktoren
• Vererbung
• Interfaces
• Sichtbarkeit:
private, protected, public
• Exceptions
• „magic methods“
Andreas Schmidt
• Beispiel
$b1 = new Bruch(1);
$b2 = new Bruch(-1, 2);
$b3 = $b1->sub($b2);
$b4 = $b3->mult(new Bruch (-2, 3));
echo $b4;
PHP - Teil 2
12/22
Fakultät IWI
DB & IS II - WS 2015
Quellcode Bruch.php
function neg() {
return new Bruch(-$this->zaehler, $this->nenner);
}
class Bruch {
private $zaehler;
private $nenner;
function __tostring() {
if ($this->nenner!=1)
return "$this->zaehler/$this->nenner";
else
return "$this->zaehler";
}
function __construct($z=0, $n=1) {
$this->zaehler = $z;
if ($n==0)
die("Nenner darf nicht 0 sein");
$this->nenner = $n;
$this->kuerze();
}
private static function ggt($m, $n) {
$m = abs($m);
$n = abs($n);
if ($n>$m)
return Bruch::ggt($n,$m);
while ($n>0) {
$z = $n;
$n = $m % $n;
$m = $z;
}
return $m;
}
private function kuerze() {
$ggt = Bruch::ggt($this->zaehler,
$this->nenner);
$this->zaehler /= $ggt;
$this->nenner /= $ggt;
}
function add($b) {
$zn = $this->zaehler * $b->nenner +
$this->nenner * $b->zaehler;
$nn = $b->nenner * $this->nenner;
return new Bruch($zn, $nn);
}
Andreas Schmidt
// weitere Methoden ...
}
PHP - Teil 2
13/22
Fakultät IWI
DB & IS II - WS 2015
Objektorientierung in PHP5
• Konstruktoren werden wie normale Methoden definiert, allerdings tragen sie den Namen
_ _construct(...)
(bis PHP4: den selben Namen wie die Klasse)
• Instanzenvariablen und Methoden besitzen die Sichtbarkeit private, protected,
public (default: public)
• Zugriff auf Instanzenvariablen (falls erlaubt) erfolgt mittels Pfeil-Notation:
$bruch->zaehler
• Aufruf der Instanzenmethoden (falls erlaubt) erfolgt mittels Pfeil-Notation:
$bruch->ausgabe()
• Innerhalb der Klasse kann auf die Instanz mittels des Bezeichners $this zugegriffen werden
$this->nenner
$this->kuerze()
Andreas Schmidt
PHP - Teil 2
14/22
Fakultät IWI
DB & IS II - WS 2015
Objektorientierung in PHP5
• Klassenmethoden werden durch voranstellen des Schlüsselwortes static gekennzeichnet
• Aufruf von Klassenmethoden erfolgt durch das Voranstellen des Klassennamens und ::
Bruch::ggt($z1, $z2)
• Klassenvariablen werden durch das Schlüsselwort static deklariert
(z.B. static public $database_connection)
• Zugriff auf Klassenvariablen:
• innerhalb der Klasse: self::$database_connection
• von außerhalb1: Klassenname::$database_connection
• Einfachvererbung ist mittels des Schlüsselwortes extends möglich:
class Student extends Person {
// Klassendefinition v. Student
}
1. sofern erlaubt
Andreas Schmidt
PHP - Teil 2
15/22
Fakultät IWI
DB & IS II - WS 2015
Objektorientierung in PHP5
• Magic Methods
• _ _toString(): wird aufgerufen wenn ein Objekt mittels echo ausgegeben wird
• _ _get($property_name): wird aufgerufen, wenn kein passendes Property gefunden wurde
Andreas Schmidt
PHP - Teil 2
16/22
Fakultät IWI
DB & IS II - WS 2015
nützliche PHP-Funktionen
• explode($separator, $string) -- Zerteilt einen String anhand eines Trennzeichens
• implode($separator, $array) -- Verbindet Array-Elemente zu einem String (anderer
Name: join)
• strlen($str) -- Ermitteln der String-Länge
• die($message) -- Gibt eine Nachricht aus und beendet das aktuelle Skript
• eval($code_str) -- Wertet einen String aus, als wäre er PHP-Code
(Bsp: $eval_string = "\$obj = new $class(\$row);";
eval($eval_string);
• print_r($var): Gibt komplette Datenstruktur aus (zu Debugzwecken)
Andreas Schmidt
PHP - Teil 2
17/22
Fakultät IWI
DB & IS II - WS 2015
nützliche PHP-Funktionen
•
•
•
•
empty($var) -- Testet ob eine Variable einen Wert ungleich "" hat.
isset($var) -- Prüft die Existenz einer Variablen
exec($str) -- Führt ein externes Programm aus
is_array($var) -- liefert TRUE, wenn es sich bei der übergebenen Variable um einen
Array (oder assoziativen Array) handelt
• is_object($var) -- liefert TRUE,. wenn es sich bei der übergebenen Variable um ein
Objekt (Instanz einer Klasse) handelt
• print $str -- wie echo $str
Andreas Schmidt
PHP - Teil 2
18/22
Fakultät IWI
DB & IS II - WS 2015
Tipps
• Verschiedene Arten von möglichen Fehlern:
• PHP-Syntax Fehler: z.B. falsche Klammerung, falsche Schreibweise bei Funktionen/
Methoden, ...
• Beispiele:
Parse error: syntax error, unexpected '}' in .\DB-IS-2WS06\code\OO.php on line 28
Fatal error: Call to undefined method Test::set_idx() in
.\DB-IS-2-WS06\code\OO.php on line 27
Andreas Schmidt
PHP - Teil 2
19/22
Fakultät IWI
DB & IS II - WS 2015
Tipps
• PHP Programmierfehler (falsch geschriebene Variablennamen)
print "hier erfolgt keine Warnung: \$a: $a\n";
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
print "Hier schon: \$a: $a\n";
•Ausgabe
$ php.exe warnungen.php
hier erfolgt keine Warnung: $a:
Notice: Undefined variable: a in C:\test\warnungen.php on line 5
Hier schon: $a:
Andreas Schmidt
PHP - Teil 2
20/22
Fakultät IWI
DB & IS II - WS 2015
Tipps
• SQL-Fehler:
• Beispiel:
[nativecode=1064 ** You have an error in your SQL syntax;
check the manual thatcorresponds to your MySQL server version for the right syntax to use near '< 1000' at line 1]
• Tipp: nach jedem Aufruf von Datenbankmethoden auf Fehler testen und aussagekräftige Fehlermeldungen (am besten mit Statement) ausgeben !
$stmt = $db->prepare( $sql );
if (PEAR::isError($stmt))
die("$sql: ".$stmt->getMessage());
Andreas Schmidt
PHP - Teil 2
21/22
Fakultät IWI
DB & IS II - WS 2015
Tipps
• HTML-Fehler:
• keine Ausgabe wegen fehlerhaftem HTML
Andreas Schmidt
PHP - Teil 2
22/22