Fach:PHP-MySQL Stundenlogs

Aus StudyWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[bearbeiten] 23. Februar - 29. Februar 2008

[bearbeiten] LAMP Installation mit Ubuntu

Installieren der benötigten pakete

 sudo aptitude install apache2 php5 php5-mysql mysql-server phpmyadmin

Zugriffsberechtigungen für den ww-root setzen

 sudo chmod 777 /var/www

Arbeitsordner verlinken (als Beispiel mein Arbeitsordner), einfach den part mit /home/rac... durch euren arbeitsordner ersetzen und phpkurs durch den namen den ihr möchtet ersetzen.

 ln -s /home/rac/DATA/school/PHP_MySQL/ /var/www/phpkurs

Mit dem browser nun auf http://localhost/phpkurs gehen und man sollte ein folder listing zu sehen bekommen.

[bearbeiten] run at boot deaktivieren

 System => Systemverwaltung => Dienste

Im Einstellungsfenster einfach die Haken für die 3 Datenbank-Server dienste (mysql, mysql-ndb, mysql-ndb-mgm) und den Internet-Server (apache2) deaktivieren. Jetzt kann man mit nachfolgenden Befehlen die beiden manuel starten bzw. stoppen

 apache2ctl start
 /etc/init.d/mysql start

[bearbeiten] Starter script

Folgendes script in die datei LAMP.sh schreiben und mit "chmod +x LAMP.sh" ausführbar machen.

 Um es mit <alt>+<F2> schnell ausführen zu können kann man noch folgenden Befehl ausführen
 ln -s /scripts/LAMP.sh /usr/bin/LAMP


[bearbeiten] Manuelle lösung

[bearbeiten] apache2

Im file /etc/default/apache2 muss am ende noch die konstante NO_START mit dem wert 1 belegt werden

 sudo echo "NO_START=1" >> /etc/default/apache2

Ab jetzt, kann der apache server nur noch mit dem Befehl apache2ctl gestartet oder gestoppt werden

  • Starten: apache2ctl start
 Die warning unten könnt ihr ignorieren
 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
  • Stoppen: apache2ctl stop
[bearbeiten] MySQL

to be written

[bearbeiten] 1. März - 7. März 2008

[bearbeiten] Grundlagen

[bearbeiten] 1.1 Einleitung

 <?php ?>: PHP code wird zwischen diesen Tags ausgeführt
  • phpinfo(); gibt informationen über den verwendeten server aus

[bearbeiten] 1.2 Variablen und Ausgabe

  • very short form <?= 'Ausgabe' ?>
  • Zuweisung: $a = 'test';
  • Ausgabe: echo $a;
  • Ausgabe: print $a; gibt 0 oder 1 retour
  • String concatinator: echo $a.'test';
  • variable wird geparsed: echo "$a ist $b";
  • datentyp herausfinden: gettype($a) rückgabe
  • Konstante: define('KONSTANTE', 'Wert der konstante');
  • Konstante ausgeben: echo KONSTANTE;
  • Einzeilige kommentare: //Beliebiger kommentar oder #kommentar
  • Mehrzeilige kommentare: /* Kommentar */
  • Existiert variable: isset($a)
  • ist die Variable mit irgendeinem Zeichen gefüllt: empty($a)
  • Wahrheitswerte ausgabe: true ergibt 1 und false ergibt nichts
  • print_r und var_dump für dev und debug ausgabe

[bearbeiten] 1.3 Operatoren

  • Arithmetische: +, -, *, geteilt /, modulo %
  • kombination: $a += 5;
  • increment, decrement: ++$a, --$a, $a++, $a--
  • vergleichsoperator: $erg = $a < $b; var_dump($erg);
  • kleiner <, grösser >, ist gleich ==, grösser gleich <=, kleiner gleich >=, ungleich != oder <>, exacte gleichheit (datentyp berücksichtigen) ===, exakte ungleichheit !==
  • String verglichen mit 0 ist immer true
  • Logische operatoren: und &&, oder ||, entweder oder xor, negation !(bool_wert)
  • short circuit auswertung: auswertung von logischen operationen von links nach rechts, bricht ab wenn erster wert bereits nicht erfüllt.

[bearbeiten] 1.4 Fallunterscheidungen

 if(bedingung)
   {anweisung}
 elseif(weitere_bedingung)
   {anweisung}
 else
   {anweisung}

Alternative form (wird nicht oft verwendet)

 if ():
   echo
 elseif ():
   sdf
 else:
   sdf
 endif;
 switch(variable) {

case 3: echo ... break; case ... ... default: echo }

  • case vergleich: case $var < 5:

