PhP/XML
magic_al
- xml
Ich bin gerade dabei ein Adressverwaltungsprogramm für einen Sportverein zu schreiben.
Kernidee ist es, dass Verantwortliche Personen Gruppen-Emails an Personen mit bestimmten Bedingungen versenden können. Das Bezieht sich in den meisten Fällen auf das Geburtsdatum der User.
Meine Idee war, das Ganze in einer XML-Datenbank zu realisieren, da eine DB nicht zur Verfügung steht. Bei einer normalen DB wäre es einfach die benötigten Daten via SQL zu selektieren. Wie aber macht man so etwas bei XML. Ich habe heute einige Zeit damit verbracht mir Dinge bezüglich XML und SimpleXML durchzulesen. Mir erscheint es danach als relativ schwierig ordentliche Abfragen für eine XML-Datei zu gestalten.
Meine Ansatz sieht ganz grob so aus:
<users>
<user>
<name></name>
<vorname></vorname>
<pw></pw>
<email></email>
<geburtsdatum>
<tag></tag>
<monat></monat>
<jahr></jahr>
</geburtsdatum>
</user>
</users>
Ist das einfach dämlich wie ich das angehe oder sehe ich bloß die Möglichkeit nicht wie ich zum Beispiel über Php herausfinde, welche User zB: älter als 16 und jünger als 20 sind?
Wie aber macht man so etwas bei XML.
Da wirst du um ein bisschen php-Programmierung nicht herumkommen! SimpleXML hilft Dir dabei, die xml-"Datenbank" in ein php-Objekt zu überführen. Das wars dann auch schon.
Ist das einfach dämlich wie ich das angehe oder sehe ich bloß die Möglichkeit nicht wie ich zum Beispiel über Php herausfinde, welche User zB: älter als 16 und jünger als 20 sind?
Suchst Du jetzt eine Möglichkeit aus den Tag, Monat, Jahr Daten und einem anderen Datum die Differenz zu bilden oder scheitert es schon vorher?
Liebe Grüße,
LSpreee
Wie aber macht man so etwas bei XML.
Da wirst du um ein bisschen php-Programmierung nicht herumkommen! SimpleXML hilft Dir dabei, die xml-"Datenbank" in ein php-Objekt zu überführen. Das wars dann auch schon.Ist das einfach dämlich wie ich das angehe oder sehe ich bloß die Möglichkeit nicht wie ich zum Beispiel über Php herausfinde, welche User zB: älter als 16 und jünger als 20 sind?
Suchst Du jetzt eine Möglichkeit aus den Tag, Monat, Jahr Daten und einem anderen Datum die Differenz zu bilden oder scheitert es schon vorher?
Liebe Grüße,
LSpreee
Danke für deine Antwort.
Naja es scheitert daran, dass ich nicht weiß, wie ich die Datensätze identifiziere deren Geburtstag gewissen bedingungen entsprechen.
Bisher habe ich es nur geschaft, diese Daten auszugeben.
Mir ist klar, dass ich das Geburtsdatum jedes einzelnen Users auf meine Bendingungen prüfen muss, aber ich weiß nicht wie. Eine Schleife oder so etwas. Ich finde das aber nicht.
Hilft mir vll. "xpath" weiter?
Bisher habe ich es nur geschaft, diese Daten auszugeben.
Ich nehme an, die Daten aus den Feldern "Jahr", "Monat", "Tag"?
Das ist doch schon die halbe Miete!
Dann machst aktuelles Datum (im Unixformat) minus Geburtstag (im Unixformat) gleich Alter in Sekunden. Daraus schliesst Du dann aufs Alter. Der Umweg über das Unixformat spart die Schaltjahrproblematik.
Könnte dann so aussehen ( nicht getestet):
<?php
$day = "08";
$month = "10";
$year = "1982";
$birthday_unix = strtotime("$month/$day/$year");
$now_unix = time();
$diff_unix = $now_unix - $birthday_unix;
$yearsold = floor($diff_unix / 60 / 60 / 24 / 365);
var_dump($birthday_unix);
var_dump($diff_unix);
var_dump($yearsold);
if($yearsold > 16) echo "Der Kandidat darf Bier im Supermarkt kaufen!";
?>
Mir ist klar, dass ich das Geburtsdatum jedes einzelnen Users auf meine Bendingungen prüfen muss, aber ich weiß nicht wie. Eine Schleife oder so etwas. Ich finde das aber nicht.
Hilft mir vll. "xpath" weiter?
Liebe Grüße,
LSpreee
Bisher habe ich es nur geschaft, diese Daten auszugeben.
Ich nehme an, die Daten aus den Feldern "Jahr", "Monat", "Tag"?
Das ist doch schon die halbe Miete!Dann machst aktuelles Datum (im Unixformat) minus Geburtstag (im Unixformat) gleich Alter in Sekunden. Daraus schliesst Du dann aufs Alter. Der Umweg über das Unixformat spart die Schaltjahrproblematik.
Könnte dann so aussehen ( nicht getestet):
<?php
$day = "08";
$month = "10";
$year = "1982";$birthday_unix = strtotime("$month/$day/$year");
$now_unix = time();
$diff_unix = $now_unix - $birthday_unix;$yearsold = floor($diff_unix / 60 / 60 / 24 / 365);
var_dump($birthday_unix);
var_dump($diff_unix);
var_dump($yearsold);if($yearsold > 16) echo "Der Kandidat darf Bier im Supermarkt kaufen!";
?>
>
> >
> > Mir ist klar, dass ich das Geburtsdatum jedes einzelnen Users auf meine Bendingungen prüfen muss, aber ich weiß nicht wie. Eine Schleife oder so etwas. Ich finde das aber nicht.
> >
> > Hilft mir vll. "xpath" weiter?
>
>
>
> Liebe Grüße,
> LSpreee
Danke. Soweit hätte ich es wohl noch geschaft. Aber wie mache ich das für jeden User in der Datei und wie kann ich die User identifizieren bzw. die emailadresse dieser User auslesen?
Mir ist klar, dass ich das Geburtsdatum jedes einzelnen Users auf meine Bendingungen prüfen muss, aber ich weiß nicht wie. Eine Schleife oder so etwas. Ich finde das aber nicht.
Danke. Soweit hätte ich es wohl noch geschaft. Aber wie mache ich das für jeden User in der Datei und wie kann ich die User identifizieren bzw. die emailadresse dieser User auslesen?
Liebe Grüße,
LSpreee
Na, wie Du sagst: mit Schleifen. Wenn Du das eben mit einer xml machen möchtest und nicht mit sqlLight, bleibt Dir da wohl nix anderes übrig.
Die children() methode erlaubt das iterieren über die Kinder... Dann musst Du eben die Email lesen und im Speicher halten und dann weitergehen, den Geburtstag checken und im gegebenen Fall die Mail dann für Deine Zwecke verwenden.
Danke dir. Die Children-Funktion hat den Knoten zum Platzen gebracht.
Gruß und schönen Abend!
Hi,
Meine Idee war, das Ganze in einer XML-Datenbank zu realisieren, da eine DB nicht zur Verfügung steht.
Nicht mal das Textdatei-basierte SQLite?
Das ist doch heutzutage in aktuellen PHP-Installationen eigentlich Quasi-Standard.
MfG ChrisB
Hi!
Nicht mal das Textdatei-basierte SQLite?
Streich "Text"!
Lo!
hi,
Meine Idee war, das Ganze in einer XML-Datenbank zu realisieren, da eine DB nicht zur Verfügung steht.
Eines vorweg: XML dient zum Daten_austausch_. Zum Speichern von Daten für eine Anwendung, die damit arbeiten soll ist das ungeeignet. Was die Performance betrifft, da hatte ich neulich das Vergnügen zu einem Vergleich:
Textdatei: 400 MB, Einlesen dauert 1 Minute.
Binärdatei (mit gleicher Nutzdatenmenge): 100 MB, in 15 Sekunden eingelesen.
Wobei in beiden Fällen mit allen Daten die gleiche Datenstruktur in den RAM gelesen wurde; was bei einer Web-Anwendung jedoch auch im Fall einer Binärdatei nicht mehr vertretbar ist. Fazit: Schaffe Dir eine DB-Anbindung, damit sind kleinere Datenmengen im Hauptspeicher und das ist dann auch performanter.
Ansonsten guck mal, ob es eine PHP-Library gibt, die aus XML eine in PHP zu verarbeitende Datenstruktur erzeugen und nach getaner Arbeit wieder in die Datei zurückschreiben kann. Bei kleinen Datenmengen (< 10 MB) wäre das ok, je nach IO-Mächtigkeit der Plattform liegt das noch im Sekundenbereich.
Hotti