PHP wird mit HTML gemischt. Man erzeugt eine HTML Seite mit den erforderlichen HTML-Elementen und speichert diese Datei mit der Endung php ab.
Nun kann man in der HTML Seite an beliebigen Stellen und mehreren Stellen PHP Code einfügen, welcher auf dem Server generiert wird. Das bedeutet, man sieht nie den Code im Browser sondern nur den ausgeführten Code.
<?php ....dein PHP Code.... ?>
Mit PHP lassen sich Codeschnipsel erstellen, die auf mehreren Seiten eingebunden werden. Beispielsweise ein Hauptmenü.
<?php include "nav.php";?>
siehe auch den Tipp Dynamisches Menü
<?php
echo "Hallo Welt";
?>
Mit echo kann man etwas ausgeben lassen. Mehrere Ausgaben werden mit Punkt . voneinander getrennt.
<?php
echo "Hallo" . "Welt";
?>
Es gibt einzeilige Kommentare mit // und mehrzeilige Kommentare. /* */
<?php
//einzeiliger Kommentar
echo "Hallo";
/*ein mehrzeiliger
Kommentar */
echo "Welt";
?>
Eine Variable ist ein Container in dem etwas gespeichert wird. Eine Variable beginnt mit einem Dollarzeichen.
$preis = 30;
echo "Der Preis ist: ".$preis." Euro";
Es gibt folgende Datentypen
Der Datentyp muss nicht explizit angegeben werden. Anhand des zugewiesenen Wertes ergibt sich der Datentyp. Der Datentyp einer Variablen kann sich ändern.
Es gelten folgende Regeln für die Namensvergabe
$ganzZahl = 40;
$kommaZahl = 4.4;
$grossZahl = 4e6; // 4000000 oder 4 x 10 hoch 6
$kleinZahl = 4e-3; // 0.004 oder 4 x 10 hoch -3
40
4.4
4000000
0.004
Umwandeln, Konvertieren in eine Zahl mit doubleval()
oder intval()
.
In PHP gibt es die gleichen arithmetischen Operatoren wie in Javascript.
Die Formulardaten werden in einem HTML Formular an ein PHP- Programm / Seite verschickt. Dort werden sie mit POST oder GET empfangen.
Damit kein böswilliger Code in die Programmierung gelangt, werden alle HTML-spezifischen Zeichen mit htmlentities()
in die entsprechenden Entities umgewandelt.
formular.html
<form action="formular.php" method="post">
<p>
<label>Vorname<br>
<input type="text" name="vorname">
</label>
</p>
<p>
<label>Nachname<br>
<input type="text" name="nachname">
</label>
</p>
<p><input type="submit"></p>
</form>
formular.php
<?php
$vorname = htmlentities($_POST["vorname"]);
$nachname = htmlentities($_POST["nachname"]);
echo $vorname." ".$nachname;
?>
Wenn man ein Formular nicht an eine weitere Php-Datei schicken möchte, sondern die Daten des Formulars in der gleichen Datei auswerten möchte, muss man im PHP Code überprüfen ob die gesendeten Variablen vorhanden sind und ob in einem oder mehreren Eingabefeldern eine Eingabe gemacht wurde.
if (isset($_POST["var1"])) { if ($_POST["var1"] != '' && $_POST["var2"] != '') { echo "Ihre Zahlen sind: ". htmlentities($_POST["var1"])." und ".htmlentities($_POST["var2"]); }
Mit else könnte man noch auf die verschiedenen Situationen reagieren und entsprechende Ausgaben machen, wie im Beispiel.
Im folgenden Beispiel muss zuvor eine Tabelle in einer Datenbank angelegt werden. Das kann man mit PHP-MyAdmin machen. Die Datenbank heißt firma die Tabelle heißt personen und hat die
Felder: name, vorname, id, geburtstag
Zuerst muss eine Verbindung zur Datenbank erstellt werden mit @new mysqli()
Das @Zeichen sorgt dafür, dass keine Fehlerausgaben gemacht werden. Fehlerausgaben könnten Informationen enthalten, die für böswillige Zwecke genutzt werden könnten.
Die Parameter in myqli()
sind: Adresse zur Datenbank, Anmeldename, Passwort, Datenbankname
In diesem Beispiel geht es um eine lokale Datenbank beispielsweise wamp oder xamp.
$con->set_charset("utf8");
Dann wird der Zeichensatz angegeben utf-8.
if($con->connect_error)
exit("Fehler bei der Verbindung");
Dann wird überprüft, ob die Verbindung erfolgreich war. Mit exit wird eine Fehlerausgabe gemacht und alle weiteren Befehle abgebrochen.
$sql = "SELECT * FROM personen";
Eine mySQL Code wird erstellt.
if($res = $con->query($sql)){........}
query()
Der query Befehl der Klasse mysqli
führt den mySQL Code aus. Ist die Abfrage richtig formuliert, wird eine Referenz auf die KLasse mysqli_result
geliefert, welche in diesem Beispiel der Variable $res zugewiesen wird. Diese Methode liefert true, wenn es erfolgreich war.
num_rows
eine Eigenschaft von mysqli_result
liefert die Anzahl der Datensätze.
mit fetch_assoc()
in einer while Schleife durchläuft man die einzelnen Datensätze. Die Feldelemente beinhalten die Datenbankfeldnamen als Schlüssel und die Datenbankfeldwerte als Wert.
In diesem Fall werden sie mit echo ausgegeben, stattdessen könnte man die Felder auch in einem Array speichern.
Zum Schluß wird $res und $con geschlossen.
<?php
$con = @new mysqli("", "root","","team");
$con->set_charset("utf8");
if($con->connect_error)
exit("Fehler bei der Verbindung");
$sql = "SELECT * FROM mitglieder";
if($res = $con->query($sql)){
if($res->num_rows == 0)
echo "kein Eintrag in der Datenbank.";
while($dsatz = $res->fetch_assoc())
{
//Datum formatieren
$bDay = date("d.m.Y",strtotime($dsatz["geburtstag"]));
echo $dsatz["name"]." , "
. $dsatz["vorname"]." , "
. $dsatz["id"]." , "
.$bDay."<br>";
}
$res->close();
}else
exit("Fehler bei der Abfrage");
$con->close();
?>
PHPMyAdmin ist ein Programm, welches in der Regel bei einem Provider installiert ist. Auch bei einer lokalen Datenbank wie XAMP oder Wamp ist es mit installiert. Mit diesem Programm kann man gezielt Abfragen machen, neue Zeilen einfügen, Tabellen erstellen etc. und bekommt dann auch den mySQL Befehl angezeigt. Diese mySQL Befehl kann man dann auch für die Programmierung nutzen.
Im folgenden ein Beispiel aus eine Datenbank namens team und einer Tabelle nammens mitglieder. Es werden die Felder name und lohn ausgegeben, aber nur die Felder, wo lohn größer gleich 2000 und kleiner gleich 3600 ist. Die Tabelle wird absteigend nach dem Feld id geordnet.
Der Aufbau dieses und des vorigen Beispiels ist sehr ähnlich. Lediglich die Namen der Datenbank, Tabelle und Felder sowie die mySQL Anweisung sind anders.
$con = @new mysqli("", "root", "", "team");
$con->set_charset("utf8");
if ($con->connect_error)
exit("Fehler bei der Verbindung");
$sql = "SELECT name, lohn FROM mitglieder WHERE lohn >= 2000 AND lohn <= 3600 ORDER BY id DESC";
if ($res = $con->query($sql)) {
if ($res->num_rows == 0)
echo "kein Eintrag in der Datenbank.";
while ($dsatz = $res->fetch_assoc())
echo $dsatz["name"] . " , "
. $dsatz["lohn"] . " , ";
$res->close();
} else
exit("Fehler bei der Abfrage");
$con->close();
In der WHERE
Klausel können verschiedene Operatoren eingesetzt werden.
Operator | Info |
---|---|
= | gleich |
<> | ungleich |
> | größer als |
>= | größer gleich |
< | kleiner als |
<= | kleiner gleich |
LIKE | Vergleich von Zeichenketten |
Der LIKE Operator bietet die Möglichkeit Zeichenketten oder auch nur Teile von Zeichenketten einzugeben. Die Zeichenkette muss in Hochkommata eingefügt werden. Man kann hier auch Platzhalter einsetzen. ein % Prozentzeichen steht für eine beliebige Anzahl unbekannter Zeichen. Ein _ Unterstrich steht für genau ein unbekanntes Zeichen.
Im folgendem Beispiel werden alle Felder mitglied mit Anfangsbuchstaben M angezeigt
"SELECT * FROM mitglied WHERE name LIKE 'M%' ORDER BY name";
Mehrere Auswahlbedingungen lassen sich verknüpfen mit folgenden Operatoren
Operator | Info |
---|---|
NOT | Der Wahrheitswert wird umgekehrt aus true wird false |
AND | Alle Bedingungen müssen zutreffen |
OR | Mindestens eine der Bedingungen muss zutreffen |
Mit ORDER BY
kann man die Reihenfolge bestimmen. Man gibt das Feld an welches die Reihenfolge bestimmen soll, oder man gibt mehrere Felder mit Komma getrennt an. Das erste bestimmt die Reihenfolge. Sollte es 2 gleiche Felder geben, bestimmt dann das zunächst angegebene die weitere Reihenfolge.
ASC
ascendant bedeutet aufsteigend DESC
descendant absteigend. Aufsteigend ist der Normalfall und muss nicht extra angegeben werden.
Wenn man eine SQL Abfrage aufgrund von Formulareingaben macht, kann man diese SQL Anweisungen auch als prepared Statements programmieren. Dadurch hat man einen Schutz vor SQL-Injections (schädlicher Code über Eingabefelder). Ein weiterer Vorteil ist, dass man diese Statements öfter nutzen kann.
In diesem Beispiel sollen aus den Formularfeldern name, vorname, id die Inhalte in die Datenbankfelder name, vorname, id eingefügt werden.
Die Methode prepare()
der Klasse mysqli
bereitet das prepared Statement vor. Es gibt soviele Fragezeichen wie Werte als Platzhalter. Tritt kein Fehler auf, wird eine Referenz auf die Klasse mysqli_stmt
geliefert. Darüber wird die Methode bind_param()
aufgerufen. Dort werden die Platzhalter mit den Feldern verbunden. Der erste Parameter von bind_param
beinhaltet Buchstaben, die den Datentyp für das jeweilige Feld angibt.
Dann folgen die übermittelten Werte des Formulars. Die Reihenfolge und Anzahl muss übereinstimmen. bind_param
liefert im Erfolgsfall
true
.
Die Methode execute()
führt das prepared Statement aus.
$ps = $con->prepare("INSERT INTO personen (name, vorname,id ) VALUES(?,?,?)"); $ps->bind_param("ssi", $_POST["name"][0], $_POST["vorname"][0], $_POST["id"][0]); $ps->execute(); $ps->close();
In diesem Beispiel wird ein Datensatz geändert. Dazu gibt es 3 PHP Seiten. highscoreAuswahl.php, highscoreAendern.php, highscoreUpdate.php.
highscoreAuswahl.php
Es wird ein Datensatz in einem Formular in einer Tabelle dargestellt. Der Index des jeweiligen Tabellenfeldes wird den Werten von Radiobuttons zugwiesen. Die Radibuttons haben in diesem Beispiel das Attribut name="auswahl"
Der ausgwählte Radiobutton wird an eine neue PHP Seite übertragen. Anfang und Ende des Formulars inklusive Tabelle werden in HTML erstellt.
HTML
<form action="highscoreAendern.php" method="post">
<table>
<tr>
<td>Auswahl</td>
<td>Vorname</td>
<td>Nachname</td>
<td>Punkte</td>
</tr>
PHP
<?php
$con = new mysqli( "Adresse", "Anmeldung", "Passwort", "Datenbank" );
$con->set_charset( "utf8" );
$res = $con->query( "SELECT * FROM highscore" );
while ( $dsatz = $res->fetch_assoc() ) {
echo "<tr>";
echo "<td><label><input type='radio' name='auswahl' value='" . $dsatz[ "nr" ] . "'>";
echo $dsatz[ "nr" ] . "</label></td>";
echo "<td>" . $dsatz[ "vorname" ] . "</td>";
echo "<td>" . $dsatz[ "nachname" ] . "</td>";
echo "<td>" . $dsatz[ "punkte" ] . "</td></tr>";
}
$res->close();
$con->close();
?>
HTML
</table>
<p class="center">
<input type="submit" value="Datensatz anzeigen">
</p>
</form>
highscoreAendern.php
Hier wird ein Datensatz anhand des übermittelten Radiobuttons name="auswahl"
angezeigt.
$sql = "SELECT * FROM highscore WHERE nr = " . intval($_POST["auswahl"]);
Die einzelnen Werte der Datenbankfelder werden den Werten von Formularfeldern zugewiesen.
<p><label><input type='text' name='vorname' value='" . $dsatz["vorname"] . "'> Vorname</label>
So kann man diese Formularfelder ändern und an die Seite highscoreUpdate.php schicken. Der Index, welcher in der Datentabelle und im Formularfeld nr heißt, wird mittels eines input type="hidden"
übermittelt.
PHP
<?php
if (isset($_POST["auswahl"])) {
$con = new mysqli( "Adresse", "Anmeldung", "Passwort", "Datenbank" );
$con->set_charset("utf8");
$sql = "SELECT * FROM highscore WHERE nr = " . intval($_POST["auswahl"]);
$res = $con->query($sql);
$dsatz = $res->fetch_assoc();
echo "<p class='center'>Bitte neue Inhalte eintragen und speichern.</p>";
echo "<form action='highscoreUpdate.php' method='post'>";
echo "<p><label><input type='text' name='vorname' value='" . $dsatz["vorname"] . "'> Vorname</label></p>";
echo "<p><label><input type='text' name='nachname' value='" . $dsatz["nachname"] . "'> Nachname</label></p>";
echo "<p><label><input type='text' name='punkte' value='" . $dsatz["punkte"] . "'> Punkte</label></p>";
echo "<input type='hidden' name='nr' value='" . $_POST["auswahl"] . "'>";
echo "<p><input type='submit' value='speichern'></p></form>";
$res->close();
$con->close();
} else {
echo "<p>Keine Auswahl getroffen.</p>";
}
?>
highscoreUpdate.php
Anhand des Index nr wird der Datensatz mit einem prepared Statement aktualisiert.
<?php
$nr = $_POST["nr"];
echo $nr. $_POST["vorname"].$_POST["punkte"];
$con = new mysqli( "Adresse", "Anmeldung", "Passwort", "Datenbank" );
$con->set_charset("utf8");
$ps = $con->prepare("UPDATE highscore SET vorname = ?, nachname = ? , punkte = ? WHERE nr = $nr");
$ps->bind_param("ssi", $_POST["vorname"], $_POST["nachname"], $_POST["punkte"]);
$ps->execute();
if ($ps->affected_rows > 0)
echo "<p class='center'>Der Datensatz wurde geändert.</p>";
else
echo "Es wurden keine Änderung vorgenommen.";
$ps->close();
$con->close();
?>
Php erledigt Aufgaben wie auf Datenbanken zugreifen, Daten laden, Daten speichern, während Javascript im Browser ausgeführt wird und mehr so Aufgaben übernimmt wie auf Usereingaben zu reagieren. Wie bekommt man beides unter einen Hut?
siehe auch Beitrag auf lima-city
Eine Möglichkeit ist, dass ein Array welches in PHP vorliegt, in ein Javascript Array übertragen wird. Dazu schreibt man den PHP Block in den Scriptblock von Javascript und nutzt echo, um den Javascript Code zu erzeugen.
Im folgenden Beispiel könnte das 2dimensionale Array $verb auch aus einer Datenbank oder CSV Datei geladen worden sein. Das Array $ verb wird dann eins zu eins mit json_encode()
in das Javascript Array fragen übertragen.
<?php
$verb[0] = ["abuse", "Mißbrauch"];
$verb[1] = ["accomplish","vervollständigen"];
$verb[2] = ["boost","verstärken"];
?>
<script>
<?php
$jsarray = json_encode($verb);
echo("var fragen = $jsarray;");
?>
console.log(fragen[1][0]);
</script>
1. Erzeuge eine PHP-Datei mit folgenden Code:
<?php echo dirname(__FILE__); ?>
Speichere diese PHP Datei in dem Verzeictschnis ab, welches geschützt werden soll, lade Sie hoch und rufe Sie mit dem Webbrowser aus.
Es wird der Pfad auf dem Webserver ausgegeben. Kopiere die Zeile.
2. Rufe diesen Link auf. Sollte der link nicht mehr gültig sein, suche bei google nach einem htaccess Genearator.
http://www.htaccesseditor.com/gr.shtml
Wähle Standard Athentifizierung und
Gebe unter Schritt 2 den kopierten Pfad ein aber setze an das Ende /.htpasswd
Setze einen Anmeldenamen und ein Passwort ein und klicke auf Erstellen. Unten erscheint ein Code.
3. Nun rufen wir einen Texteditor auf und kopieren den erzeugten Code für die .htaccess
AuthUserFile /pfad/den/die/phpdatei/angezeigt/hat/.htpasswd
AuthGroupFile /dev/null
AuthName "Password Protected Area"
AuthType Basic
<limit GET POST>
require valid-user
</limit>
Speichere diese Datei mit der Bezeichnung .htaccess im gleichen Ordner ab und lade Sie hoch.
(ACHTUNG!! DEN PUNKT vor htaccess nicht vergessen!)
3. Nun benötigen wir noch die .htpasswd
Kopiere die generierte Zeile aus dem Htaccessgenerator.
Öffne den Texteditor und füge die Zeile in eine neue Textdatei ein.
Beispiel Code:
benutzername:$1$flVPU.Vb$sDdtz1m9UzS09YBdiiOpUH.
Speichere diese Datei unter dem Namen .htpasswd im gleichen Verzeichnis ab und lade sie hoch.
Fertig. Beim Aufruf des Ordners im Browser wird man nach Benutzernamen und Passwort gefragt.
Wenn man mehrere Passworte zuweisen möchte, generiert man auf der Htaccess-Generator Seiten eine weitere Anmeldung mit Passwort und fügt den erstellten Code einfach in eine neue Zeile der .htpasswd ein.