[bearbeiten] 1.5 Schleifen

 for($i=0;$i<10;$i++) {anweisungen}
 $i = 0;
 while($i<10) {$i++;}
  • mit break; wird die schleife beendet
  • mit continue; wird der aktuelle schleifendurchgang übersprungen und die schleife fortgesetzt
 $i = 10;
 do {anweisungen} 
 while($i <10); //schleife wird mindestens einmal durchgeführt
 $var = array('test1', 'test2', 'test3'); 
 foreach($var as $varwert) { echo $varwert; } //array iteration

[bearbeiten] 1.6 Funktionen

 function test($parameter1, $parameter2)
   {anweisung} 
  • aufruf der funktion mit test(parameter1, parameter2);
  • php version zurückgeben: phpversion()
  • bei funktion mit rückgabewert muss in der funktion "return wert;" angegeben werden, nach diesem befehl wird die funktion beendet
 function summe() {
   $params = func_get_args();
   $summe = 0;
   foreach($param as $wert) {
     $summe += $wert;
     return $summe;
   } 
 echo summe(12,10,5);
  • Standartwert angeben: function test($param = 0) {}
  • standartwerte gehen von links nach rechts und nach einem standartwert muss jeder nachfolgende parameter auch einen standartwert besitzen
  • in funktionen sind variablen lokal und globale variablen sind nicht direkt benutzbar
  • mit "$var = global $var;" kann ich die globale variable $var lokal verwenden
  • alternative ist "$GLOBALS['a'];", mit dem kann man auf die variable zugreifen und global ändern
  • parameter als referenz übergeben: "function test(&$var) {}", damit kann die übergebene variable global geändert werden

[bearbeiten] 1.7 Arrays

  • "$mix = array('string', 5, true);" kann mit foreach ausgelesen werden
  • zugriff auf einzelne elemente: $mix[3], elemente können auch geändert werden
  • element entfernen: unset($mix[0]);, achtung index wird nicht angepasst
  • http://php.net/array
  • "array_push($mix, 'neu')": neuer wert hinten anfügen
  • assoziatives arrays: "$farben = array('gelb' => '#FFFF00', 'rot'..."
 print $farben['gelb']
  • array mit for durchlaufen: "for($i=0;$i<count($mix);$i++){ echo $mix[$i]; } //geht nicht bei assoz arrays"
  • assoz arrays auslesen: "foreach($farben as $index => $wert) {echo $index . ': ' . $wert . '
    '; }"
  • multidimensionale arrays: "$farben_mult = array('gelb' => '#FFFF00', 'rotwerte' => array('#FF0000', '#EE0000'));"
 zugriff mit $farben_multi['rotwerte'][0];

[bearbeiten] 1.8 String

  • http://php.net/strings
  • strings kann man auch als char array brauchen
  • position eines substrings bestimmen: strpos($text, $subtext), gibt den index des ersten vorkommens zurück
  • strpos_r($text, $subtext) sucht von rechts nach links
  • strtolower($text), strtoupper($text) wandelt den text in klein oder grossschreibung um
  • leerzeichen entfernen: trim($text), ltrim(), rtrim()
  • substr($text, posanfang, länge); string beschneiden
    • bei minus werten wird von rechts nach links gezählt
    • lässt man den länge parameter weg geht es bis ans ende bzw bis an den anfang
  • explode(trennzeichen, $text); wandelt den string in ein array um getrennt wird beim trennzeichen
  • mit htmlspecialchars($htmltext); wird html umgewandelt damit als ausgabe direkt der htmltext kommt

[bearbeiten] 1.9 Datum und zeit, mathematik

  • date(format); gibt das aktuelle datum/zeit mit der entsprechenden formatierung
  • mit time() kann der aktuelle zeitstempel ausgelesen werden (zählt in sekunden hinauf seit dem 1.1.1970)
  • mit mktime(stunde, minute, sekunde, monat, tag, jahr) kann man einen eigenen zeitstempfel erstellen
  • alternative getdate()
  • Mathematische konstanten: M_PI
  • maximalen wert: max(4,5,7)
  • dechex(255) wandelt dez zahl in hex zahl um, hexdec() genau das gegenteil
  • rand(kleinstes, grösstes) gibt eine zufälölige zahl
    • mt_rand() genauerer zufall
  • round(zahl, nachkommastelle) runden des wertes
  • floor(zahl) bringt die zahl zu der nächstkleineren ganzzahl
  • ceil(zahl) gegenteil von floor

[bearbeiten] 1.10 Externe Dateien

 require 'datei.ext'; //datei muss vorhanden sein, fehler wird geworfen
 require_once 'datei.ext'; //datei wird nur einmal eingebunden
 include 'datei.ext'; //nur warning wird gfeworfen
 include_once 'datei.ext'; //datei wird nur einmal eingebunden
 set_include_path('/include') //setze den include pfad
 ini_set('include_path', '/include'); //bewirkt dasselbe wie set_include_path()

[bearbeiten] 8. März - 14. März 2008

[bearbeiten] Objektorientierte Programmierung

[bearbeiten] 2.1 Einleitung

 <?php
 class Buch {
   public $Titel = "PHP 5";
   private $Titel2 = "PHP 5";
 
   public function getTitel() {
     return $this->Titel2;
   }
 
   public function setTitel($titel) {
     $this->Titel2 = $titel;
   }
 
   public function lesen() {
     echo 'Gutes Buch...';
   }
 }
 
 $Reauber = new Buch();  // Objekt instanzieren
 echo $Reauber->lesen();  //Funktion ausführen
 $Reauber->Titel = 'Die Räuber'; //Variable im Objekt ändern (geht nur wenn klasse public ist
 $Reauber->setTitel('Neuer Titel');
 echo $Reauber->getTitel();
 ?>

[bearbeiten] 2.2 Vererbung

 class Klassiker extends Buch {
   private $Epoche = 'Alt';
   public function getEpoche() {
     return this->Epoche;
   }
   public function lesen() {
   echo 'Super Buch' . parent::lesen(); //funktion wird nicht überschrieben, es werden beide funktionen ausgeführt
   }
 }
 
 $Raeuber = new Klassiker();
 $Raeuber->setTitel('Die Raeuber');
 echo $Raeuber->getTitel();
 echo $Raeuber->getEpoche();
 $Raeuber->lesen();

[bearbeiten] 2.3 Hilfsfunktionen I

  • Konstruktorfunktion
    • Wird beim instanzieren eines objektes ausgeführt
 public function __construct($titel) {
   $this->Titel = $titel; 
 }
 
 $Reauber = new Buch('Die Reauber');
  • Destruktorfunktion
    • wird ausgeführt bei auflösung des objekts
 public function __destruct($titel) {
   echo 'Nicht wegschmeissen';
 }
 
 unset($Reauber);
 Buch::lesen(); // funktion lesen wird statisch aufgerufen
  • final: Klasse kann nicht mehr vererbt werden, bei funktion kann sie nicht mehr überschrieben werden
  • Konstanten: const -> Können nicht verändert werden und muss auch inerhalb der klasse statisch aufgerufen werden

[bearbeiten] 2.4 Hilfsfunktionen II

  • public funtion __call($name, $parameter)
    • fängt alle aufrufe von funktionen die nicht definiert sind ab
    • mit call lässt sich eine überladung simulieren mit dem parameter array
  • public function __get($name)
    • fängt aufrufe in dieser klasse auf variablen die nicht existieren ab
  • public function _set($name, $wert)
    • fängt änderungswünsche auf Variablen die nicht existieren ab
    • kan genutz werden um die entsprechende variable zu erstellen
      • $this->$name = $wert;
  • function __autoload($klasse) //ausserhalb einer klasse definieren
    • fängt aufrufe auf eine nicht existierende klasse ab
    • kann benutzt werden um eine entsprechende klassen datei zu includen
      • include $klasse . '.php';
  • public function __toString()
    • Wird immer ausgeführt wenn etwas in einen String gecastet wird
      • ($string) $Raeuber; // damit ist das Objekt Raeuber umgewandelt worden und besitzt den Return wert der __toString funktion
  • public function __sleep()
    • serializiert ein objekt
    • Eigenschaftsnamen gehen dabei leider verloren
  • public function __wakeup()
    • deserializiert ein Objekt
  • Konstante: __METHOD__
    • gibt die klasse und der methodenname zum aktuellen zeitpunkt aus

[bearbeiten] 2.5 Oberklassen und Interfaces

  • abstract class Number {...}
    • muss abstrakte methoden definieren
      • abstract function zaehlen();
    • Abstrakte methoden müssen implementiert werden, ansonsten ist die ableitende klasse auch abstrakt
  • interface BuchInter { function lesen(); }
    • Alle Klassen die dieses Interface implementieren müssen diese funktion dan auch implementieren
    • class Buch implements BuchInter { function lesen() { ... } }

[bearbeiten] 2.6 Entwurfsmuster

  • Englisch: Design Patterns
  • SPL: Standart PHP Library (abgeleitet von der STL von C++)
  • $x = file('x.txt');
    • lädt den inhalt der Datei x.txt in $x
  • Die Funktionen der SPL können mittels implements neu definiert werden


[bearbeiten] Reguläre Ausdrücke

[bearbeiten] 3.1 Reguläre Ausdrücke I

  • Kostet performance
  • posix und perl regex sind in php implementiert

[bearbeiten] Perl regex

  • preg_match('/a/', $text);
    • Liefert 1 wen der ausdruck a vorhanden ist ansonsten 0
  • preg_match('/\w/', $text);
    • überprüft ob ein alphanumerisches zeichen im string ist
  • preg_match('/\w{1}/', $text);
    • überprüft ob nur ein alphanumerisches zeichen vorkommt
  • preg_match('/\d/', $text);
    • überprüft auf numerische zeichen
  • preg_match('/\w\d/', $text);
    • sucht nach dem Muster {Alphanumerisch}{Numerisch} z.B. a1
 Beispiel: Deutsche Postleitzahl
 $text = 'D-40302'
 var_dump(preg_match('/\w-\d{5}/', $text));
  • preg_match('/(\w-)?\d{5}/', $text)
    • \w- ist nun optional und kommt 0 oder einmal vor
  • preg_match('/(\w-)*\d{5}/', $text)
    • \w- ist nun optional und kommt 0 oder unendlich oft vor
  • preg_match('/(\w-)+\d{5}/', $text)
    • \w- ist nun zwingend und kommt einmal oder unendlich oft vor, mindenstens jedoch einmal
  • preg_match('/^(\w-)?\d{5}$/', $text)
    • Regulären ausdruck auf anzahl zeichen begrenzen
  • preg_match('/^(\w-)+(\d{5}|\d{4})$/', $text)
    • heisst das entweder 4 oder 5 zahlen kommen können
  • preg_match('/^(\[DA]-)?([0-9]{5}|\d{4})$/', $text)
    • als Buchstaben dürfen nur D und A verwendet werden, als zahlen gelten nur die zahlen von 0 bis 9
    • in den regex müssen patters escaped werden wie in normalen strings

[bearbeiten] 3.2 Reguläre Ausdrücke II

  • preg_match('/^(\[DA]-)+([0-9]{5}|\d{4})$/', $text, $teile)
    • es werden alle pattern aus $text extrahiert und in das array $teile geschrieben
      • $teile[0] enthält den ganzen String
      • $teile[1] enthält den ausdruck in der ersten klammer
      • $teile[2] enthält den ausdruck der zweiten klammer
  • preg_match('/^(\[DA]-)+([0-9]{5}|\d{4})$/', $text, $teile, PREG_OFFSET_CAPTURE)
    • erstelt ein subarray in teile wobei jeweils noch die stelle des gefundenen patterns abgelegt ist
  • preg_match('/^(\[DA]-)+([0-9]{5}|\d{4})$/', $text, $teile, PREG_OFFSET_CAPTURE, $startposition)
    • es wird im String erst ab dem 2ten Zeichen gesucht
  • preg_match_all('/PHP/', $text, $teile);
    • findet alle vorkomnisse und speichert sie in ein subarray
  • preg_match('/^(\[DA]-)+([0-9]{5}|\d{4})$/', $text, $teile, PREG_OFFSET_CAPTURE|PREG_SET_ORDER)
    • Ordnet die daten im array schöner an
  • preg_split('//', $text);
    • gleiche funktionalität wie explode
  • optional auch ein teile limit als argument: * preg_split('//', $text, $teilelimit);
  • | dient als OR im regex
  • \s sucht nach einem whitespace
  • preg_replace('/(w+)(\s)(\w+)/', '$3, $1', $name);
    • ersetzt den string durch den zweiten string wobei ${nummer} auf das jeweilige () zeigt

[bearbeiten] Zusatzinfo zu Perl Regex

  • \w represents a "word" character and is equivalent to the expression [A-Za-z0-9].
  • \W represents the opposite of \w and is equivalent to [^A-Za-z0-9].
  • \s represents a whitespace character.
  • \S represents a nonwhitespace character.
  • \d represents a digit and is equivalent to [0-9].
  • \D represents a nondigit character and is equivalent to [^0-9].
  • \n represents a newline character.
  • \r represents a return character.
  • \t represents a tab character.

[bearbeiten] 15. März - 21. März 2008

[bearbeiten] Formulare

[bearbeiten] 4.1 Einführung

 <form action="<? echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="get"> ... </form>
  • GET hat eine Zeichenbeschränung und in der url sichtbar
  • Post ist im hintergrund
  • htmlspecialchars ist eine bereinigungsfunktion um das einschleusen von code zu verhindern (input wird zu plaintext verarbeitet
  • Formularelemente
    • <input ... />
      • type="text"
        • Zeigt ein Textfeld zur eingabe an
      • type="radio"
        • Zeigt Radio buttons an, alle radio buttons mit dem gleichen Namen werden zusammengefasst und es kann nur einer selektiert werden
      • type="checkbox"
        • Zeigt anklickbare boxen an
      • type="submit"
        • das formular wird abgesendet
      • type="button"
        • normaler button
    • <select ...><option ...></option></select>
      • Zeigt eine Auswahlliste
      • mit multiple="multiple" im select statement und mit namen der mit [] endet, kann man mehrfachauswahlen tätigen die danach in ein array gespeichert werden

[bearbeiten] 4.2 Register Globals

  • implode($x)
    • Array aneinanderhängend in einem string

[bearbeiten] 4.3 Formulardaten Ausgabe

  • $_GET['name']
    • Globales get array
  • $_POST['name']
    • Globales post array
  • isset(X)
    • gibt true zurück wenn die variable belegt ist
  • is_array($x)
    • Prüft ob die variable ein array ist
  • exit();
    • Beendet die ausführung des scripts

[bearbeiten] 4.4 Validierung von Formulardaten I

  • count($x)
    • Kann die Elemente in einem array zusamenzählen

[bearbeiten] 4.5 Validierung von Formulardaten II

  • in_array($wert,$array)
    • prüft ob in dem array der gewünschte wert drin vorhanden ist

[bearbeiten] 4.6 Mailversand von Formulardaten

  • mail($empfaenger, $betreff, $bodytext)
    • Damit wird ein mail gesendet
      • um jegwelche Fehlermeldungen zu unterdrücken kann einfach ein @ vorangestellt werden
 z.B. @mail(...)

[bearbeiten] 4.7 Grafische Submit-Schaltflächen

  • <input type="image" name="submit" src="button.gif" />
    • die Variablen submit_x und submit_y werden beim script wieder ankommen

[bearbeiten] 4.8 File Upload

  • <input type="file" name="datei" />
  • Das formular muss unbedingt die post methode benutzen und der enctype muss auf "multipart/form-data" gesetzt werden
  • $_FILES['datei']
    • Ist das superglobal array, dass den inhalt, den namen usw. des files enthält
      • $_FILES['datei']['name'] // enthält den namen der Datei
      • $_FILES['datei']['tmp_name'] // enthält den temporären namen der datei, wie sie auf dem server momentan abgespeichert ist
      • $_FILES['datei']['size'] // enthält die grösse des files
      • $_FILES['datei']['type'] // enthält den mime type des files
  • move_uploaded_file($temp_name,$target_dir/$target_name)
    • Verschiebt die temporäre datei und überprüft ob sie korrekt und vollständig übertragen wurde
  • copy_uploaded_file()
    • dieselbe funktion wie oben, nur wird die Datei kopiert und nicht verschoben, d.h. die temporäre Datei ist noch bis zum ende des scripts verfügbar
  • basename(x)
    • extrahiert den dateinamen aus dem string bzw entfernt alle ordner angaben

[bearbeiten] 22. März - 28. März

[bearbeiten] Cookies und Sessions-Variablen

[bearbeiten] 5.1 Client Identifikation

  • HTML ist Statuslos bzw. nicht sitzungsorientiert

[bearbeiten] 5.2 Cookies I

  • http://wp.netscape.com/newsref/std/cookie_spec.html
  • Cookie erzeugen
    • setcookie('{Name}','{Value}',{ablaufdatum},'{pfad}','{domain}',secure);
      • Ablaufdatum, Pfad, Domain, und secure sind optional
        • wird das Ablaufdatum nicht gesetzt, ist es ein temporäres cookie das nur bis zur browserbeendigung gespeichert wird
      • bsp: setcookie('Name','Value',time()+60*60*24*7,'/','localhost');
  • Cookie auslesen
    • ${var} = $_COOKIE['{Name}'];

[bearbeiten] 5.3 Cookies II

  • Cookies müssen in PHP immer befor jeder Ausgabe gesetzt werden, da es den Header setzt
  • Cookies können nicht im gleichen scriptlauf gesetzt und ausgelesen werden
  • Cookie löschen
    • setcookie('{Name}', , time()-365*24*60*60);

[bearbeiten] 5.4 Sessions - Einführung

  • Cookies werden hin und her geschickt werden, sessions bleiben auf dem Server

[bearbeiten] 5.5 Sessions - Konfiguration

  • Session konfiguration wird in der php.ini gemacht

[bearbeiten] 5.6 Sessions - Beispiel

 <?php
 session_start();
 ?>
 Setze Session...
 <?php
 $_SESSION['letzterAbruf'] = date('d.m.Y H:i:s');
 ?>
 Session gesetzt.
 Ausgabe der Daten
 if(isset($_SESSION['letzterAbruf'])) {
   echo "Letzter Abruf: {$_SESSION['letzterAbruf']}";
 }
  • SSID auslesen um an einen Dynamischen, nicht PHP (ab v. 5) oder HTML Link anzuhängen (Session muss gestartet sein)
 $name = session_name();
 $id = session_id();
 echo "<a href=\"link.php?$name=$id\">link</a>";

[bearbeiten] 5.7 Sessions - passwortgeschützte Site

[bearbeiten] sessionsecret.php

 <?php
 session_start();
 if (!isset($_SESSION['ok']) || $_SESSION['ok'] !=== true) {
   header('Location: sessionlogin.php');
 }
 ?>
 Super geheime infos

[bearbeiten] sessionlogin.php

 <?php
 session_start();
 if(isset($_POST['login']) && isset($_POST['pass'])) {
   if($_POST['login'] === 'tester@test.com' && $_POST['pass'] === 'supersicher') {
     $_SESSION['ok'] = true;
     header('Location: sessionsecret.php?' .urlencode(session_name()) . '=' . urlencode(session_id()));
   } else {
     echo 'Login leider falsch.';
     $_SESSION['ok'] = false;
   }
 }
 ?>
 <form method="post">
   Login: <input type="text" name="login" />
Passwort: <input type="password" name="pass" />
<input type="submit" value="login" /> </form>

[bearbeiten] Zusatzinfo von rac

Hier findet ihr eine session implementation, die mir als gutes Lernbeispiel und als einstieg in PHP 5 im letzten semester gedient hat.

[bearbeiten] 05. April - 11. April

[bearbeiten] Datenbanken

[bearbeiten] 6.1 Einführung

[bearbeiten] 6.2 MySQL

[bearbeiten] 6.2.1 MySQL - Verbindungsaufbau

  • MySQLi erweiterung erlaubt Objektorientierten zugriff
 <?php
 try {
   $db = new MySQLi('localhost','Benutzer','Passwort','Datenbank');
   echo 'Verbindung offen';
   $db->close();
 } catch (Exception $e) {
   echo 'Fehler: ' . htmlspecialchars($e->getMessage());
 }
 ?>
  • MySQL Warnungen werden nicht durch exception handling abgefangen

[bearbeiten] 6.2.2/3 MySQL – Datenbank-Befüllung

  • Video zu 6.2.2 nicht vorhanden
  • Variante 1 (es muss alles escaped werden)
 // Verbindung offen
 $sql = sprintf('INSERT INTO trainings (titel, trainer, dauer) VALUES (\'%s\', \'%s\',%s)',
           $db->real_escape_string($_POST['titel']),
           $db->real_escape_string($_POST['trainer']),
           (int)$_POST['dauer']
         );
 $db->query($sql);
 // Verbindung schliessen
  • Variante 2 (prepared statement)
 // Verbindung offen
 $sql = 'INSERT INTO trainings (titel, trainer, dauer) VALUES (?, ?, ?)';
 $kommando = $db->prepare($sql);
 // s = string, i=int, als Daten können nur Variablen angegeben werden
 // Bindung zu den parameter findet erst beim execute statt!
 // Es muss nicht escaped werden, es wird automatisch gemacht
 $kommando->bind_param('ssi', $_POST['titel'], $_POST['trainer'], $dauer);
 $dauer = (int)$_POST['dauer'];
 $kommando->execute();
 // Verbindung schliessen
  • Wie viele zeilen wurden mutiert vom sql statement
 $kommando->affected_rows;

[bearbeiten] 6.2.4 MySQL - Datenbank-Rückgabe

 $sql = 'SELECT * FROM trainings';
  $ergebnis = $db->query($sql);
  echo '<table>';
  while($zeile = $ergebnis->fetch_object()) { //alternative fetch_row, fetch_asock
    printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
        $zeile->id,
        htmlspecialchars($zeile->titel),
        htmlspecialchars($zeile->trainer),
        $zeile->dauer );
  }
  echo '</table>';
  • prepared statements
 $sql = 'SELECT * FROM trainings';
  $kommando = $db->prepare($sql);
  $kommando->execute();
  $kommando->bind_result($id, $thema, $trainer, $dauer);
  echo '<table>';
  while($kommando->fetch()) {
    printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
        $id,
        htmlspecialchars($thema),
        htmlspecialchars($trainer),
        $dauer );
  }
  echo '</table>';

