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