Alles was mit Programmierung zu tun hat.

[PHP] Einbinden von zusätzlichen Dateien in das Script (include)

Hallo,

heute möchte ich euch zeigen wie man externe / zusätzliche Dateien in ein Script einbindet.

Der große Vorteil von PHP (gegenüber z.B. HTML) ist, das man nicht alles in eine Datei quetschen muss. Besonders wenn das Script mal etwas größer und komplizierter wird, ist es von großem Vorteil bestimmte Elemente auszulagern. So behält man die Übersicht und nur so ist es möglich Objektorientiert zu arbeiten. Haben wir zum Bespiel eine Funktion die wir öfter brauchen so können wir diese in eine extra Datei schreiben und aus jedem beliebigen Script aus aufrufen.

Doch wie funktioniert das? Ganz einfach mit dem “include()”-Befehl. Es gibt dabei Grundlegend 2 verschiedene Befehle. “include()” und “include_once()”. Mit dem ersten Befehl kann man eine bestimmte Datei so oft man möchte in einem Script einbinden. Der zweite lässt die Einbindung einer bestimmten Datei in einem Script nur ein einziges mal zu, sollte ein zweites mal versucht werden die Datei zu includen gibt es einen Fehler. Was ist nun wann gut?

Schreiben wir z.B. folgende PHP-Datei:
<?php
session_start();
?>

So darf diese nur ein einziges mal in einem Script eingebunden werden, da es sonst einen Fehler gibt. Um auszuschließen das die Datei ausversehen noch ein weiteres mal aufgerufen wird benutzen wir “include_once()”.

Haben wir aber ein Logo (Bild) in eine externe Datei ausgelagert dann kann es durchaus möglich sein das wir dieses Logo an mehreren Stellen in einem Script einbinden wollen und müssen. Dann kommt “include()” zum einsatz.
Grundsatzlich ist meine Empfehlung immer include_once() zu benutzen, sofern die Datei nicht unbedingt mehrfach eingebunden werden muss. Damit ist man immer auf der sicheren Seite.

Oft sehe ich Scripte die Menüstrukturen mit “include” realisieren und dabei einen entscheidenen Fehler machen. Daher möchte ich hier kurz darauf eingehen.
Menüstrukturen mit include zu realisieren ist im grunde eine super sache, ich selbst arbeite oft damit. Aber wie schon erwähnt, immer auf die Sicherheit achten!
Also wie funktioniert es? Hier erst einmal das Beispiel wie man es NICHT machen sollte:

<?php
include($_GET[“seite”]);
?>

Was passiert hier… die Seite wird z.B. mit http://www.testdomain.de/index.php?seite=start.php aufgerufen. Das Script liest den übergebenen Wert “seite” aus und bindet diese Datei einfach in das Script ein. Das wars. Funktioniert prima werden jetzt einige sagen. Stimmt, tut es… aber was ist wenn ich jetzt folgendes Aufrufe: http://www.testdomain.de/index.php?seite=./.htaccess
Dann bekommt er, unter umständen, Informationen zu gesicht die Ihn nichts angehen. Und das wäre noch der harmloseste Fall. Hacker können damit richtig böse sachen machen!

Also gestallten wir unser Script sicherer:

<?php
if ($_GET[“seite”] == “start”) {
include_once(“start.php”);
} else {
include_once(“errorseite.php”);
}
?>

Was ist jetzt? Wir überprüfen erst einmal was in der übergebenen Variable “start” steht. Steht dort “start” drin, dann includen wir die Seite “start.php”… diese könnte aber auch “muster.html” heißen… der Besucher unserer Seite hat darin keinen Einblick mehr und wir könnten sogar ein bisschen tricksen um unsere Dateien zu verschleiern… und ein bisschen rate ich sogar dazu. ;)
Ist der Übergebene wert aber nicht “start” (also nicht von uns deklariert) dann geben wir einfach eine vordefinierte “errorseite.php” aus. Es interessiert uns nicht mehr ob da nun Müll in der Variable steht. Und sollte jetzt noch mal einer http://www.testdomain.de/index.php?seite=http://www.google.de aufrufen, dann landet er auf unserer Errorseite und fertig.

