[PHP & MySQL] Mehrere Datumangaben aus einem Textfeld auslesen

Dotwin

Grünschnabel
Hi.

Ich habe da so ein Gedankengang, den ich ned so wirklich umsetzen kann, da ich ned weis, ob das überhaupt möglich ist.
Dann versuche ich mal, das so gut wie möglich zu erklären.

Gegeben ist ein Textfeld (nennen wir es Notizen) in den diverse Infos über eine Person notiert werden, darunter auch ein oder mehrere Datum angaben (z.B. 2013-03-22 Vermittlung zu XY | 2013-03-28 Vermittelt zu YY | 2013-05-12 Vermittlung zu XZ).
Diese Eingaben werden natürlich in eine MySQL Datenbank in Zelle Notizen gespeichert.

Wie kann ich diese in eine PHP Datei die zur auswertung gedacht ist so verwerten, dass die 3 Datum Angaben aus der Notizen Zelle so verwendet werden, als ob diese in eine Eigene Tabellen Zelle stehen würden? Also nur die Datum Angaben ohne den dazugehörigen Text.

Der Zweck dahinter ist die 3 Datum Angaben aus der Notizen Zelle zu verwenden um eine Statistik anzulegen.

Datum | Vermittelt

03.2013 | 2
05.2013 | 1

Also das Datum auslesen und in der Tabelle (Monat.Jahr) und dann für den Monat aus der Notizen Zelle die Werte hochzählen.


Hoffe ich konnte das einigermaßen erklären, dass es auch verstanden wird, denn mir wird oft gesagt ich kann nix erklären :)

Danke schon mal für euere Hilfe.
 
Zuletzt bearbeitet:
Mit regulären Ausdrücken

Ganz kurz zusammengestiffelt
PHP:
 <?PHP
  //
  // Text, der durchsucht werden soll
  //
  $subject = '2013-03-22 Vermittlung zu XY | 2013-03-28 Vermittelt zu YY | 2013-05-12 Vermittlung zu XZ';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '/([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}) (Vermittlung|Vermittelt) zu ([[:alpha:]]+)/is';
  //
  // RegExp auswerten
  //
  $result = preg_match_all($pattern, $subject, $subpattern);
  //
  // Ergebnis ausgeben
  //
  echo '<p>Der verwendete Reguläre Ausdruck trifft auf den zu durchsuchenden Text '.
       (($result) ? $result.' mal ' : 'nicht ').'zu.</p>';
  //
  // Unterausdrücke ausgeben
  //
  echo '<pre>'.print_r($subpattern, TRUE).'</pre>';
?>

ergibt
Code:
Array
(
    [0] =>; Array
        (
            [0] =>; 2013-03-22 Vermittlung zu XY
            [1] =>; 2013-03-28 Vermittelt zu YY
            [2] =>; 2013-05-12 Vermittlung zu XZ
        )
    [1] =>; Array
        (
            [0] =>; 2013-03-22
            [1] =>; 2013-03-28
            [2] =>; 2013-05-12
        )
    [2] =>; Array
        (
            [0] =>; Vermittlung
            [1] =>; Vermittelt
            [2] =>; Vermittlung
        )
    [3] =>; Array
        (
            [0] =>; XY
            [1] =>; YY
            [2] =>; XZ
        )
)

Hier gehts zur Spielwiese: http://regexp-evaluator.de/evaluator/60672ff8c3e2c4b78a13d340eb26be02/#ergebnis
 
Hab da jetzt rum versucht. Aber mehr wie "Bahnhof" und "ich mag züge" kommt ned bei raus :)

Aber schon mal gut zu wissen, dass so nen auslesen möglich ist.
 
ich mag Züge?
Wo soll den das stehen?

Bring doch mal ein Beispielstring mit Daten die eben nicht funktionieren.

der folgende Pattern nimmt nach Vermittlung/Vermittelt alles bis zum nächsten | oder Textende
Code:
'/([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}) (?:Vermittlung|Vermittelt) zu (.*)(?:\||$)/isU'
 