[bearbeiten] 6.3 SQLite

[bearbeiten] 6.3.1 SQLite – Datenbank-Befüllung

  • schreiben ist langsam (wegen locking usw.)
  • Braucht keinen Extra DB Server (vergleich MS Access)
 <?php
 $db = new SQLiteDatabase('dateiname.db'); //sqlite_open
 $sql = sprintf('INSERT INTO trainings (titel, trainer, dauer) 
                 VALUES(\'$s\', \'$s\', $s)',
                 sqlite_escape_string($_POST['titel']),
                 sqlite_escape_string($_POST['trainer']),
                 (int) $_POST['dauer'] );
 $db->queryExec($sql);  //sqlite_exec()
 ?>

[bearbeiten] 6.3.2 SQLite – Rückgabe

  • lesen ist sehr schnell
 <?php
 $db = new SQLiteDatabase('dateiname.db'); //sqlite_open
 $sql = 'SELECT * FROM trainings';
 $ergebnis $db->query($sql); //query_exec ist performanter aber hat keine rückgabewerte
 while($zeile = $ergebnis->fetchObject()) { //sqlite_fetch_object
   printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
          $zeile->id, htmlspecialchars($zeile->titel),
          htmlspecialchars($zeile->trainer), $zeile->dauer );
 }

[bearbeiten] 6.4 Microsoft SQL Server

  • SQL und Windows Authentifizierung möglich

