Datum in PHP vergleichen – so geht’s
Wie vergleicht man eigentlich 2 Daten (Daten = Plural von Datum) in PHP miteinander? Die Frage klingt erst mal einfacher als es ist.
Der erste Gedanke, der einem meistens kommt, ist folgender. Wir speichern 2 Daten als String und vergleichen diese.
Vorüberlegung
<?php $date1 = "2012-1-12"; $date2 = "2011-10-12"; if ($date1 > $date2) echo "$date1 ist neuer als $date2"; else echo "$date1 ist älter als $date2"; ?>
Ausgabe:
2012-1-12 ist neuer als 2011-10-12
Auf den ersten Blick scheint das auch eine funktionierende Lösung zu sein. Was jedoch, wenn die beiden Daten in einem unterschiedlichen Format vorliegen?
<?php $date1 = "12-1-12"; $date2 = "2011-10-12"; if ($date1 > $date2) echo "$date1 ist neuer als $date2"; else echo "$date1 ist älter als $date2"; ?>
Ausgabe:
12-1-12 ist älter als 2011-10-12
Nun wird das Datum in 2012 auf einmal als kleiner als das Datum in 2011 deklariert, was natürlich falsch ist. Doch aus PHP-Sicht ist dieses Verhalten korrekt, schließlich wurden ja zwei Strings verglichen und das 2012er Datum hatte definitiv den kleineren/kürzeren String.
Datum korrekt vergleichen
Eine funktionierende Lösung wäre es, die Daten zuerst in Timestamps (dt.: Zeitstempel) umzuwandeln und diese numerischen Timestamps dann miteinander zu vergleichen. Zur Umwandlung eines Datum-Strings in einen Timestamp bietet PHP die Funktion strtotime($zeitString), die ein Datum oder eine Zeitangabe annimmt und den entsprechenden Timestamp zurückliefert.
<?php $date1 = "12-1-12"; $date2 = "2011-10-12"; $dateTimestamp1 = strtotime($date1); $dataTimestamp2 = strtotime($data2); if ($dateTimestamp1 > $dataTimestamp2) echo "$date1 ist neuer als $date2"; else echo "$date1 ist älter als $date2"; ?>
Ausgabe:
12-1-12 ist neuer als 2011-10-12
Jedoch führen bekanntlich viele Wege nach Rom und so gibt es auch hier noch weitere Lösungen für das Ausgangsproblem. So wäre eine weitere Lösung die Verwendung der DateTime-Klasse, die PHP ab der Version 5.2.0 zur Verfügung stellt.
<?php
$date1 = new DateTime("12-1-12");
$date2 = new DateTime("2011-10-12");
if ($date1 > $data2)
echo $date1->format("Y-m-d")." ist neuer als ".$date2->format("Y-m-d");
else
echo $date1->format("Y-m-d")." ist älter als ".$date2->format("Y-m-d");
?>
Ausgabe:
2012-01-12 ist neuer als 2011-10-12
Verwendet man die auf der DateTime-Klasse basierende Lösung, hat man auch gleich noch beide Daten einheitlich formatiert. Gut, man könnte in der ersten Lösung auch die date()-Funktion benutzen, um die Daten zu formatieren, aber das würde den ersten Lösungsweg noch länger machen. Am Ende bleibt es Geschmackssache, welchen Weg man für den Vergleich zweier Daten geht.
Wie vergleicht ihr zwei Daten in PHP? Nutzt ihr einen der beiden aufgezeigten Wege oder geht ihr einen anderen? Mich würde interessieren, wie ihr euch dem Problem annehmt.
PHP-Fehlermeldungen unter Webmatrix 2 anzeigen
Seit einigen Wochen steht Microsofts Entwicklungsumgebung Webmatrix nun in der Version 2 zur Verfügung. Wie auch schon in der ersten Version, ist Webmatrix 2 eine kostenlose Entwicklungsumgebung für Webseiten und Webanwendungen verschiedenster Plattformen wie z.B. ASP.NET, PHP und HTML5.
Ich nutze Webmatrix unter anderem, um mal eben das ein oder andere PHP-Script zu testen. Leider gibt der mitgelieferte/integrierte Webserver in den Standardeinstellungen, also so, wie er ausgeliefert wird, keine Fehlermeldungen aus. Schleicht sich also der Fehlerteufel im PHP-Script ein und man hat nicht von vornherein alles mittels try-catch-Block abgefangen, so sieht man eine weiße Seite.
Um die, wie ich finde, zur Entwicklung sehr hilfreichen Fehlermeldungen wieder auszugeben, muss die php.ini des Webservers angepasst werden. Sofern ihr während des Setups von Webmatrix nichts verstellt habt, läuft ein IIS Express unter der Haube von Webmatrix. Die php.ini-Datei findet ihr unter Windows 7/Windows 8 standardmäßig unter folgendem Pfad:
C:\Program Files (x86)\IIS Express\PHP\v5.3
(Eventuell kann die PHP-Version, hier 5.3, abweichen.)
Öffnet nun die php.ini und sucht die folgende Zeile:
display_errors = Off
Wenn ihr die Fehlermeldungen angezeigt bekommen wollt, dann müsst ihr nur das “Off” durch ein “On” ersetzen.
display_errors = On
Danach einmal abspeichern und von nun an sollten wieder alle PHP-Fehlermeldungen ausgegeben werden.
Sollte es Probleme beim Speichern geben, dann liegt das in den meisten Fällen an den Berechtigungen. Abhilfe schaffen könnt ihr euch zum Beispiel, in dem ihr Notepad mit einem Rechtsklick als Administrator startet und dann über die “Datei->Öffnen”-Funktion von Notepad die php.ini öffnet. So sollte es auf jeden Fall mit dem Speichern klappen.
Ich wünsche viel Spaß beim entwickeln mit PHP!
PHP Workaround – file_get_contents() ohne allow_url_fopen nutzen
Ich gebe zu, der Titel ist etwas irreführend. Die PHP-Funktion file_get_contents(), die dazu genutzt werden kann Dateien aus dem Internet in einen String zu lesen, um sie weiterzuverarbeiten, funktioniert bei deaktiviertem allow_url_fopen einfach nicht. Daran wird auch dieser Artikel nichts ändern.
Entwickelt man jedoch eine Anwendung/ein Script, das auf möglichst vielen Serverumgebungen funktionieren soll, so wie zum Beispiel ein WordPress-Plugin, so gibt es einen guten Workaround, um Nutzer, auf dessen Webservern allow_url_fopen deaktiviert ist, nicht auszuschließen.
Und genau dieses kleine Snippet möchte ich euch heute zeigen und erklären.
$datei = "http://www.beispiel.de/meine_seite.php";
if (function_exists('curl_version'))
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $datei);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($curl);
curl_close($curl);
}
else if (file_get_contents(__FILE__) && ini_get('allow_url_fopen'))
{
$content = file_get_contents($datei);
}
else
{
echo 'Sie haben weder cURL installiert, noch allow_url_fopen aktiviert. Bitte aktivieren/installieren allow_url_fopen oder Curl!';
}
Zuerst wird überprüft, ob auf dem Server die cURL Erweiterung zur Verfügung steht. Wenn dies der Fall ist, wird die Datei per cURL geladen.
Steht cURL nicht zur Verfügung, so wird überprüft, ob allow_url_fopen aktiviert ist. Ist dies der Fall, wird die Datei per file_get_contents() geladen.
Stehen beide Möglichkeiten nicht zur Verfügung, wird eine Fehlermeldung ausgegeben, was den Endanwender vor etwaigen, für ihn “kryptischen”, Fehlermeldungen bewahren soll.
Falls ihr euch fragt, warum ich cURL den Vorzug gegenüber file_get_contents() gebe, so liegt das daran, dass ich die Erfahrung gemacht habe, dass cURL, bezogen auf diesen Anwendungsfall, etwas performanter ist.
Abschließend lässt sich sagen, dass ihr bei Verwendung der hier aufgezeigten Methode, die Chance darauf, dass euer Script bei möglichst vielen Usern läuft, verdoppeln könnt. Das ist doch schon mal was, oder?
Was haltet ihr von meinem Snippet? Würdet ihr es genauso umsetzen oder haltet ihr davon eher nichts? Wie geht ihr mit der “Problematik” allow_url_fopen um?
Viele Grüße,
Raffi


