php
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)
PHP: Unable to load dynamic library ‘/usr/lib/php5/extensions/mysql.so’
Freitag, 05.02.2010Wenn im ErrorLog des Apache2 WebServers (“tail /var/log/apache2/error.log”) u.a. folgende Zeile zu finden ist, kann PHP die Extension (Erweiterung) nicht finden und laden:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/extensions/mysql.so' - /usr/lib/php5/extensions/mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
Häufig wird dann angefangen, wild an der Konfiguration zu ändern und basteln. Dabei wird meist das naheliegendste übersehen:
Gibt es das angegebene Verzeichnis überhaupt ?
Erst recht, wenn mehrere (oder gar viele) Extensions nicht geladen werden können.
Wenn dann der Befehl
dir -l /usr/lib/php5/extensions/
die folgende Fehlermeldung anzeigt, sollte alles klar sein:
dir: Zugriff auf /usr/lib/php5/extensions/ nicht möglich: Datei oder Verzeichnis nicht gefunden
Lösung
Den Pfad für die Extensions in der “php.ini” anpassen. Diese kann, falls der Pfad nicht bekannt ist, mithilfe des folgenden Befehls gefunden werden.
find / -name php.ini
Dieser Befehl zeigt Ihnen ggf. auch andere “php.ini” Dateien auf ihrem System an. Manchmal konfiguriert man ein einer “php.ini” und wundert sich, dass keine Änderung eintritt. Wenn man zufällig die falsche Datei in den Händen hat, dann kann man auch lange auf ein Ergebnis warten
Häufig fällt dieses Problem nach einer (Neu)Installation erst auf, wenn die mySQL / mySQLi Unterstützung fehlt. Grund ist dann (meist), dass die mysql.so Extension in PHP nicht geladen werden kann.
Wenn SVN plötzlich streikt
Donnerstag, 14.01.2010Wenn Sie Ihr SVN u.a. auch für die automatische Versionsverteilung nutzen (Stichwort “post-commit”) und dieser Dienst plötzlich nicht mehr läuft, nutzen Sie folgende Möglichkeiten für die Analyse bzw. Lösung:
Logging des post-commit hooks
- Öffnen Sie die entsprechende Scriptdatei
Beispiel:
vi /srv/svn/example/hooks/post-commit - Ergänzen Sie die Datei entsprechend diesem Beispiel:
#!/bin/sh
echo `date` " Start SVN post-commit" >> /var/log/svn.log
whoami >> /var/log/svn.log
svn update /srv/htdocs/example --username x --password y >> /var/log/svn.log 2>&1
echo `date` " End SVN post-commit" >> /var/log/svn.log
In diesem Beispiel wird u.a. der Zeitstempel und der Benutzername des ausführenden Benutzers gespeichert - Legen Sie die angegebene Logdatei an:
touch /var/log/svn.log - Setzen Sie die passende Berechtigung:
chmod 777 /var/log/svn.log
Natürlich sollte später die exakte Berechtigung für den richtigen Benutzer gesetzt werden. Für die Analyse ist die komplette Freigabe jedoch besser - Committen Sie eine Änderung in Ihrem System und prüfen Sie anschließend die Logdatei
Beispiel:
Thu Jan 14 21:44:43 CET 2010 Start SVN post commit
wwwrun
U /srv/htdocs/example/test/index.php
Updated to revision 1064.
Thu Jan 14 21:44:44 CET 2010 Ende SVN post commit
Häufiger Fehler bei post-commit Problemen
Sehr häufig finden Sie z.Bsp. die folgende Fehlermeldung in Ihrem Log:
Thu Jan 14 21:43:42 CET 2010 Start SVN post commit
wwwrun
svn: Can't convert string from native encoding to 'UTF-8':
svn: empf?\195?\164nger.bmp
Thu Jan 14 21:43:43 CET 2010 Ende SVN post commit
In diesem Beispiel wurde versucht, eine Datei “empfänger.bmp” im Trunk zu speichern. Aufgrund der Sprachdefinition in “locale”:
LC_CTYPE=de_DE.UTF-8
konnte SVN mit dem Umlaut “ä” nicht viel anfangen und versuchte das Zeichen zu konvertieren. Den dadurch entstandenen Dateinamen konnte das System nicht erkennen.
Lösungsvorschlag 1
- Benennen Sie (im o.a. Beispiel) die Datei um in “empfaenger.bmp”
- Lösen Sie den post-commit Hook manuell aus:
sudo -u wwwrun /srv/svn/example/hooks/post-commit - Das SVN sollte wieder normal funktionieren
Lösungsvorschlag 2
- Führen Sie folgenden Befehl aus:
export LC_CTYPE=en_US.UTF-8 - Überprüfen Sie Ihre “locale” Umgebung:
locale - Nun sollten Sie u.a. den folgenden Eintrag sehen:
LC_CTYPE="en_US.UTF-8"
PHP: Zeitdifferenz berechnen
Sonntag, 06.09.2009Zeitweise kann man mit der Differenzberechnung zwischen zwei Zeitstempeln bei PHP schon verzweifeln. In einigen Fällen greifen die vorhandenen Standardroutinen nicht sauber. In diesen Fällen kann vielleicht die folgende Methode weiterhelfen:
function getDeltaTime($time1, $time2) {
$delta = $time1 - $time2;
$diff = "" . $delta/60/60;
$nPos = strpos($diff, ".");
if (nPos !== false)
$diff = substr($diff, 0, $nPos + 3);
return $diff;
}
Beispiel:
$t1 = strtotime("13.02.2009 12:00:00");
$t2 = strtotime("15.02.2009 12:00:00");
echo getDeltaTime($t1,$t2);
Als Ergebnis wird die Differenz in Stunden geliefert: -48.0
cakePHP: Kompletten Filter in der Session speichern (Source)
Samstag, 08.08.2009Um in cakePHP den aktuellen Filter von Formularen zu speichern, kann man jedes Feld einzelnd verarbeiten oder (viel einfacher) den kompletten Filter im Einzeiler speichern:
$_SESSION["NAME_IN_DER_SESSION"] = $this->data["Filter"];
Wenn der Filter automatisch geladen oder gespeichert werden soll, nutzen Sie folgenden Code:
// Filter in Session speichern oder aus Session laden if (!empty($this->data["Filter"])) $_SESSION["NAME_IN_DER_SESSION"] = $this->data["Filter"]; elseif (!empty($_SESSION["NAME_IN_DER_SESSION"])) $this->data["Filter"] = $_SESSION["NAME_IN_DER_SESSION"];
In diesem Beispiel prüft cakePHP, ob ein Filter übergeben wird. Wenn ja, wird dieser in der Session abgelegt.
Wird kein Filter übergeben und ist ein Filter gespeichert, wird dieser Filter aus der Session eingelesen.
PHP & Oracle: PHP Datum & Oracle Datum vergleichen / umrechnen
Mittwoch, 15.07.2009Unter PHP haben Sie z.Bsp. mit folgendem Code ein Zeitstempel erzeugt:
<?php startdatum = time(); ?>
In einer Oracle Datenbank wurde dieser Zeitstempel in einem Feld vom Typ “number” abgespeichert.
Nun möchten Sie diese Werte vergleichen. Nutzen Sie dafür folgendes SQL Statement:
select
startdatum,
to_date('01.06.2009', 'dd.mm.yyyy'),
to_char(TO_DATE('19700101000000', 'YYYYMMDDHH24MISS') +
NUMTODSINTERVAL(startdatum, 'SECOND'), 'dd.mm.yyyy hh24:mi')
from Tabellenname
Dieses SQL Beispiel zeigt Ihnen die unterschiedlichen Daten und Methoden in einem SQL Query. Passen Sie die Daten einfach an Ihre Bedürfnisse an.
PHP: Zeilenumbruch (\n) aus String entfernen
Mittwoch, 08.07.2009Um einen Zeilenumbruch (“\n”) aus einem String (Zeichenkette) zu entfernen, nutzen Sie bitte folgende Befehlsfolge:
$var = "Zeile\nmit Zeilenumbrüchen\nEnde der Zeile";
$var = str_replace("\n", '', $var);
$var = str_replace("\r\n", '', $var);
$var = str_replace(chr(13), '', $var);
PHP: Jahreszahl auf Schaltjahr prüfen
Mittwoch, 08.07.2009Nutzen Sie den folgenden Beispiel-Source um in PHP bei einer Jahreszahl zu prüfen, ob es ein Schaltjahr ist:
function is_leapyear($year = 2000) {
return date('L', strtotime("$year-1-1"));
}
Beispielaufruf:
if (is_leapyear(2008)) echo "2008 ist ein Schaltjahr"; else echo "2008 ist kein Schaltjahr";