Kategorien

Suchen


Aktuelle Artikel

Archiv

php

PHP: Zufallszeichenkette erzeugen (random string)

Montag, 08.03.2010

Um 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.2010

Wie 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 =&gt; $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.2010

Wenn 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.2010

Wenn 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.2010

Wenn 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

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

Lösungsvorschlag 2

PHP: Zeitdifferenz berechnen

Sonntag, 06.09.2009

Zeitweise 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.2009

Um 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.2009

Unter 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.2009

Um 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.2009

Nutzen 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";