Dieser Kurs ist eine Einführung in PHP und mySQL. Die nötigen Grundlagen werden anhand der Planung und Umsetzung eines Newssystem besprochen. So lernt man das nötige Handwerkszeug, um zukünftig eigene Projekte umzusetzen. Im dem dritten Teil dieses Kurses geht es um die Ausgabe der News auf der Homepage. Dabei werde zwei Möglichkeiten angesprochen. Zum einen die Möglichkeit alle News auszugeben und zum anderen die Möglichkeit nur eine bestimmte Anzahl von Nachrichten anzeigen zu lassen. In der Regel wird es so sein, dass man die News auf einer schon bestehenden Internetseiten ausgaben will. Darum wird hier die Möglichkeit gezeigt wie man die News über Templates ausgeben kann. Zunächst wird eine neue Datei angelegt. Die neue Datei steht symbolisch für die schon vorhandene Internetseite auf der die Nachrichten angezeigt werden sollen. Da in dieser Seite auch PHP ausgeführt werden soll, muss die Dateiendung .php lauten. Eine entsprechende HTML-Seite muss also umbenannt werden. Alternativ gibt es die Möglichkeit PHP-Code auch in HTML-Seiten auszuführen. Dazu müssen Einstellungen in der php.ini oder alternativ der .htaccess Datei gemacht werden. Wer das möchte sollte sich eine Anleitung hierzu in Internet ansehen.
Die Datei ausgabe.php wird im Ordern in dem auch der Ordern tpnews erstellt wurde gespeichert. Codebox 3.1 :: Ausgangs-HTML-Seite mit PHP-Code (ausgabe.php head
titleAlte HTML Seite/title
/head
body
<? include ("tpnews/inc/hp_ausgabe.inc.php"); ?>
/body
/htmlDie Zeile die in die Ausgangsdatei eingefügt werden muss ist <? include ("tpnews/inc/hp_ausgabe.inc.php"); ?> . Wie schon in den vorherigen Teilen angesprochen wird so der Inhalt der Datei hp_ausgabe.inc.php an dieser Stelle eingebunden und ausgeführt und das ohne, dass die Datei unübersichtlich wird. Werfen wir eine Blick auf diese Datei. Die Datei wird in dem Unterordner inc gespeichert. Codebox 3.2 :: hp_ausgabe.inc.php <?
include ("tpnews/inc/opendb.inc.php"); // DB öffen
// Auslesen der News
$q_select="SELECT * FROM tp_news ORDER BY startdatum DESC, startzeit DESC ";
$r_select=mysql_query($q_select);
while ($strAusgabe=mysql_fetch_array($r_select, MYSQL_ASSOC))
{
// Einlesen der Vorlage news.inc.php
$strVorlage="";
$arrVorlageZeilen=file("tpnews/tpl/news.inc.php");
// Zusammensetzen der Vorlage
foreach ($arrVorlageZeilen as $Vorlage) { $strVorlage.=$Vorlage; }
// Datum zusammenstellen
$intDatePart=explode("-", $strAusgabe[startdatum]);
$strDatum=$intDatePart[2].".".$intDatePart[1].".".$intDatePart[0]." ".$strAusgabe[startzeit];
// Ersetzen der Platzhalter ##NAME##
$strVorlage=ereg_replace("##DATUM##",$strDatum,$strVorlage);
$strVorlage=ereg_replace("##AUTOR##",$strAusgabe[autor],$strVorlage);
$strVorlage=ereg_replace("##TITEL##",$strAusgabe[titel],$strVorlage);
$strVorlage=ereg_replace("##NACHRICHT##",$strAusgabe[nachricht],$strVorlage);
// Augabe der News
echo $strVorlage;
}
?>Zunächst wird wieder die Datei opendb.inc.php mit include eingelesen. Der Pfad zu der Datei geht dieses mal aber von der Datei ausgabe.php aus und startet daher mit "tpnews/inc/". Die Nachrichten, die mit den letzten Kursteil gespeichert wurden, werden hier mit eine SQL-Befehl ausgelesen. Dieser lautet SELECT * FROM tp_news ORDER BY startdatum DESC, startzeit DESC. Mit dem SQL-Befehl SELECT werden Daten aus der Datenbank gelesen (vgl. Teil 1). Hier werden * = alle Daten aus der Tabelle (FROM) tp_news eingelesen. Der Teil SELECT * FROM tp_news würde also schon reichen um alle Nachrichten aus der Datenbank auszulesen. Bei den Nachrichten ist es aber wichtig in welcher Reihenfolge die Datensätze auf der Internetseite angezeigt werden. Daher benutzt man an dieser Stelle ORDER BY was eine Sortierung der Daten bewirkt. Gibt man mehrere Spaltennamen mit Komma getrennt an, werden die Daten zunächst nach den ersten Sortiert, dann nach den Folgenden. In diesem Fall sortiert man zunächst nach dem Datum (startdatum) und danach nach der Zeit (startzeit) die man bei der Eingabe angegeben hat. Der Zusatz DESC bewirkt, dass die Daten nicht wie normal Aussteigend sortiert werden, sondern absteigend. Das größte = jüngste Datum steht am Beginn und somit die neuste News oben.
Wiederholend zu Teil 1 wird dieser SQL-Query die Datensätze dann über mysql_query und die while-Schleife mit mysql_fetch_array in ein Array eingelesen. Über den Zusatz MYSQL_ASSOC stehen uns die Daten dann in dem Array $strAusgabe über die Spaltennamen zur Verfügung.
Als nächstes betrachten wir was innerhalb der while-Schleife mit den Daten aus der DB geschieht. Als erstes erstellt man eine neue Variable. In $strVorlage wird im nächsten Schritt die Vorlage Datei news.inc.php eingelesen. Eh ich auf den Sinn dieser Aktion eingehe hier der Inhalt von news.inc.php (welche im Ordner tpl zu erstellen ist): Codebox 3.3 :: tpl/news.inc.php <p><b>##TITEL##</b> <font size="-1">am ##DATUM## von ##AUTOR##</font></p>
<p>##NACHRICHT##<hr>
</p> Die Datei beinhaltet HTML-Code der nötig ist um die News auszugeben. Hier ist es eine einfache Konstruktion, die in der Datei ausgabe.php (Codebox 3.1) an der Stelle an der <? include ("tpnews/inc/hp_ausgabe.inc.php"); ?> steht pro News 1 mal ausgegeben wird. Die Datei kann beliebig verändert werden, es sind also auch Tabellenzeilen oder andere anpassungen an gewünschte Layout möglich. Wichtig ist, dass die Variablen die in "##" eingeschlossen sind erhalten bleiben. Diese werden später durch den entsprechenden Wert aus der DB ersetzt.
Jetzt aber zurück zu dem Code aus der Codebox 3.2. Die Zeile $arrVorlageZeilen=file("tpnews/tpl/news.inc.php"); liest den Inhalt der Datei news.inc.php zeilenweise in das neue Array ein. Über die nächste Zeileforeach ($arrVorlageZeilen as $Vorlage) { $strVorlage.=$Vorlage; } werden die einzelnen Zeilen in der Variable $strVorlage zusammengefasst. Dabei wird mit foreach alle Zeilen des Array durchgegangen und über .=an die Zielvariable angehangen. Jetzt ist auch zu verstehen, warum die Variable zuvor angelegt bzw auf ="" gesetzt werden muss. Kommentiert man Probeweise die Zeile $strVorlage=""; mit // aus, sieht man das die erste News einmal abgedruckt wird, die zweite zweimal etc.
Als nächstes muss man aus den beiden Datensätzen Startzeit und Startdatum, die man in Teil 2 in mySQL konforme Anzeigen umgewandelt hat wieder in das Wunschformat umschrieben. Hier wird die Ausgabe auf TT.MM.JJJJ HH:MM:SS gesetzt. Es ist aber auch jedes andere Format möglich, welches dann mit den erworbenen Wissen erstellt werden kann. Wichtig ist, das das Ergebnis in der Variable $strDatumlandet.
Im Anschluss werden die Platzhalter in der Datei news.inc.php durch die entsprechenden Werte ersetzt. Dieses erfolgt über die Zeilen $strVorlage=ereg_replace("##AUTOR##",$strAusgabe[autor],$strVorlage);. Die Variablen werden zum besseren Verständnis man durch eine Erläuterung ersetzt: Variable_in_der_das_Ergebniss_steht = ereg_replace("PLatzhalter_in_news.inc.php",Daten_aus_der_DB,Datei_in_der_nach_dem_PLatzhalter_gesucht_wird);
Sind dann als Platzhalter ersetzt, wird die Variable über echo ausgegeben und erscheint so auf der Internetseiten. Dieser Vorgang wird für alle Datensätze wiederholt. An einigen Stellen ist es sinnvoll nur ein paar News auszugeben. So beispielsweise auf der Homepage. Dort stehen dann die zwei neusten Nachrichten und allen anderen auf einer Unterseite. Mit zwei einfachen Modifikationen ist auch das möglich. Anstelle der Datei ausgabe.php (die steht jetzt für die Unterseite mit allen News) erstellen wir im gleichen Ordner noch eine weitere Datei. Diese wird teilausgabe.php genannt. Codebox 3.4 :: teilausgabe.php head
titleAlte HTML Seite/title
/head
body
<? include ("tpnews/inc/hp_teilausgabe.inc.php"); ?>
/body
/htmlDer Unterschied zur Datei ausgabe.php besteht nur darin, das hier die Datei hp_teilausgabe.inc.php included wird. Diese Datei muss auch angelegt werden. Codebox 3.5 :: hp_teilausgabe.inc.php <?
include ("tpnews/inc/opendb.inc.php"); // DB öffen
include ("tpnews/inc/config.inc.php"); // Config-File einlesen
// Auslesen der News
$q_select="SELECT * FROM tp_news ORDER BY startdatum DESC, startzeit DESC LIMIT 0,$intNewsAnz";
$r_select=mysql_query($q_select);
while ($strAusgabe=mysql_fetch_array($r_select, MYSQL_ASSOC))
{
// Einlesen der Vorlage news.inc.php
$strVorlage="";
$arrVorlageZeilen=file("tpnews/tpl/teilnews.inc.php");
// Zusammensetzen der Vorlage
foreach ($arrVorlageZeilen as $Vorlage) { $strVorlage.=$Vorlage; }
// Datum zusammenstellen
$intDatePart=explode("-", $strAusgabe[startdatum]);
$strDatum=$intDatePart[2].".".$intDatePart[1].".".$intDatePart[0]." ".$strAusgabe[startzeit];
// Ersetzen der Platzhalter ##NAME##
$strVorlage=ereg_replace("##DATUM##",$strDatum,$strVorlage);
$strVorlage=ereg_replace("##AUTOR##",$strAusgabe[autor],$strVorlage);
$strVorlage=ereg_replace("##TITEL##",$strAusgabe[titel],$strVorlage);
$strVorlage=ereg_replace("##NACHRICHT##",$strAusgabe[nachricht],$strVorlage);
// Augabe der News
echo $strVorlage;
}
?>Auch diese Datei unterschiedet sich nicht wesentlich von der Ursprungsdatei. Daher wird hier nur auf die Änderungen eingegangen.
Zusätzlich zu der opendb.inc wird über die Zeile include ("tpnews/inc/config.inc.php"); ein Configfile eingelesen in dem ab jetzt alle vom Admin veränderbaren Variablen eingetragen werden. In diesem Teil ist die Datei noch nicht groß. In den nächsten wird sie aber anwachsen. So ein Configfile hat den Vorteil, dass man alle Einstellungen an einem zentralen Ort vornehmen kann. Die spätere Suche, wo ändere ich was bleibt aus. Die Datei config.inc.php muss jetzt auch angelegt werden. Codebox 3.6 :: config.inc.php <?
// Anzahl der News in der Teilausgabe
$intNewsAnz = 2;
?> Es empfiehlt sich die Datei ausführlich zu kommentieren. Nur so kann später auch ein anderer (eventuell ein nicht-Programmierer) Einstellungen ändern.
Einzige weitere Änderung in der Datei teilausgabe.inc.php im Vergleich zu hp_ausgabe.inc.php ist das an den mySQL-Befehl SELECT noch LIMIT 0,$intNewsAnz angehangen wird. Über LIMIT kann man die Anzahl der Datensätze die ausgegeben werden begrenzen. Man gibt den Startdatensatz an gefolgt von der Anzahl. Starten wollen wir immer bei Datensatz 0. Da die Zählung immer bei 0 beginnt ist das der erste vorhandene Datensatz. Die Anzahl der Datensätze ist in der Variable $intNewsAnz in der Datei config.inc.php angegeben.
Der restliche Code dieser Datei ist (im Prinzip) unverändert.
Einzige weitere Änderung ist, dass nicht die Templatedatei news.inc.php eingelesen wird, sondern die teilnews.inc.php. So kann das Layout der Nachrichten auf der Homepage anders gestaltet werden, als die auf der Newsseite. Codebox 3.7 :: tpl/teilnews.inc.php <p><b>##TITEL##</b><br>
##NACHRICHT##</p>
</p> In diesem Fall über ein verkürzte Ausgabe, die nicht alle Variablen verarbeitet. Jetzt kann man die in Teil 2 in die Datenbank geschriebenen Datensätze auslesen. Im den nächsten Teilen wird dann gezeigt wie man News löschen kann, diese Editieren kann und wie man bei vielen Nachrichten eine seitenwiese Ausgabe der Nachrichten erreichen kann. An dieser Stelle werden die, in dem jeweiligen Teil neu besprochenen PHP und mySQL-Befehle aufgelistet. Die Befehle sind ggf. mit der entsprechenden Seite auf der offiziellen Dokumentation verlinkt. Sebastian Lauff ist Diplom-Ingenieur der Fachrichtung Architektur. Seit 1996 arbeitet er angestellt und frei im Bereich Web-Entwicklung. Weitere Informationen zu Ihm findet man unter dem URL lauff.info.
Anfragen und Anregungen zu diesem Kurs bitte unter tp@lauff.info.
|