[bearbeiten] 6.4.1 MSSQL – Verbindungsaufbau

 <?php
 $db = mssql_connect('localhost', 'user', 'password');
 mssql_close($db);
 ?>

[bearbeiten] 6.4.2 MSSQL – Datenbank-Befüllung

 <?php
 $db = mssql_connect('localhost', 'user', 'password');
 mssql_select_db('php', $db);
 ini_set('magic_quotes_sybase', '1');
 $sql = sprintf('INSERT INTO trainings (titel, trainer, dauer) 
                 VALUES(\'$s\', \'$s\', $s)',
                 addslashes($_POST['titel']),
                 addslashes($_POST['trainer']),
                 (int) $_POST['dauer'] );
 mssql_query($sql, $db); 
 mssql_close($db);
 ?>

[bearbeiten] 6.4.3 MSSQL – Rückgabe

 <?php
 $db = mssql_connect('localhost', 'user', 'password');
 mssql_select_db('php', $db);
 $sql = 'SELECT * FROM trainings';
 $ergebnis = mssql_query($sql, $db); 
 while($zeile = mssql_fetch_object($ergebnis)) {  // alternative: mssql_fetch_assoc
   printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
          $zeile->id, htmlspecialchars($zeile->titel),
          htmlspecialchars($zeile->trainer), $zeile->dauer );
 }
 mssql_close($db);
 ?>