Also bitte, zu Ihrer eigenen Sicherheit, niemals die erste Version verwenden. Sicher, sie ist einfacher zu Handhaben… aber nicht nur für Sie ;)

Das Thema “include()” ist noch ein wenig umfangreicher. Aber das würde jetzt den Rahmen hier sprengen. Ich denke die Grundzüge sollten hier erklärt sein und vielleicht greife ich das Thema noch mal auf. Später.

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

[PHP] Einfacher Datei-Counter

Hallo zusammen,

heute bauen wir uns einen einfachen Counter der seine Daten in einer Datei speichert. Das Prinzip ist einfach. Das Script wird beim Aufruf der Seite gestartet, öffnet eine Datei und holt den aktuellen Zählerstand, erhöht ihn um 1, gibt diesen aus und speichert den neuen (alten Stand + 1) wieder zurück in die Datei.

Und so wird es gemacht.

Als erstes der PHP-Tag, ohne den Bekanntlich nichts geht.
<?php
Dann wird der Dateiname an eine Variable übergeben (man könnte es auch direkt an den Befehl übergeben, aber so finde ich es dynamischer).
$dateiname = “counter.txt”;
Dann wird mit dem “fopen”-Befehl die Datei geöffnet. Der Parameter “r+” bedeutet hierbei das die Datei zum Lesen (read) geöffnet werden soll… das “+” heißt, wenn die Datei nicht vorhanden ist soll versucht werden sie anzulegen (Schreibrechte vorausgesetzt). Das Handle wird der Variable “$datei” übergeben.
$datei = fopen($dateiname,”r+”);
Der Dateiinhalt wird ausgelesen und an die Variable “$zaehler” übergeben, beschränkt auf 10 Zeichen. Das sollte für einen Zähler wohl reichen, wenn nicht einfach erhöhen.
$zaehler = fgets($datei, 10);
Nun wird geprüft ob überhaupt schon etwas in der Datei steht oder ob sie evtl. neu angelegt wurde. Wenn der String leer ist, dann muss er mit “0” gefüllt werden da andernfalls der nachfolgende Befehl fehlschlägt und einen Fehler verursacht.
if($zaehler == “”) {
$zaehler = 0;
}

Nun müssen wir den Counter um 1 erhöhen… sonst wäre es ja kein Counter. :) PHP macht und das zählen einfach… einfach “++” an eine Variable (mit Zahl im Inhalt) anhängen und schon wird die Zahl in der Variable um 1 erhöht. Funktioniert auch andersrum mit “–” = Zahl minus 1.
$zaehler++;
Der beste Counter nützt nix wenn er nicht auch ausgegeben wird ;) Daher hier eine die Ausgabe, kurz und schmerzlos:

echo “Du bist der “.$zaehler.” Besucher.”;
Nun müssen wir den neuen Wert natürlich auch wieder in die Datei schreiben. Vorher müssen wir den alten Wert aber löschen und den Dateizeiger auf den Anfang der Datei setzen. Das geschieht mit “rewind”:
rewind($datei);
Dann den neuen Wert mit “fwrite” in die Datei schreiben:
fwrite($datei, $zaehler);
Und natürlich Datei schließen nicht vergessen.

fclose($datei);
Zum Abschluss unseres kleinen Scriptes den PHP-Tag wieder schließen…
?>
… und fertig sind wir schon. Einfach und wirkungsvoll. Für größere Projekte zwar nicht sinnvoll… aber für den Privatgebrauch sicher zumindest ein Anfang

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

[PHP] Eine einfache Datenbankverbindung und -abfrage

Hallo zusammen,

heute zeige ich euch wie man eine einfache Verbindung zu einer MySQL-Datenbank herstellt und eine Abfrage macht.

Erstellt eine leere Datei und speichert sie (z.B.) als “db.php”. Nun fügt folgende Zeilen in die Datei ein:

Erst einmal den PHP-Tag… sonst werden die PHP-Befehle nicht für voll genommen:
<?PHP
Dann werden die folgenden Variablen definiert, damit PHP weiß wo die Datenbank ist und mit welchen Daten er eine Verbindung dazu aufbauen soll.
Wo ist die Datenbank? Hostname oder IP
$db_server = ‘localhost’;
Der Datenbankname (ein Server kann ja mehrere Datenbanken verwalten.)
$db_name = ‘datenbankname’;
Der Benutzername der zugriff auf diese Datenbank hat:
$db_user = ‘benutzer’;
Und das zugehörige Passwort des Benutzers:
$db_passwort = ‘passwort’;

