Da ich schon Länger keine PHP TUT´s gesehen habe,habe ich hier eins geschrieben. 2Teiler!
Teil1:
Zunächst, wo ist der Unterschied zwischen HTML (o. auch Javascript) zu PHP?
HTML (und Javascript) werden im Quelltext verschickt und erst im Browser interpretiert.
PHP wird auf dem Server ausgeführt und erst NACH Verarbeitung an den Browser gesendet. Das heißt alles was das script braucht muss bereits gesendet sein oder im script erzeugt werden. Mal kurz was nachfragen kann PHP nicht. Ebenso gibt ein PHP skript genau eine Antwort: die generierte Webseite.
Wie benutze ich PHP?
Zunächst ladet euch xampp und installiert es oder besorgt euch einen Hoster mit PHP Unterstützung!
Der Server unterscheidet dann automatisch durch die Dateiendung, ob es sich um reinen HTMLcode handelt, oder ob der PHP parser (der das Script verarbeitet) hinzugezogen werden muss.
VORSICHT ein skript dass bla.html heißt wird direkt im quelltext verschickt! Wir gewöhnen uns also an direkt bei erstellung den namen bla.php zu verwenden!
Wie sieht ein PHP Script aus?
Vom Parser wird alles verarbeitet was innerhalb folgender Tags steht:
Code:
<?php
?>
Das einfachste PHP Script sieht so aus:
Code:
<?php
echo "Hallo Welt!";
?>
Hier sehen wir bereits dass jeder Befehl (schleifen NICHT) mit einem Semikolon ( beendet werden muss.
Dieses Script gib folgendes aus:
Code:
Hallo Welt!
Kommentare
Damit wir auch in einem Jahr noch verstehen was wir uns dort zusammen geschrieben haben, verwenden wir Kommentare:
Code:
/* Dieser Kommentar geht über mehrere Zeilen.
Alles, was in einem Kommentar steht, wird vom Parser IGNORIERT! */
// Dieser Kommentar geht nur bis zum Ende der Zeile...
Variablen in PHP
Variablen in PHP werden mit einem Dollar-Zeichen versehen und grundsätzlich klein Geschrieben! Großbuchstaben sind grundsätzlich Konstanten vorbehalten, Ausnahmen folgen später.
Code:
$variable;
Variablen sind praktisch Merkzettel, deren Beschriftung beliebig oft geändert werden kann. Diese "Beschriftung nennt man "Wert"
Wie setze ich den Wert "Text" (oder eine Zahl als Wert)?
Code:
$variable = "Text";
// oder:
$variable = 2;
Durch EIN Gleichheitszeichen wird der Wert in die Variable geschrieben (zugewiesen). Gab es die Variable vorher nicht, wird sie automatisch erzeugt (initialisiert).
Man beachte den Unterschied zwischen einem Text (String) in Hochkommata und einer Zahl OHNE Hochkommata. PHP entscheidet hier selbständig ob es sich um einen Text oder eine Zahl (oder ein boolscher Wert TRUE (wahr) oder FALSE (unwahr)) handelt.
Konstanten
Konstanten sind "Variablen" die nur EINMAL mit einem Wert versehen werden können. Dieser Wert bleibt für die gesamte Gültigkeit erhalten und kann nicht mehr überschrieben werden. Der Versuch führt zu einem Fehler (hierzu später mehr).
Konsanten werden mit define(); initialisiert und gleichzeitig mit einem Wert belegt.
Code:
define('KONSTANTE', 'Wert der Konstante');
Arrays
Arrays sind "Variablen", die mehrere Werte "tragen" können. In PHP vergrößern und verkleinern sie sich automatisch. Sie sind immer nummeriert (0, 1, usw.) und können sogar einen Namen Tragen (name, wohnort)
Code:
$benutzer['name']="Horst";
$benutzer['wohnort']="München";
$benutzer['alter']=16; /*erzeugt ein Array benutzer name:Horst, wohnort:München....*/
Wenn, dann... sonst ....
Ein wichtiger Teil von dynamik ist die Wenn-Frage
Code:
if($benutzer['name'] == "Horst") /*Doppeltes gleichheitszeichen wird benötigt, wenn etwas verglichen wird. Ein einfaches = würde den Array Wert VERÄNDERN!!!!.
{
echo "Hallo mein Freund, willkommen!";
//begrüße ihn
}
else if ($benutzer['alter'] < "18") /*Heißt der Benutzer NICHT Horst, ist aber unter 18 */
{
echo "Tach du depp!!!!";
// beleidige ihn
}
else // der Benutzer heißt weder Horst NOCH ist er unter 18
{
echo "Hallo, endlich mal ein erwachsener.";
// freue dich über jemand erwachsenes
}
/* else if und else sind nicht zwingend notwendig. Sie werden nur gebraucht wenn etwas anderes getan werden muss falls die Bedingung nicht zutrifft
Fragt man z.B. verschiedene Benutzernamen ab, verwendet man switch-case:
Code:
switch ($benutzer['name'])
{
case "Horst":
echo "Hallo Freund!";
break; //beendet die Abfrage
case "Sebastian":
echo "Hallo Kumpel!";
break;
case "Tobias":
echo "Hallo du ARSCH!";
break;
default: // falls keins der genannten zutrifft
echo "Ich kenne dich nicht";
}
// ohne break werden die anderen Bedingungen noch geprüft!
Schleifen
Die einfachste (und häufig schnellste) Schleife ist eine for-Schleife.
Code:
// mach 5 mal das was in der Schleife steht!
for($i=0; $i <=5; $i++)
{
echo "ich bin bei Durchgang: ".$i." angekommen <br>";
}
/* $i=0 heißt fange bei 0 an
$i <= 5 heißt durchlaufe die Schleife solange $i kleiner oder gleich 5 ist
$i++ heißt Erhöhe $i um 1 nach jedem Schleifendurchlauf */
benötige ich eine kompliziertere Bedingung, so nehme ich eine While Schleife:
Code:
$wetter = "regnerisch";
while($wetter == "regnerisch")
{
if($wochentag != "Samstag" AND $wochentag != "Sonntag") /* wenn $wochentag nicht Samstag UND nicht Sonntag ist */
{
$wetter = "sonnig"; // dann ist auch gutes Wetter
break; // springt aus der Schleife heraus
}
}
/* Diese Schleife wird so lange ausgeführt, wie $wetter regnerisch ist... also das ganze "Wochenende" (bzw bis zur maximalen skriptlaufzeit ) */
Weitere schleifen sind z.B.
do while schleifen
Code:
$wetter = "regnerisch";
do {
//dieser code wird auf jeden Fall einmal ausgeführt
} while($wetter == "sonnig")
und die foreach Schleife
Code:
/* Diese Schleife "kopiert" den Inhalt von $benutzer in einzelne Variablenpaare */
foreach($benutzer as $datenfeld => $feldinhalt)
{
echo $datenfeld.": ".$feldinhalt."<br>";
/*gibt aus:
name: Horst
wohnort: München
alter: 16*/
/*Die Variablen $datenfeld und $feldinhalt verfallen nach Ende der Schleife. Waren sie vorher definiert, so werden sie wie $benutzer wird nicht geändert, haben aber innerhalb der Schleife den neuen Wert!*/
}
Vordefinierte Variablen
Es gibt eine Reihe von vordefinierten Variablen und Konstanten. Eine vollständige Auflistung findet ihr hier:
Diese sollten nicht verändert werden.
Über die folgenden vordefinierten Arrays werden z.B. Daten an das Skript übergeben:
Code:
echo $_POST['benutzername'];
/* gibt nach dem Senden eines HTML POST Formulars den Inhalt des Feldes mit dem Namen (name=) "benutzername" aus. */
echo $_GET['id'];
/* gibt nach dem Senden eines HTML GET Formulares oder bei einer URL den Wert des Feldes bzw die GET Variable "id" aus */
Funktionen
Funktionen werden immer dann benutzt wenn ein bestimmtes Verhalten mehr als einmal gebraucht wird.
Der Übersicht halber werden sie (genau wie Variablen die das ganze script betreffen) am besten direkt am Anfang der PHP Datei definiert.
Code:
function hoch2($variable1, $variable2=NULL) /* Variable 1 wird zwingend benötigt, Variable 2 nicht! */
{
$rueckgabewert[0] = $variable1*$variable1;
$rueckgabewert[1] = $variable2*$variable2
return $rueckgabewert;
}
// erst bei Aufruf wird die Funktion benutzt
$hoch2 = hoch2(5, 15);
echo $hoch2[0];
// gibt den Rückgabewert 25 aus
es gibt natürlich bereits eine riesige Sammlung von Funktionen die in PHP implementiert sind. Auch hier hilft php.net, damit man sich nicht Arbeit macht die schon längst erledigt ist.
Das obige Beispiel hätte mit vorhandenen funktionen schon gelöst werden können:
Code:
echo pow(5);
Ergänzung von L1ght:
isset() ist ein Befehl, der prüft, ob eine Variable mit Inhalt belegt wurde.
Inhalt kann auch ein leerer String sein $bla=''; liefert bei isset($bla) auch true:
Code:
if(isset($_POST['submit']))
{
echo "blaa";
}else{
echo "blub";
}
Andere Schreibweisen, Objektorientierung, MySQL, spezielle Variablen und Arrays, kommen bei Interesse auch noch dran.
HTML (und Javascript) werden im Quelltext verschickt und erst im Browser interpretiert.
PHP wird auf dem Server ausgeführt und erst NACH Verarbeitung an den Browser gesendet. Das heißt alles was das script braucht muss bereits gesendet sein oder im script erzeugt werden. Mal kurz was nachfragen kann PHP nicht. Ebenso gibt ein PHP skript genau eine Antwort: die generierte Webseite.
Wie benutze ich PHP?
Zunächst ladet euch xampp und installiert es oder besorgt euch einen Hoster mit PHP Unterstützung!
Der Server unterscheidet dann automatisch durch die Dateiendung, ob es sich um reinen HTMLcode handelt, oder ob der PHP parser (der das Script verarbeitet) hinzugezogen werden muss.
VORSICHT ein skript dass bla.html heißt wird direkt im quelltext verschickt! Wir gewöhnen uns also an direkt bei erstellung den namen bla.php zu verwenden!
Wie sieht ein PHP Script aus?
Vom Parser wird alles verarbeitet was innerhalb folgender Tags steht:
Code:
<?php
?>
Das einfachste PHP Script sieht so aus:
Code:
<?php
echo "Hallo Welt!";
?>
Hier sehen wir bereits dass jeder Befehl (schleifen NICHT) mit einem Semikolon ( beendet werden muss.
Dieses Script gib folgendes aus:
Code:
Hallo Welt!
Kommentare
Damit wir auch in einem Jahr noch verstehen was wir uns dort zusammen geschrieben haben, verwenden wir Kommentare:
Code:
/* Dieser Kommentar geht über mehrere Zeilen.
Alles, was in einem Kommentar steht, wird vom Parser IGNORIERT! */
// Dieser Kommentar geht nur bis zum Ende der Zeile...
Variablen in PHP
Variablen in PHP werden mit einem Dollar-Zeichen versehen und grundsätzlich klein Geschrieben! Großbuchstaben sind grundsätzlich Konstanten vorbehalten, Ausnahmen folgen später.
Code:
$variable;
Variablen sind praktisch Merkzettel, deren Beschriftung beliebig oft geändert werden kann. Diese "Beschriftung nennt man "Wert"
Wie setze ich den Wert "Text" (oder eine Zahl als Wert)?
Code:
$variable = "Text";
// oder:
$variable = 2;
Durch EIN Gleichheitszeichen wird der Wert in die Variable geschrieben (zugewiesen). Gab es die Variable vorher nicht, wird sie automatisch erzeugt (initialisiert).
Man beachte den Unterschied zwischen einem Text (String) in Hochkommata und einer Zahl OHNE Hochkommata. PHP entscheidet hier selbständig ob es sich um einen Text oder eine Zahl (oder ein boolscher Wert TRUE (wahr) oder FALSE (unwahr)) handelt.
Konstanten
Konstanten sind "Variablen" die nur EINMAL mit einem Wert versehen werden können. Dieser Wert bleibt für die gesamte Gültigkeit erhalten und kann nicht mehr überschrieben werden. Der Versuch führt zu einem Fehler (hierzu später mehr).
Konsanten werden mit define(); initialisiert und gleichzeitig mit einem Wert belegt.
Code:
define('KONSTANTE', 'Wert der Konstante');
Arrays
Arrays sind "Variablen", die mehrere Werte "tragen" können. In PHP vergrößern und verkleinern sie sich automatisch. Sie sind immer nummeriert (0, 1, usw.) und können sogar einen Namen Tragen (name, wohnort)
Code:
$benutzer['name']="Horst";
$benutzer['wohnort']="München";
$benutzer['alter']=16; /*erzeugt ein Array benutzer name:Horst, wohnort:München....*/
Wenn, dann... sonst ....
Ein wichtiger Teil von dynamik ist die Wenn-Frage
Code:
if($benutzer['name'] == "Horst") /*Doppeltes gleichheitszeichen wird benötigt, wenn etwas verglichen wird. Ein einfaches = würde den Array Wert VERÄNDERN!!!!.
{
echo "Hallo mein Freund, willkommen!";
//begrüße ihn
}
else if ($benutzer['alter'] < "18") /*Heißt der Benutzer NICHT Horst, ist aber unter 18 */
{
echo "Tach du depp!!!!";
// beleidige ihn
}
else // der Benutzer heißt weder Horst NOCH ist er unter 18
{
echo "Hallo, endlich mal ein erwachsener.";
// freue dich über jemand erwachsenes
}
/* else if und else sind nicht zwingend notwendig. Sie werden nur gebraucht wenn etwas anderes getan werden muss falls die Bedingung nicht zutrifft
Fragt man z.B. verschiedene Benutzernamen ab, verwendet man switch-case:
Code:
switch ($benutzer['name'])
{
case "Horst":
echo "Hallo Freund!";
break; //beendet die Abfrage
case "Sebastian":
echo "Hallo Kumpel!";
break;
case "Tobias":
echo "Hallo du ARSCH!";
break;
default: // falls keins der genannten zutrifft
echo "Ich kenne dich nicht";
}
// ohne break werden die anderen Bedingungen noch geprüft!
Schleifen
Die einfachste (und häufig schnellste) Schleife ist eine for-Schleife.
Code:
// mach 5 mal das was in der Schleife steht!
for($i=0; $i <=5; $i++)
{
echo "ich bin bei Durchgang: ".$i." angekommen <br>";
}
/* $i=0 heißt fange bei 0 an
$i <= 5 heißt durchlaufe die Schleife solange $i kleiner oder gleich 5 ist
$i++ heißt Erhöhe $i um 1 nach jedem Schleifendurchlauf */
benötige ich eine kompliziertere Bedingung, so nehme ich eine While Schleife:
Code:
$wetter = "regnerisch";
while($wetter == "regnerisch")
{
if($wochentag != "Samstag" AND $wochentag != "Sonntag") /* wenn $wochentag nicht Samstag UND nicht Sonntag ist */
{
$wetter = "sonnig"; // dann ist auch gutes Wetter
break; // springt aus der Schleife heraus
}
}
/* Diese Schleife wird so lange ausgeführt, wie $wetter regnerisch ist... also das ganze "Wochenende" (bzw bis zur maximalen skriptlaufzeit ) */
Weitere schleifen sind z.B.
do while schleifen
Code:
$wetter = "regnerisch";
do {
//dieser code wird auf jeden Fall einmal ausgeführt
} while($wetter == "sonnig")
und die foreach Schleife
Code:
/* Diese Schleife "kopiert" den Inhalt von $benutzer in einzelne Variablenpaare */
foreach($benutzer as $datenfeld => $feldinhalt)
{
echo $datenfeld.": ".$feldinhalt."<br>";
/*gibt aus:
name: Horst
wohnort: München
alter: 16*/
/*Die Variablen $datenfeld und $feldinhalt verfallen nach Ende der Schleife. Waren sie vorher definiert, so werden sie wie $benutzer wird nicht geändert, haben aber innerhalb der Schleife den neuen Wert!*/
}
Vordefinierte Variablen
Es gibt eine Reihe von vordefinierten Variablen und Konstanten. Eine vollständige Auflistung findet ihr hier:
Diese sollten nicht verändert werden.
Über die folgenden vordefinierten Arrays werden z.B. Daten an das Skript übergeben:
Code:
echo $_POST['benutzername'];
/* gibt nach dem Senden eines HTML POST Formulars den Inhalt des Feldes mit dem Namen (name=) "benutzername" aus. */
echo $_GET['id'];
/* gibt nach dem Senden eines HTML GET Formulares oder bei einer URL den Wert des Feldes bzw die GET Variable "id" aus */
Funktionen
Funktionen werden immer dann benutzt wenn ein bestimmtes Verhalten mehr als einmal gebraucht wird.
Der Übersicht halber werden sie (genau wie Variablen die das ganze script betreffen) am besten direkt am Anfang der PHP Datei definiert.
Code:
function hoch2($variable1, $variable2=NULL) /* Variable 1 wird zwingend benötigt, Variable 2 nicht! */
{
$rueckgabewert[0] = $variable1*$variable1;
$rueckgabewert[1] = $variable2*$variable2
return $rueckgabewert;
}
// erst bei Aufruf wird die Funktion benutzt
$hoch2 = hoch2(5, 15);
echo $hoch2[0];
// gibt den Rückgabewert 25 aus
es gibt natürlich bereits eine riesige Sammlung von Funktionen die in PHP implementiert sind. Auch hier hilft php.net, damit man sich nicht Arbeit macht die schon längst erledigt ist.
Das obige Beispiel hätte mit vorhandenen funktionen schon gelöst werden können:
Code:
echo pow(5);
Ergänzung von L1ght:
isset() ist ein Befehl, der prüft, ob eine Variable mit Inhalt belegt wurde.
Inhalt kann auch ein leerer String sein $bla=''; liefert bei isset($bla) auch true:
Code:
if(isset($_POST['submit']))
{
echo "blaa";
}else{
echo "blub";
}
Andere Schreibweisen, Objektorientierung, MySQL, spezielle Variablen und Arrays, kommen bei Interesse auch noch dran.
Teil2
PHP in kurz?!?
PHP bietet eine Reihe platzsparender Möglichkeiten an, komplexe Vorgänge Codesparend auszudrücken. Der Hauptzweck liegt darin, die PHP files kleiner zu machen, oder einfach nur gut auszusehen. Rekursive Algorithmen sind zwar auch codesparend, möchte ich an dieser Stelle jedoch nicht ansprechen.
Als Beispiel verwende ich folgendes (Bei Verständnisproblemen bitte erst Teil 1 (Link s.o.) lesen)
PHP-Code:
<?php
if(isset($_GET['username']){ // WENN username aus GET Formular gesendet wurde und einen Wert enthält
echo $_GET['username']; // gib es aus, VORSICHT vor XSS an dieser Stelle ... dieser code ist nicht XSS sicher
else {
echo "Username nicht eingegeben";
}
sehr leicht zu lesen, aber 7 Zeilen lang... das geht auch kürzer:
PHP-Code:
<?php
(isset($_GET['username'])) ? echo $_GET['username'] : echo "Username nicht eingegeben";
?>
auch denkbar wäre:
PHP-Code:
<?php
$echo = (isset($_GET['username'])) ? $_GET['username'] : "Username nicht eingegeben";
echo $echo;
?>
PHP lässt also nicht nur zu, mit dem ternären Operator "if" kurz abzuhandeln, sondern in einem sogar Variablen zuzuweisen.
Ab PHP 5.3 gibt es eine noch kürzere Form (die für unser Beispiel nicht nutzbar ist):
PHP-Code:
<?php
$bool = (isset($true)) ?: FALSE; //Wenn $true gesetzt ist, wird $bool WAHR (= Wert des Ausdrucks), sonst FALSCH
?>
Wenn "short_open_tags" in der php.ini aktiv ist, funktioniert auch:
PHP-Code:
<?php
// irgend ein php code
?>
<?
// auch irgend ein php code
?>
letzteres sollte nur verwendet werden, wenn der php code NUR auf Maschinen betrieben wird, die short open tags unterstützen... verkauft man scripte, ist hiervon nicht zwingend auszugehen... Vorsicht ist also geboten
Will man nur eine Variable, z.B. Benutzernamen ausgeben, eignet sich auch eine quick&dirty Version, die ohne Echo auskommt:
PHP-Code:
HTML BLA
<?=$username?>
HTML BLA
Auch bei Schleifen sind "kurzschreibweisen" denkbar... da ich diesen Stil aber nicht mag (und diese Form nicht wirklich kürzer ist, gehe ich hier darauf nicht ein.
PHP und MySQL
Nicht Teil dieses howtos wird sein, wie MySQL funktioniert oder was die queries bedeuten. Bei Bedarf und Zeit schreibe ich hierzu ein weiteres tut/howto.
Zunächst wird immer eine Datenbankverbindung benötigt. In folgenden Beispielen setze ich voraus, dass die Verbindung bereits hergestellt wurde.
PHP-Code:
<?php
$verbindung = mysql_connect('localhost', 'mysql_user', 'mysql_passwort'); // stelle Verbindung mit localhost, user: mysql_user und Passwort: mysql_passwort her und setze das Ergebnis (Verbindungsid) nach $verbindung... im Fehlerfall wird $verbindung mit false belegt! Auch Variablen übergeben ($username, $passwort) ist denkbar.
if (!$verbindung) {
die('Konnte nicht zum Server verbinden: ' . mysql_error()); // brich das script mit der mysql Fehlermeldung ab
}
$db_verbunden = mysql_select_db('meine_db', $verbindung); // wähle Datenbank "meine_db" aus
if(!$db_verbunden){
die('Konnte Datenbank nicht auswählen' . mysql_error());
}
echo 'verbunden'; // gebe "verbunden" als Bestätigung aus
mysql_close($verbindung); // schließe die geöffnete Verbindung
?>
Das Überprüfen der Verbindung, sowie das schließen der Verbindung (am Ende des Scriptes, bzw nach dem letzten Zugriff) gehören zum guten Ton, auch wenn PHP selbständig die Datenbankverbindung schließt wenn das Script endet. die() ist nicht unbedingt die beste Variante, falls die Verbindung mitten im html code hergestellt wird. In dem Fall würde eine zerhackte HTML ausgegeben... Hier eignet sich die Ausgabe einer "hübschen" Fehlermeldung ohne die() oder das Verschieben des Connects an den Anfang des Scripts.
Zum Absichern von Queries gibt es diverse Möglichkeiten. Eine Variante ist die strikte Überprüfung von Variablen auf erlaubten Inhalt. Eine weitere ist das "blinde" escapen verdächtiger Zeichen, oder das datenbankspezifische escapen.
Die einzig wirklich verlässliche Methode ist jedoch, prepared statements zu nutzen. Neben PDO ist dies auch mit mysqli möglich.
böses Query:
PHP-Code:
<?php
$ressource = mysql_query("SELECT * FROM user WHERE user_name=".$_POST['username']." AND passwort=".$_POST['passwort']);
// wer SQL Injection beherrscht weiß automatisch bescheid. Für alle anderen: don´t do that!!!!!
?>
sicherer über mysqli:
PHP-Code:
<?php
// beachte dass der connect dann über mysqli_connect geschehen muss:
$verbindung = mysqli_connect("localhost", "root", "passwort", "meine_db");
if ($prepare = mysqli_prepare($verbindung, "SELECT * FROM user WHERE user_name=? AND passwort=?")) { // bereite Statement vor
mysqli_stmt_bind_param($prepare, 'ss', $_POST['username'], $_POST['passwort']); // binde die Parameter als Strings ('ss' -> 2 parameter, beide strings, i für integer, d für double, b für blob)
mysqli_stmt_execute($prepare); // führe statement aus
mysqli_stmt_store_result($prepare); // schiebe das Ergebnis in den buffer (kann entfallen bei Inserts und Updates)
// ausgabe, schleife etc zur Nutzung des results z.B mit mysqli_stmt_fetch()
mysqli_stmt_close($prepare); // schließe das statement und gebe den Speicher wieder frei
}
?>
Eine SQL Injection ist (wenn man JEDES query so strukturiert ist (connect natürlich nur einmal notwendig)) nicht möglich. Allerdings bleibt zu beachten, dass der Output bei Selects natürlich XSS code oder unsichere Zeichen, html code und ähnliches enthalten könnte.... echos sollten hier natürlich noch passend gefiltert werden um dies zu verhindern (nicht Teil dieses Tuts)
Diese Variante funktioniert nur auf Servern, die die MySQLi Erweiterung unterstützen. Viele (aber nicht alle) free-hoster unterstützen es. Muss man hierauf verzichten, kann man sich auch anders behelfen:
PHP-Code:
<?php
$username = mysql_real_escape_string($_POST['username']);
$passwort = mysql_real_escape_string($_POST['passwort']);
$ressource = mysql_query("SELECT * FROM user WHERE user_name=".$username." AND passwort=".$passwort);
// für bestimmte werte wie boolean, float, int o.ä. empfiehlt sich ein cast: $id = (int)$_POST['id']; Auch hier ist bei nicht-strings eine Injection nicht mehr möglich... escapen oder casten muss (!!!) allerdings bei JEDER Variable erfolgen, die in ein Query übernommen wird...
?>
Hat man Inserts oder Updates escaped, bedeutet das, dass man unschöne Backslashes vor Zeichen stehen hat (z.B. "YaHomie\'s files")...
Diese kann man mittelst strip_slashes() vor der Ausgabe wieder entfernen:
PHP-Code:
<?php
$usertitel = strip_slashes($usertitel_aus_datenbank);
echo $usertitel;
?>
Spätestens hier fällt auf, dass prepared statements weniger Arbeit erfordern...
Von mysql_escape_string(), sowie addslashes() sollte man ZWINGEND Abstand nehmen. Beide bieten keinen wirksamen Schutz.
PHP bietet eine Reihe platzsparender Möglichkeiten an, komplexe Vorgänge Codesparend auszudrücken. Der Hauptzweck liegt darin, die PHP files kleiner zu machen, oder einfach nur gut auszusehen. Rekursive Algorithmen sind zwar auch codesparend, möchte ich an dieser Stelle jedoch nicht ansprechen.
Als Beispiel verwende ich folgendes (Bei Verständnisproblemen bitte erst Teil 1 (Link s.o.) lesen)
PHP-Code:
<?php
if(isset($_GET['username']){ // WENN username aus GET Formular gesendet wurde und einen Wert enthält
echo $_GET['username']; // gib es aus, VORSICHT vor XSS an dieser Stelle ... dieser code ist nicht XSS sicher
else {
echo "Username nicht eingegeben";
}
sehr leicht zu lesen, aber 7 Zeilen lang... das geht auch kürzer:
PHP-Code:
<?php
(isset($_GET['username'])) ? echo $_GET['username'] : echo "Username nicht eingegeben";
?>
auch denkbar wäre:
PHP-Code:
<?php
$echo = (isset($_GET['username'])) ? $_GET['username'] : "Username nicht eingegeben";
echo $echo;
?>
PHP lässt also nicht nur zu, mit dem ternären Operator "if" kurz abzuhandeln, sondern in einem sogar Variablen zuzuweisen.
Ab PHP 5.3 gibt es eine noch kürzere Form (die für unser Beispiel nicht nutzbar ist):
PHP-Code:
<?php
$bool = (isset($true)) ?: FALSE; //Wenn $true gesetzt ist, wird $bool WAHR (= Wert des Ausdrucks), sonst FALSCH
?>
Wenn "short_open_tags" in der php.ini aktiv ist, funktioniert auch:
PHP-Code:
<?php
// irgend ein php code
?>
<?
// auch irgend ein php code
?>
letzteres sollte nur verwendet werden, wenn der php code NUR auf Maschinen betrieben wird, die short open tags unterstützen... verkauft man scripte, ist hiervon nicht zwingend auszugehen... Vorsicht ist also geboten
Will man nur eine Variable, z.B. Benutzernamen ausgeben, eignet sich auch eine quick&dirty Version, die ohne Echo auskommt:
PHP-Code:
HTML BLA
<?=$username?>
HTML BLA
Auch bei Schleifen sind "kurzschreibweisen" denkbar... da ich diesen Stil aber nicht mag (und diese Form nicht wirklich kürzer ist, gehe ich hier darauf nicht ein.
PHP und MySQL
Nicht Teil dieses howtos wird sein, wie MySQL funktioniert oder was die queries bedeuten. Bei Bedarf und Zeit schreibe ich hierzu ein weiteres tut/howto.
Zunächst wird immer eine Datenbankverbindung benötigt. In folgenden Beispielen setze ich voraus, dass die Verbindung bereits hergestellt wurde.
PHP-Code:
<?php
$verbindung = mysql_connect('localhost', 'mysql_user', 'mysql_passwort'); // stelle Verbindung mit localhost, user: mysql_user und Passwort: mysql_passwort her und setze das Ergebnis (Verbindungsid) nach $verbindung... im Fehlerfall wird $verbindung mit false belegt! Auch Variablen übergeben ($username, $passwort) ist denkbar.
if (!$verbindung) {
die('Konnte nicht zum Server verbinden: ' . mysql_error()); // brich das script mit der mysql Fehlermeldung ab
}
$db_verbunden = mysql_select_db('meine_db', $verbindung); // wähle Datenbank "meine_db" aus
if(!$db_verbunden){
die('Konnte Datenbank nicht auswählen' . mysql_error());
}
echo 'verbunden'; // gebe "verbunden" als Bestätigung aus
mysql_close($verbindung); // schließe die geöffnete Verbindung
?>
Das Überprüfen der Verbindung, sowie das schließen der Verbindung (am Ende des Scriptes, bzw nach dem letzten Zugriff) gehören zum guten Ton, auch wenn PHP selbständig die Datenbankverbindung schließt wenn das Script endet. die() ist nicht unbedingt die beste Variante, falls die Verbindung mitten im html code hergestellt wird. In dem Fall würde eine zerhackte HTML ausgegeben... Hier eignet sich die Ausgabe einer "hübschen" Fehlermeldung ohne die() oder das Verschieben des Connects an den Anfang des Scripts.
Zum Absichern von Queries gibt es diverse Möglichkeiten. Eine Variante ist die strikte Überprüfung von Variablen auf erlaubten Inhalt. Eine weitere ist das "blinde" escapen verdächtiger Zeichen, oder das datenbankspezifische escapen.
Die einzig wirklich verlässliche Methode ist jedoch, prepared statements zu nutzen. Neben PDO ist dies auch mit mysqli möglich.
böses Query:
PHP-Code:
<?php
$ressource = mysql_query("SELECT * FROM user WHERE user_name=".$_POST['username']." AND passwort=".$_POST['passwort']);
// wer SQL Injection beherrscht weiß automatisch bescheid. Für alle anderen: don´t do that!!!!!
?>
sicherer über mysqli:
PHP-Code:
<?php
// beachte dass der connect dann über mysqli_connect geschehen muss:
$verbindung = mysqli_connect("localhost", "root", "passwort", "meine_db");
if ($prepare = mysqli_prepare($verbindung, "SELECT * FROM user WHERE user_name=? AND passwort=?")) { // bereite Statement vor
mysqli_stmt_bind_param($prepare, 'ss', $_POST['username'], $_POST['passwort']); // binde die Parameter als Strings ('ss' -> 2 parameter, beide strings, i für integer, d für double, b für blob)
mysqli_stmt_execute($prepare); // führe statement aus
mysqli_stmt_store_result($prepare); // schiebe das Ergebnis in den buffer (kann entfallen bei Inserts und Updates)
// ausgabe, schleife etc zur Nutzung des results z.B mit mysqli_stmt_fetch()
mysqli_stmt_close($prepare); // schließe das statement und gebe den Speicher wieder frei
}
?>
Eine SQL Injection ist (wenn man JEDES query so strukturiert ist (connect natürlich nur einmal notwendig)) nicht möglich. Allerdings bleibt zu beachten, dass der Output bei Selects natürlich XSS code oder unsichere Zeichen, html code und ähnliches enthalten könnte.... echos sollten hier natürlich noch passend gefiltert werden um dies zu verhindern (nicht Teil dieses Tuts)
Diese Variante funktioniert nur auf Servern, die die MySQLi Erweiterung unterstützen. Viele (aber nicht alle) free-hoster unterstützen es. Muss man hierauf verzichten, kann man sich auch anders behelfen:
PHP-Code:
<?php
$username = mysql_real_escape_string($_POST['username']);
$passwort = mysql_real_escape_string($_POST['passwort']);
$ressource = mysql_query("SELECT * FROM user WHERE user_name=".$username." AND passwort=".$passwort);
// für bestimmte werte wie boolean, float, int o.ä. empfiehlt sich ein cast: $id = (int)$_POST['id']; Auch hier ist bei nicht-strings eine Injection nicht mehr möglich... escapen oder casten muss (!!!) allerdings bei JEDER Variable erfolgen, die in ein Query übernommen wird...
?>
Hat man Inserts oder Updates escaped, bedeutet das, dass man unschöne Backslashes vor Zeichen stehen hat (z.B. "YaHomie\'s files")...
Diese kann man mittelst strip_slashes() vor der Ausgabe wieder entfernen:
PHP-Code:
<?php
$usertitel = strip_slashes($usertitel_aus_datenbank);
echo $usertitel;
?>
Spätestens hier fällt auf, dass prepared statements weniger Arbeit erfordern...
Von mysql_escape_string(), sowie addslashes() sollte man ZWINGEND Abstand nehmen. Beide bieten keinen wirksamen Schutz.
Wer das alles durchgelesen hat ohne Pause na dann xD Gratulation.
Bei Fragen an mich wenden.
HTML lernen= selfhtml.de
MFG FakeTool
Ich warte auf Feedbacks