[bearbeiten] 6.5 PDO

  • PHP Data Objects

[bearbeiten] 6.5.1 PDO – Einführung

[bearbeiten] 6.5.2 PDO – Verbindungsaufbau

 <?php
 $db = new PDO('sqlite2:php.db');
 // $db = new PDO('mysql:dbname=php;host=localhost', 'user', 'password');
 // $db = new PDO('odbc:Driver{Microsoft Access Treiber (*.mdb)}; Dbq=C:\\php.mdb');
 ?>

[bearbeiten] 6.5.3 PDO – Befüllung

 <?php
 $db = new PDO('sqlite2:php.db');
 $sql = 'INSERT INTO trainings (titel, trainer, dauer) VALUES (:titel, :trainer, :dauer)';
 $kommando = $db->prepare($sql);
 $kommando->bindParam(':titel', $_POST['titel']);
 $kommando->bindParam(':trainer', $_POST['trainer']);
 $dauer = (int) $_POST['dauer'];
 $kommando->bindParam(':dauer', $dauer);
 $kommando->execute();
 ?>

[bearbeiten] 6.5.4 PDO – Rückgabe

 <?php
 try {
   $db = new PDO('sqlite2:php.db');
   $sql = 'SELECT * FROM trainings';
   $ergebnis = $db->query($sql);
   while($zeile = $ergebnis->fetch(PDO::FETCH_OBJ)) {
     printf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
          $zeile->id, htmlspecialchars($zeile->titel),
          htmlspecialchars($zeile->trainer), $zeile->dauer );
   }
 } catch (PDOExceptionj $ex) {
   echo htmlspecialchars($ex->getMessage());
 }
 ?>