ich poste mal das was ich bisher habe. mit einen einzigen datumsfeld aus der datenbank klappt es nur mit den 3 fachen resultat meines beispiels leider nicht.

Ned wundern über die seltsame benennung der variablen, das von meinen vorgänger und ich versuche da schon den ganzen tag durch zu blicken :)

PHP:
	echo "<h3>Mehrfach vermittelte Freiwillige</h3>";
	
	echo "<table border=\"1\"><tr><th>Datum</th><th>Vermittelt</th></tr>";
	
	$query4 = "SELECT * from freiwilligev2 WHERE `notizen` LIKE '%Vermittelt: 20%'";
	$result4 = $mysqli->query($query4);
	$myarray4 = array();
	while ($zeile4 = $result4->fetch_array()) {
	
	$subject4 = $zeile4['notizen'];
	$pattern4 = '/([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2})/is';
	$result42 = preg_match_all($pattern4, $subject4, $subpattern4);
		$mydate4 = strftime("%m.%Y", $subpattern4, TRUE);
		$myarray4[$zeile4['id']] = $mydate4;
	}

	$yearstats4 = array();	
	$savefield4 = "";
	$nineteenseventy4 = "01.1970";
	$savestardate4 = date("Y");
	

	foreach ($myarray4 as $data4) {

		$field4 = explode("|", $data4);

		if ($field4[0] == $savefield4 || $field4[0] == $nineteenseventy4)
			continue;
	
		$stardate4 = explode(".", $field4[0]);

		if ($stardate4[1] != $savestardate4) {
			$borg4 = explode("|", $yearstats4[$savestardate4]);
			
			echo "<tr><td><b>Jahr " . $savestardate4 . "</b></td><td><b>" . $borg4[0] . "</b></td></tr>";

		}

		$savestardate4 = $stardate4[1];
	
		echo "<tr><td>" . $field4[0] . "</td><td>";

		$qcannon4 = 0;
		foreach ($myarray4 as $lor4) {
			$borg4 = explode("|", $lor4);
	
			if ($borg4[0] == $field4[0])
				$qcannon4++;

		}

		echo $qcannon4 . "</td></tr>";

		$klingon4 = explode("|", $yearstats4[$savestardate4]);
		$qcannon4 += $klingon4[0];

		$yearstats4[$savestardate4] = $qcannon4;
		$savefield4 = $field4[0];

	}

	echo "</table>";
 
PHP:
$mydate4 = strftime("%m.%Y", $subpattern4, TRUE);
Das geht sicher in die HOse. $subpattern4 ist ein Array und kein String
 
Warum nicht gleich das Datum in ein eigenes Feld schreiben und auch in ner eigenen Spalte ind er Datenbank ablegen?
 
PHP:
$mydate4 = strftime("%m.%Y", $subpattern4, TRUE);
Das geht sicher in die HOse. $subpattern4 ist ein Array und kein String

Genau da liegt mein Poblem :)

Warum nicht gleich das Datum in ein eigenes Feld schreiben und auch in ner eigenen Spalte ind er Datenbank ablegen?

Weil das ein Formular ist, wo man nicht weis ob ein Datum gesetzt ist oder 80 nach einiger zeit. Kann ja schlecht 80 Felder für Datum vormerken :)

Mit einen Datum klappt es ja bisher. Soll jetzt eben erweitert werden damit man nach und nach mehr paralelle Vermittlungen setzen kann die dann jedes mal ein neues Datum brauchen aber das alte nicht überschreiben sollen. Daher die Idee mit den Notiz Feld.
 
Öh, es gibt sowas, das nennt sich Javascript, damit kann man dynamisch felder nachladen.
 
Von JS hab ich ja noch weniger Ahnung als von PHP :)
Hatte damit schon mal was versucht, aber das ging total in die Hose.
 
Zurück