php
« Vorherige BeiträgePHP: GUID erstellen (flexible Länge und Struktur)
Mittwoch, 28.07.2010Um in PHP eine GUID (Globally Unique Identifier) zu erzeugen (wie Sie sie ggf. aus C# und anderen Programmiersprachen kennen), hilft Ihnen die folgende Funktion weiter:
function getGUID($len = 36) { $tmp = ""; $pos = array(8,13,18,23); while (strlen($tmp) < $len) $tmp .= md5(uniqid()); foreach ($pos as $p) if ($p <= $len) $tmp[$p] = "-"; return substr($tmp,0,$len); }
Ausgabe (Beispiel):
echo getGUID(); 3470b4e8-d6fe-1f76-6c09-0d31828e8a1d echo getGUID(20); 8b31eeb6-b451-a61d-f
Die Lage der Trennzeichen (“-”) können Sie durch das Array “$pos” bestimmen, die Länge der GUID durch den Parameter “$len”. Wenn Sie keinen Parameter übergeben, ist die GUID automatisch 36 Zeichen lang.
PHP: Apache2 Version in Variable auslesen
Mittwoch, 21.07.2010Damit Sie auf einem Unix (Linux) System einfach die aktuelle Version des Apache WebServers herausfinden können, zeigen wir Ihnen ein PHP-Beispiel.
In dem PHP Script wird die Apache-Funktion “apache2ctl” genutzt, die die aktuelle Apache-Version auszulesen. Dieser Befehl wird mithilfe des PHP Befehles “passthru()” direkt an das Linuxsystem weitergegeben.
Hinweis:
Häufig ist auf “öffentlichen” Webservern aus Sicherheitsgründen die Nutzung einiger Befehle gesperrt. Dazu zählt häufig auch der Befehl “passthru()”. Wenn das Script bei Ihnen lokal auf dem Computer also einwadnfrei läuft und auf Ihrem Internetserver keine Daten zurück gibt, liegt diese Befehlssperre vor. Eine Möglichkeit, diese Sperre aufzuheben hat nur Ihr Web-Administrator (oder Provider).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php // PHP Version auslesen ob_start(); passthru("apache2ctl -v"); $ver = ob_get_contents(); if empty($ver) echo "passthru() disabled ?"; ob_end_clean(); $a = explode("\n", $ver); preg_match('/(server version: ){1}(.*)/i', $a[0], $v); $data[0] = $v[2]; preg_match('/(server built: ){1}(.*)/i', $a[1], $v); $data[1] = date("d.m.Y H:i:s", strtotime($v[2])); print_r($data); ?> |
PHP: Zugriff von Browsern außerhalb eines IP-Subnetzes unterbinden
Montag, 19.07.2010Mithilfe des folgenden PHP Scripts können Sie Besucher außerhalb des festgelegten IP Bereiches blockieren:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php if (strncmp("192.168.0", $_SERVER["REMOTE_ADDR"], 9) != 0) { // Block access header("HTTP/1.0 403 Forbidden"); // header('Location: http://www.google.com'); exit; } else { // Allow access echo "Zugriff erlaubt ..."; } ?> |
In diesem Beispiel werden alle Besucher, deren IP Adresse nicht mit “192.168.0″ anfängt, blockiert.
Dieser IP Bereich wird nur LAN intern verwendet. Für die Filterung von Besuchern aus dem WAN (Internet) filtern Sie bitte auf die öffentliche IP Adresse Ihrer Webseitenbesucher. Passen Sie dabei auch die Länge der zu vergleichenden Zeichen an (im o.a. Beispiel werden die ersten 9 Zeichen verglichen). Diese können Sie sich mithilfe des folgenden PHP Scripts anzeigen:
1 2 3 | <?php echo $_SERVER["REMOTE_ADDR"]; ?> |
SQLite: Datenbank erstellen, Tabellen erstellen, Daten einfügen & Daten abfragen
Dienstag, 13.07.2010Um eine kurze Einführung in die SQLite Datenbank zu bekommen, hilft Ihnen folgendes PHP-Script:
Das Beispiel zeigt Ihnen, wie Sie zuerst eine Datenbankverbindung aufbauen (dadurch automatisch auch die Datenbankdatei erstellen) und anschließend zwei Tabellen erstellen. Danach wird jeweils ein Datensatz in eine Tabelle eingefügt und im letzten Schritt wieder zusammen ausgelesen (joind).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php // Datenbank anlegen (Dateiname: "test.dat") $db = sqlite_open("test.dat", 0660, $error); // Die Tabellen anlegen: "kunde" und "domain" sqlite_query($db, 'CREATE TABLE kunde (id integer PRIMARY KEY, code varchar(10))'); sqlite_query($db, 'CREATE TABLE domain (id integer, kunde integer, name varchar(10))'); // Datensätze einfügen sqlite_query($db, "INSERT INTO kunde (code) VALUES ('fnord')"); sqlite_query($db, "INSERT INTO domain (id,kunde,name) VALUES (1, 1, 'www.webseite.de')"); // Daten verbinden und abfragen $res = sqlite_query($db, 'select * from kunde k left join domain d on d.kunde = k.id'); $res = sqlite_fetch_all($res, SQLITE_ASSOC); // Ergebnis anzeigen print_r($res); ?> |
In unserem Beispiel hat die Datenbank den Dateinamen “test.dat”. In der Wahl des Dateinamens sind Sie nur an die Restriktionen Ihres Betriebssystems gebunden. Häufig wird jedoch auch der Suffix “.sqlite” genutzt. (Suffix = Dateiendung)
Um die auf Ihrem System aktuell genutzte Version von SQLite auszulesen, nutzen Sie folgenden Befehl:
echo sqlite_libversion();
Wenn Sie die derzeit eingestellte Codierung herausfinden möchten:
echo sqlite_libencoding();
PHP: Alter anhand des Geburtstags berechnen
Montag, 12.07.2010Mit der folgenden PHP-Funktion könnten Sie anhand des Geburtstags das aktuelle Alter in Jahren ermitteln.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * Ermittelt das aktuelle Alter anhand einess Datums * @param string $birthday Der Geburstag im Format YYYY-MM-DD * @param string $delimiter Trennzeichen * @return integer Das Alter in Jahren */ function getAgeFromBirthday($birthday, $delimiter = '-') { if (empty($birthday)) return false; $exp = explode($delimiter, $birthday); if (count($exp) != 3 || !checkdate((int)$exp[1], (int)$exp[2], (int)$exp[0])) return false; $age = (int)date("Y") - (int)$exp[0]; if ((int)$exp[1] > (int)date("m") || ((int)$exp[1] == (int)date("m") && (int)$exp[2] > (int)date("d"))) $age--; return $age; } |
Der Aufruf könnte z.B. so ausschauen:
1 | var_dump(getAgeFromBirthday('1995-06-08')); |
Linux: Fatal error: Call to undefined function imap_open()
Freitag, 07.05.2010Wenn Sie beispielsweise nach der Installation des Webmailprogrammes “Horde” die folgende Meldung angezeigt bekommen, kann Ihnen dieser Artikel helfen:
Fatal error: Call to undefined function imap_open()
Grund für die Meldung ist die fehlende IMAP Unterstützung in PHP. In diesem Artikel erkläre ich die Lösung für Linux Debian lenny (V5). Andere Systeme benötigen teilweise einen kompletten Neubau von PHP (= Neucompilierung / Recompiling).
Zuerst muss das fehlende Paket instelliert werden:
apt-get install php5-imap
Ihnen werden Details angezeig und am Ende werden Sie gefragt:
Do you want to continue? [Y/n/?]
Hier antworten Sie bitte mit “y”.
Die automatische Installation beginnt und kann einen kurzen Moment brauchen.
Wichtig ist, dass Sie danach Ihren Apache Webserver mit einem der beiden folgenden Befehle neu starten:
apache2ctl graceful /usr/sbin/apache2ctl graceful
Fertig.
Beim Einsatz von Horde haben wir teilweise die Cookies im Browser löschen müssen. Außerdem half häufig auch das Umsetzen der Cookie-Verarbeitung. Weitere Details finden Sie in unserem Artikel “Horde: Nach dem erfolgreichen Login wird wieder der Login angezeigt“.
Horde: Nach dem erfolgreichen Login wird wieder der Login angezeigt
Dienstag, 04.05.2010Sie melden sich an Ihrem neu installieren Horde Webmailer an. Benutzername und Passwort sind richtig – und trotzdem landen Sie immer wieder sofort auf der Loginmaske ?
Im Horde Log (“/tmp/horde.log”) werden Ihnen die erfolgreichen Anmeldungen angezeigt:
May 01 21:54:22 HORDE [notice] [imp] Login success for xyz [100.200.200.200] to {localhost:143 [imap/notls]} [pid 11828 on line 307 of "/home/servername/domains/webmail.servername.de/public_html/imp/lib/Session.php"]
May 01 21:56:31 HORDE [notice] [imp] Login success for xyz [100.200.200.200] to {localhost:143 [imap/notls]} [pid 11828 on line 307 of "/home/servername/domains/webmail.servername.de/public_html/imp/lib/Session.php"]
May 01 21:59:49 HORDE [notice] [imp] Login success for xyz [100.200.200.200] to {localhost:143 [imap/notls]} [pid 11828 on line 307 of "/home/servername/domains/webmail.servername.de/public_html/imp/lib/Session.php"]Grund und Lösung ist meist die Cookie-Verarbeitung von Horde. Diese können Sie jedoch schnell und einfach umstellen.
Öffnen Sie dafür die Konfigurationsdatei von Horde:
nano /public_html/config/conf.php
Dort setzen Sie die folgende Option auf false:
$conf['session']['use_only_cookies'] = false;
Speichern Sie die Datei ab, löschen Sie alle Cookies in Ihrem Browser und melden Sie sich erneut bei Ihrem Horde Webmailer an.
PHP: Zufallszeichenkette erzeugen (random string)
Montag, 08.03.2010Um eine Zeichenkette (string) mit zufälligen Zeichen zu erzeugen, können Sie folgende PHP Funktion nutzen:
1 2 3 4 5 6 7 8 9 10 | // Zufallsgenerator schütteln mt_srand((double) microtime() * 1000000); // Basiszeichenpool $set = "ABCDEFGHIKLMNPQRSTUVWXYZ123456789"; $pin = ""; // 10 stelligen PIN aus den o.a. Zeichen erzeugen for ($n=1;$n<=10;$n++) $pin .= $set[mt_rand(0,(strlen($set)-1))]; |
Natürlich geht das o.a. PHP Script auch für längere Zeichenketten. Ersetzen Sie einfach die “10″ (Zeile 9) durch die gewünschte Anzahl an Zeichen.
In der Variablen “set” (Zeile 5) können Sie die Zeichen festlegen, aus denen der Zufallsgenerator Ihre Zeichenkette erstellen soll.
mySQL: In PHP vor SQL Injection schützen
Samstag, 06.03.2010Wie wir in unserem Artikel “mySQL: Schutz vor Angriffen in Datenbankabfragen (SQL Injection)” bereits erklärt haben, ist es vergleichsweise einfach möglich, durch ungesicherte bzw. ungeprüfte Parameter schadhaften oder zerstörenden Code in Ihre SQL Statements einzufügen.
Wie Sie sich z.Bsp. in PHP einfach und schnell gegen solche Angriffe schützen können, zeigt folgender Codeausschnitt:
1 2 | foreach ($_REQUEST as $key => $val) $_REQUEST["$key"] = mysql_real_escape_string($val); |
Es werden alle übergebenen Parameter (GET und POST) durch die mySQL Funktion “mysql_real_escape_string” überarbeitet. Dadurch werden die für eine Injektion benötigten Zeichen unschädlich gemacht und der Datenbankserver wird im Normalfall mit der “kaputten” SQL Anweisung nichts anfangen können.
Für weitere Informationen zum Thema SQL Injektion besuchen Sie bitte unseren o.a. Artikel.
ExtJS: Fehler “unterminated string literal” bei .load()
Donnerstag, 18.02.2010Wenn Sie auf Ihrer Webseite mit Ext JS und der Funktion “xyz.open()” Daten nachladen, kann es vorkommen, dass Ihre Maske die Daten nicht zeigt und der Ladevorgang nicht beendet wird. Sie sehen dann (sofern Sie es aktiviert haben) die Lademeldung weiterhin auf dem Bildschirm.
Die Meldung in der Fehlerkonsole des Browsers lautet (z.Bsp.):
Fehler: unterminated string literal
Quelldatei: http://localhost/ext/ext-all.js
Zeile: 7, Spalte: 73
Quelltext:
({“count”:1,”success”:true,”items”:[{“id”:1234,”ref”:”",”txt”:”Shell
Grund für den Fehler ist dann meist ein Zeilenumbruch (CRLF) im Text (hier in der Variablen “txt”).
Diesen umbruch kann das JSON Format zwar an Ihre Anwendung übertragen, JavaScript kommt damit dann aber nicht zurecht.
Lösung:
Ersetzen Sie bei der JSON Erstellung (z.Bsp. in PHP) den Umbruch durch ein “\n”:
eregi_replace(chr(13).chr(10),'\n',$to->Text)