[bearbeiten] 19.04 - 25.04

 Lösungen sind von Remo

[bearbeiten] Aufgabe 1

Konvertieren Sie zunächst die Tabellen auf Innodb Format und erstellen Sie native referentielle Integrität.

[bearbeiten] Lösung

1. Alle zur Verfügung stehenden Engines anzeigen: SHOW STORAGE ENGINES;

2. Bei XAMPP ist InnoDB deaktiviert. in my.cnf enablen!

 #skip-innodb
  innodb_data_home_dir = "D:/Programs/xampp/mysql/"
  innodb_data_file_path = ibdata1:10M:autoextend
  innodb_log_group_home_dir = "D:/Programs/xampp/mysql/"
  innodb_log_arch_dir = "D:/Programs/xampp/mysql/"
  innodb_log_file_size = 5M
  innodb_log_buffer_size = 8M
  innodb_flush_log_at_trx_commit = 1
  innodb_lock_wait_timeout = 50

3. Tabellen-Engine anzeigen lassen: show create table <Tabellenname>;

4. Tabelle konvertieren: alter table <Tabellenname> engine=innodb;

[bearbeiten] Aufgabe 2

Erstellen Sie einen MySQL-View view_sales_by_category mit folgenden Inhalt:

Tabellen: categories and products

  • category_name
  • product_name
  • quantity_per_unit
  • units_in_stock
  • discontinued