Nun stellen wir, über den “mysql_connect”-Befehl eine Verbindung zur Datenbank her.
$db = @ mysql_connect ( $db_server, $db_user, $db_passwort );
Wurden alle Daten richtig eingegeben dann sollte jetzt die Verbindung stehen. Sie ist dauerhaft bis sie durch “mysql_close()” wieder geschlossen wird. So muss nicht bei jeder Abfrage eine neue Verbindung aufgebaut werden.

Da wir nun die Verbindung haben können wir jetzt unsere Abfrage starten. Dazu müssen wir der Datenbank sagen was wir machen wollen. Natürlich geschieht dies in der Sprache die unsere MySQL-Datenbank auch versteht. Wir möchten jetzt einfach mal alle Datensätze aus der Tabelle “user” ausgegeben haben. Die Abfrage dazu sieht wie folgt aus:
$sql = ‘SELECT * FROM `user`’;
Und diese Abfrage übergeben wir jetzt an MySQL, mit dem Befehl “mysql_db_query”:
$result = mysql_db_query ( $db_name, $sql );

Nun sind die Ergebnisse in der Variable “$result” gespeichert, in einem Array. Damit wir diese nun auch “sehen” können geben wir sie einfach unformatiert aus:
while ( $row = mysql_fetch_row ( $result ) )
{
echo $row[0] . ‘<br>’;
echo $row[1] . ‘<br>’;
….
}

“mysql_fetch_row” übergibt ein Array (bestehend aus einem Datensatz) aus einer Abfrage in die Variable “$row”. So können wir es sichtbar machen.
Zu guter letzt schließen wir jetzt die Datenbankverbindung wieder:
mysql_close();

Und natürlich auch den PHP-Tag.
?>

Und das wars auch schon. Mehr ist nicht nötig. Naütlich war das jetzt ein simples Beispiel… aber eine erste Datenbankabfrage ;)

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

[PHP] Bilddaten auslesen wie Breite, Höhe und Typ

Hallo,

PHP stellt, wie so oft, eine kleine Funktion bereit um einfach an diese Daten zu gelangen. Aber wozu braucht man das Ueberhaupt? Ganz einfach. Z.B. kann man damit die Bilddimensionen des IMG-Tags fuellen. Oder man kann damit die Dimensionen eines Image-Popups an Javascript uebergeben. Oder den MIME vorgeben. Es gibt sehr viele Anwendunsmoeglichkeiten fuer diese Funktion.

Hier ist sie:

<span class="methodname"><strong><strong>getimagesize</strong></strong></span> ( <span class="methodparam"><span class="type">string</span> <tt class="parameter">$filename</tt></span> [, <span class="methodparam"><span class="type">array</span> <tt class="parameter reference">&$imageinfo</tt></span> ] )

Und hier ein kurzes Beispiel.

<?php $img = "picture.jpg"; $iA = getimagesize($img); echo "Bildbreite: ".$iA[0]."<br>"; echo "Bildhöhe: ".$iA[1]."<br>"; echo "Imagetype: ".$iA[2]."<br>"; //JPG, GIF, etc. echo "IMG-Tag String: ".$iA[3]; //zur verwendung von IMG-Tags ?>

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

[PHP] Fehlerausgabe lokal/web switchen

Hallo,

eigentlich immer ist es erforderlich sich in der Programmierungsphase die Fehlermeldungen ausgeben zu lassen um zu sehen wo und welche Fehler auftreten. Wenn das Projekt dann aber online ist dürfen diese aber nicht mehr (öffentlich) Ausgegeben werden.

Ich persönlich programmiere meine Projekte erst auf meinem lokalen Rechner und lade die Projekte dann auf den Webspace. Daher habe ich folgende Zeilen, direkt nach dem PHP-Tag (“<?php”), in meine Scripte eingebaut:

if ($_SERVER["SERVER_NAME"] == "localhost") { error_reporting(E_ALL); ini_set('display_errors', 1); } else ini_set('display_errors', 0);

