Fach:PHP-MySQL Stundenlogs
Aus StudyWiki
[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
- Wird immer ausgeführt wenn etwas in einen String gecastet wird
- 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
- muss abstrakte methoden definieren
- 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
- es werden alle pattern aus $text extrahiert und in das array $teile geschrieben
- 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
- type="text"
- <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
- <input ... />
[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
- Damit wird ein mail gesendet
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
- Ist das superglobal array, dass den inhalt, den namen usw. des files enthält
- 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');
- Ablaufdatum, Pfad, Domain, und secure sind optional
- setcookie('{Name}','{Value}',{ablaufdatum},'{pfad}','{domain}',secure);
- 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
- Einheitliche schnittstelle für DB Zugriff
- Muss extra installiert werden
[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
[bearbeiten] Teil 3 - Java Script und AJAX
[bearbeiten] Aufgaben
- Ajax Aufgabe mit PHP
- Ajax Aufgabe mit Sajax nicht ganz funktionstüchtig (keine action passiert) :-/
- Ajax Aufgabe mit Xajax
[bearbeiten] Teil 5 - Zend Framework
- Tutorial Videos
- IBM DeveloperWorks Getting started Tutorial
- Some beginner tutorial
- Various Zend Framework tutorials
[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
- Description of all components (What they do and how to use them)
- Adding a config file
- Before the first line you want to use some variables from the config file, enter the following line (must be after you include Loader.php)
...
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
[bearbeiten] Prüfungsvorbereitung Abschlussprüfung
[bearbeiten] Sample code
[bearbeiten] guestbook.php
[bearbeiten] modules.inc.php