[bearbeiten] Lösung

1. Views gibts erst ab Version 5.0.1. Version anzeigen lassen: SELECT VERSION();

2. view erstellen mit CREATE VIEW <view name> AS SELECT ...normale swql abfrage:

 CREATE VIEW view_sales_by_category AS
  SELECT c.CategoryName AS category_name, p.productName AS product_name,
  p.quantityPerUnit AS quantity_per_unit, p.unitsInStock AS units_in_stock,
  p.discontinued
  FROM categories c, products p
  WHERE p.categoryid = c.categoryid;

3. Erstellte View anzeigen lassen: SHOW CREATE VIEW <view name>

4. Inhalt anzeigen lassen: SELECT * from <view name>;


[bearbeiten] Aufgabe 3

Erstellen Sie einen MySQL-View view_alpabetical_list_of_products mit folgenden Inhalt:

Tabellen: categories and products

  • alle Spalten aus der Tabelle products
  • category_name
  • discontinued

Sortierung nach product_name

[bearbeiten] Lösung

 CREATE VIEW view_alpabetical_list_of_products AS
  SELECT c.CategoryName AS category_name, p.*, p.discontinued
  FROM categories c, products p
  WHERE p.categoryid = c.categoryid
  ORDER BY category_name;

[bearbeiten] Präsenzveranstaltung 26.4.2008 Thema Durpal + Datenbanken