Diese bewirken nun folgendes: Das Script überprüft ob das Script lokal ausgeführt wird. Wenn ja dann werden alle Fehlermeldungen von PHP ausgegeben. Wenn es nicht lokal ausgeführt wird (also auf einem öffentlichen Webspace/-server) dann wird keine Fehlermeldung mehr ausgegeben.
Im zweiten Fall sollte aber auf jeden fall eine Error-Reporting-Routine eingebaut werden um evtl. auftretende Fehler zu protokollieren.

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

Webkatalog – www.linkarea51.com

Linkarea51.com ist ein ganz normaler Webkatalog. Ursprünglich sollte auf dieser Domain ein Zwillingskatalog von katalog4web.de laufen. Die Idee war das der User sich nur in einen Webkatalog eintragen muss und auf beiden gelistet wird. Da dies Google aber nicht gefällt, wurde diese Idee gestrichen.

Also habe ich auf der Domain einfach einen weiteren Webkatalog installiert. Diesmal jedoch nicht meine eigene Software, sondern eine fertige (Fremd-)Software. Ich habe mir mehrere Anbieter angesehen und mich für phpLinkDirectory entschieden.
Warum? Es ist kostenlos und hat mir von der Usability und dem Funktionsumfang am besten gefallen. Natürlich ist das immer eine Geschmackssache… aber ich fand den einfach gut.
Und warum nun eine Fremdsoftware wenn doch einen eigene vorhanden ist? Ich wollte ausprobieren ob die User mit einer bekannten Umgebung besser zurecht kommen als mit meiner selbstprogrammierten Software. Jedoch wird dieser Webkatalog bisher schlechter frequentiert als mein anderer. Aber dennoch kann ich 50 Anmeldungen vorweisen (Stand: 18.11.2008). Wobei für den Webkatalog auch noch keine Werbung gemacht wurde. Aktuell hat der Webkatalog ca. 75 Visits am Tag (Stand: 18.11.2008).

Wie schon erwähnt ist die Software phpLinkDirectory in der Basic Version. Das Layout kommt von free-css-templates.com und wurde an die Software angepasst. Zusätzlich wurde die Software in 3 Sprachen installiert um so auch Englisch und Römanisch sprechenden Menschen den Gebrauch zu ermöglichen. Samit erwarte ich eine höhere Frequentierung. Besonders English ist eine wichtige Sprache, da selbst Menschen aus Italien oder Japan oft English sprechen.

In den ersten Wochen, nachdem die Suchmaschinen den Katalog erfasst und indexiert hatten, wurde der Webkatalog oft von Spam-Einträgen heimgesucht. Diese können zwar im Administrationsbereich recht schnell gelöscht werden, sind aber dennoch ärgerlich. Besonders da auch die Emailadressen nicht stimmen und die Mailerdämons dies gern Mitteilen. Daher habe ich auf der Domain ein Tool installiert um dies zu unterbinden. Das Tool funktioniert auch so gut das es im Monat ca. noch einen Spameintrag gibt.

Der Webkatalog steht zum Verkauf. Domain inkl. dem gesamten konfigurierten Projekt, natürlich wird nicht für das Script von phpLinkDirectory und das Layout bezahlt. Wer interesse hat kann mir gern eine Email schreiben: [email protected]

Der Link: www.linkarea51.com

osDate – Fehler nach der Installation

Nun ist es mal wieder so weit. Ich will eine kleine (oder hoffenlich bald größere) Community erstellen.

Dazu habe ich mal wieder osDate auserwählt.

Nun habe ich es lokal installiert und die Routine ist durchlaufen. Alles ging glatt… ABER jetzt sagt mir mein liebes osDate

osDate ist nicht installiert, oder eine Installation war nicht erfolgreich.
Rufe die install.php auf um osDate zu installieren.

Das habe ich doch gerade :(

Die Lösung des Problems:

Öffne die Datei “myconfig/config.php” und suche die Zeile in der folgendes steht:

define( ‘OSDATE_INSTALLED’, ‘0’ );

und mache daraus

define( ‘OSDATE_INSTALLED’, ‘1’ );

Nun sollte es funktionieren. Ist ein Fehler in der Installationsroutine.