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.
Einfache XML-Serialisierung in C#
Heute möchte ich euch zeigen, wie man eine XML-Serialisierung in C# durchführen kann. Serialisierung selbst, bedeutet, dass man ein Objekt in eine andere, transportable Form umwandelt. Mittels XML-Serialisierung ist es uns zum Beispiel nötig, ein Objekt einer Klasse in Form einer XML-Datei abzuspeichern und auch wieder herzustellen.
Das kann Sinn machen, wenn man ein Objekt in seinem Zustand nach dem Schließen und erneuten Öffnen einer Anwendung wiederherstellen oder wenn man ein Objekt beispielsweise per HTTP übertragen möchte.
Für unser Beispiel habe ich folgende Klasse Blog erstellt:
public class Blog
{
public string User { get; set; }
public string Pass { get; set; }
public string Subdomain { get; set; }
public string BaseUrl { get; set; }
}
Die Methode zum Serialisieren sieht wie folgt aus:
public void SerializeBlogToXML(Blog blogObj)
{
//Erstelle einen XML-Serialisierer für Objekte vom Typ Blog
XmlSerializer serializer = new XmlSerializer(typeof(Blog));
//Erstelle einen FileStream auf die Datei, in die unserer
//Blog-Objekt in XML-Form gespeichert werden soll.
FileStream file = new FileStream(Application.StartupPath
+ "\\blog.xml",
FileMode.Create);
//Serialisiere das übergebene Blog-Objekt (blogObj)
//und schreibe es in den FileStream.
serializer.Serialize(file, blogObj);
//Schließe die XML-Datei.
file.Close();
}
Nicht vergessen die passenden Using-Anweisungen zu schreiben!
using System.Xml.Serialization; using System.IO;
Ohne diese würde die oben geschriebene Methode SerializeBlogToXML nicht ohne weitere Anpassungen laufen.
Das war es auch schon. Wenn man von meinen Kommentaren absieht, dann reichen ganze 4 Zeilen aus, um ein Objekt als XML-Datei abzuspeichern.
Ein kleines Beispiel zur Verwendung könnte zum Beispiel so aussehen:
private void buttonSerialisieren_Click(object sender, EventArgs e)
{
//Blog-Objekt erstellen und mit Werten befüllen
Blog blogObject = new Blog();
blogObject.User = "maxmustermann";
blogObject.Pass = "superpasswort";
blogObject.Url = "www.code-bude.net";
//Blog-Objekt serialisieren
SerializeBlogToXML(blogObject);
}
Wenn alles geklappt hat, dürfte sich nun im Ausführungsverzeichnis eures Projektes eine Datei namens Blog.xml befinden. Diese sollte folgenden Inhalt haben:
<?xml version="1.0"?> <Blog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <User>maxmustermann</User> <Pass>superpasswort</Pass> <Url>www.code-bude.net</Url> </Blog>
Das einzige was jetzt noch fehlt, ist die Konvertierung eines nach XML serialisierten Objekts. Das geht sogar noch ein bisschen leichter, als das umwandeln in’s XML-Format.
public Blog DeserializeXmlToBlog()
{
XmlSerializer serializer = new XmlSerializer(typeof(Blog));
FileStream file = new FileStream(Application.StartupPath
+ "\\blog.xml",
FileMode.Open);
//Die Deserialize()-Methode gibt ein Object zurück. => casten!
Blog blogList = serializer.Deserialize(file) as Blog;
file.Close();
return blogList;
}
Zum Abschluss noch mal ein Beispiel, in dem Serialisiert und Deserialisiert wird.
private void buttonSerialisieren_Click(object sender, EventArgs e)
{
Blog blogObject = new Blog();
blogObject.User = "maxmustermann";
blogObject.Pass = "superpasswort";
blogObject.Url = "www.code-bude.net";
SerializeBlogToXML(blogObject);
Blog blogFromXml = DeserializeXmlToBlog();
MessageBox.Show(blogFromXml.Url);
}
Ich hoffe, ich habe das ganze verständlich genug beschrieben. Solltet ihr dennoch Fragen haben, schreibt mir einfach einen Kommentar.
Wer keine Lust hat, den Code von Hand zu tippen bzw. zu kopieren, der kann sich das Beispiel auch als Visual Studio 2010 Projekt herunterladen.
Viele Grüße,
Raffi
Benutzer im Active Directory suchen in C# – der einfache Weg
Vorgestern schrieb ich noch darüber, wie man die Active Directory Suchfunktion in Windows 7 erreicht. Heute soll es darum gehen, wie man in C# komfortabel das Active Directory nach Benutzern durchsuchen kann. Der Schwerpunkt liegt hierbei auf komfortabel, denn Artikel über die Thematik generell gibt es schon einige im Netz. Die meisten nutzen dafür jedoch ausschließlich die Methoden rund um System.DirectoryServices.ActiveDirectory und den DirectorySearcher. Doch seit .NET 3.5 geht es auch mit wesentlich weniger und vorallem, wie ich finde, verständlicherem Quelltext.
Doch kommen wir nun zur Sache. In dem folgenden Beispiel nutze ich hauptsächlich Methoden aus dem System.DirectoryServices.AccountManagement Namespace. Und so geht’s:
//Einen Kontext zur entsprechenden Windows Domäne erstellen
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,
"meineDomaene");
//Ein "User-Objekt" im Kontext anlegen
UserPrincipal user = new UserPrincipal(domainContext);
//Den Suchparameter angeben
user.Name = "he*";
//Den Sucher anlegen und ihm die Suchkriterien
//(unser User-Objekt) übergeben
PrincipalSearcher pS = new PrincipalSearcher();
pS.QueryFilter = user;
//Die Suche durchführen
PrincipalSearchResult<Principal> results = pS.FindAll();
//Bei Bedarf weitere Details abfragen
Principal pc = results.ToList()[0];
DirectoryEntry de = (DirectoryEntry)pc.GetUnderlyingObject();
//Erstes Ergebnis zum Test ausgeben
MessageBox.Show(de.Properties["mail"].Value.ToString());
Nach dem ihr nun den Quelltext gesehen habt, gibt’s natürlich noch ein paar Hinweise dazu. In Zeile 9 habe ich die Name-Eigenschaft von user gesetzt. Das * gilt dabei als Wildcard. Es würden also in Zeile 17 alle Active Directory Benutzereinträge zurückgegeben, deren Name mit “he” anfängt und beliebig weiter geht.
Grundsätzlich lässt sich noch dazu sagen, dass ihr auch andere Eigenschaften, statt der Name-Eigenschaft, setzen könnt, die dann als Suchfilter fungieren. Auch das kombinieren von mehreren Eigenschaften ist möglich.
Außerdem möchte ich noch anmerken, das alles ab Zeile 21 optional ist. In den meisten Fällen dürften die Principal-Objekte reichen, die der PrincipalSearcher zurückgibt. Diese Principal-Objekte enthalten jedoch nicht alle Properties, die man so im Active Directory setzen kann.
Solltet ihr also eine Eigentschaft suchen, die das Principal Objekt nicht fasst, so müsst ihr auf den am Anfang des Artikels angesprochenen alten Weg zurückgreifen. Dazu wird das unterlegene Objekt des Principal mittels GetUnderlyingObject ermittelt und als DirectoryEntry gecastet. Diesem könnt ihr dann, wie in Zeile 24 gezeigt, alle beliebigen Informationen entnehmen.
Ich hoffe, ich konnte euch mit diesem Artikel ein wenig helfen. Viel Spaß damit. Solltet ihr noch Fragen haben, schreibt mir einfach einen Kommentar.
Viele Grüße,
Raffi
Einfacher Syntaxhighlighter in PHP
In folgendem Artikel möchte ich euch zeigen, wie ihr in wenigen Zeilen euren eigenen Syntaxhighlighter schreiben könnt. Mit Hilfe des folgenden PHP Snippets könnt ihr ohne Weiteres Quellcode, gut lesbar, auf eurer Homepage anzeigen lassen.
Das Ganze geht einfacher als ihr denkt. Die wesentliche Arbeit nimmt uns die interne PHP-Funktion highlight_file ab. Diese Funktion liest eine Datei ein und formatiert den Quelltext farbig. Wir müssen dann lediglich noch die Zeilen der Datei zählen und die Zeilennummern, sowie den vorformatierten Text in einem ansehnlichen Format ausgeben.
Da das Snippet nicht all zu lang ist, denke ich, dass die Kommentare im Snippet selber ausreichen. Solltet ihr dennoch Fragen haben, schreibt einfach einen Kommentar.
<?php
function highlight_quellcode($datei)
{
//Zeilen der Quellcode-Datei zählen
$anzahl_zeilen = count(file($datei));
//Liste mit Ziffern aller Zeilennummern erstellen
$liste_zeilennummern = range(1, $anzahl_zeilen);
//Zeilennummern als String formatieren. Hinter jede
//Zeilennummer einen Zeilenumbruch in HTML (<br />)
$zeilen = implode($liste_zeilennummern, '<br />');
//Quellcode einlesen und formatieren
//'true' legt Quellcode in Variable ab
//'false' würde Quellcode an Ort und Stelle ausgeben
$quellcode = highlight_file($datei, true);
//HTML-Ausgabe. CSS Code zur Formatierung der Tabelle
//Zeilennummern und Quellcode werden in jeweils einer
//Tabellenspalte ausgegeben
echo '
<html>
<head>
<style type="text/css">
.codewrapper {
margin: 5px;
border: 1px dashed dimgray;}
.id {
text-align: right;
color: dimgray;
font: 10pt \'Courier New\';
padding-right: 5px;
border-right: 1px dashed dimgray;}
.code {
padding-left: 5px;}
</style>
</head>
<body>
<table class="codewrapper">
<tr>
<td class="id">'.$zeilen.'</td>
<td class="code">'.$quellcode.'</td>
</tr>
</table>
</body>
</html>';
}
//Aufrufen der Syntaxhighlightfunktion. Als Einzulesende Datei
//wird diese Datei selbst ausgegeben.
highlight_quellcode("short.php");
?>
Ich habe das Snippet in einer Datei namens short.php abgespeichgert. Im Snippet ruft sich das PHP-Script selbst auf und gibt somit seinen eigenen Quelltext aus. Eine Demo könnt ihr euch hier anschauen.
Viele Grüße,
Raffi