Annotate Modul

[bearbeiten] Teil 3 - Java Script und AJAX

[bearbeiten] Aufgaben

[bearbeiten] Teil 5 - Zend Framework

[bearbeiten] Installation

  • copy library folder to www site (should be outside of web-root, not accesible directly)
  • create .htaccess file in web-root
 RewriteEngine on
 RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
    • If you can't use rewrite rules you can access all links with just setting /inde.php/... in front of it
  • Creating MVC folder structure
  • / => {main}
  • /demo_app => {web-root}
  • /library => Zend framework
  • /application => {app-root}
  • /application/model
  • /application/views
  • /application/controllers

[bearbeiten] Bootstraping

  • Controller file, where all other scripts of the application will be running trough
 <?php //filename: {web-root}/index.php
 // Error Reporting
 error_reporting(E_ALL|E_STRICT);
 ini_set('display_errors', 'on'); //in production set to off
 // Modify include path to include path to library
 ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'../library');
 // Zend Framework Includes
 require_once "Zend/Loader.php";
 Zend_Loader::loadClass('Zend_Controller_Front');
 // Get the front controller instance
 $front = Zend_Controller_Front::getInstance();
 $front->setControllerDirectory('../application/controllers');
 $front->throwExceptions(true); //in production set to false
 // Go Go Go!
 $front->dispatch();
 ?>

[bearbeiten] Controllers & Views

  • Creating our first controller
 <?php //filename:{app-root}/controllers/IndexController.php
  class IndexController extends Zend_Controller_Action
  {
	public function indexAction()
	{
		//Logic code here.
	}
  }
  ?>
  • creating a view
    • Create the folder views/scripts and a folder named like the controller /views/scripts/index
    • in the last folder you create a file named like the action, e.g. index.phtml and write some content to it
  • Variablen benutzen
 [IndexController.php]
 ...
 //Logic code here.
 srand();
 $this->view->randomNumber = rand(0,10);
 ...
 [index.phtml]
 Hello, World! A random number is: <?=$this->randomNumber?>
  • force a view to display: $this->render('error'); where error would be the name of the view (error.phtml in views/scripts/index directory)
  • See the Zend documentation for more details
  • Creating an error controller to handle exceptions
    • Create controller named ErrorController.php and paste the following
 <?php
  class ErrorController extends Zend_Controller_Action {
	public function errorAction() {
		// Log any errors
	}
  }
  ?>
    • Create the folder /views/scripts/error and a file called error.phtml with your error message inside
    • Set the throwExceptions() in index.php to false
  $front->throwExceptions(false);

[bearbeiten] Extending

 ...
 Zend_Loader::loadClass('Zend_Config_Ini');
 // Initialize ini config
 $config = new Zend_Config_Ini('../application/config.ini', 'test');
 ...
 if($config->developer) 
   $front->throwExceptions(true);
 else
   $front->throwExceptions(false);
 ...
    • Create the /application/config.ini file and paste following code into it
 [test]
 developer = true

test is the category we load in the init and developer is the variable we want to access

[bearbeiten] Aufgaben

Zend Framework Tutorial code

[bearbeiten] Prüfungsvorbereitung Abschlussprüfung

[bearbeiten] Sample code

[bearbeiten] guestbook.php

[bearbeiten] modules.inc.php


[bearbeiten] SQL DB

Persönliche Werkzeuge
Seminare
Fächer Grundstudium