Zur Navigation

Formular absenden und Geburtstag auslesen [5]

41 Jörg Kruse

`alter` ist in deiner Abfrage kein reales Datenfeld sondern nur ein Alias, der in einer WHERE Klausel nicht zur Verfügung steht - dafür aber in einer HAVING Klausel:

http://dev.mysql.com/doc/refman/5.1/de/problems-with-alias.html

Ich würde es so probieren:

WHERE CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m'))
BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1)
AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)
HAVING `alter` IN('50', '60', '70', '80', '90', '100')

24.05.2012 21:00 | geändert: 24.05.2012 21:01

42 tobi

Auf HAVING muss man auch erstmal kommen.

immerhin bekomme ich nun zwei aufgelistet. Einer davon ist innerhalb des genannten Zeitraumes, der andere außerhalb. Die anderen beiden von mir genantnen tauchen gar nicht auf.

hier die runden Geburtstagskinder des TTC`s im Zeitraum von
24.05.2012 bis zum 02.06.2012
Person 2 hat am 01.06. Geburtstag und wird 61 Jahre alt (01.06.1951)
Person 20 hat am 18.07. Geburtstag und wird 51 Jahre alt (18.07.1961)

hinzu kommt nun noch eine Fehlermeldung für die Zeilen 177 und 181
Notice: Undefined offset: 1 on line 177
Notice: Undefined offset: 1 on line 181
Notice: Undefined offset: 1 on line 177
Notice: Undefined offset: 1 on line 181

177 - 181 ist der Bereich:
				". date_mysql2german($expDate[0])." ".substr($expDate[1],0,5)." Geburtstag und wird 

				". $zeile['alter'] ." Jahre alt

				(". timestamp_mysql2german($expDate[0])."".substr($expDate[1],0,5).")

24.05.2012 21:13

43 Jörg Kruse

Die Fehlermeldung besagt, dass es $expDate[1] nicht gibt

Hier erzeugst du das Array mit explode():

$expDate = explode(" ",$zeile['geburtsdatum']);

Ich würde hier zum Debuggen $zeile['geburtsdatum'] mit echo ausgeben, anscheinend enthält es zweimal kein Leerzeichen

24.05.2012 23:07 | geändert: 24.05.2012 23:08

44 tobi

Hallo,

1951-06-01 Notice: Undefined offset: 1 on line 177 Notice: Undefined offset: 1 on line 181
1961-07-18 Notice: Undefined offset: 1 on line 177 Notice: Undefined offset: 1 on line 181

Codeauszug, habe echo $zeile['geburtsdatum']; vor $expDate = explode(" ",$zeile['geburtsdatum']); eingebaut
					while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
					{
				echo $zeile['geburtsdatum']; 	
				$expDate = explode(" ",$zeile['geburtsdatum']);	
				
$Nachricht .= "			

				&ensp;". $zeile['vorname'] ." 
				". $zeile['name'] ." hat am 

				". date_mysql2german($expDate[0])." ".substr($expDate[1],0,5)." Geburtstag und wird 

				". $zeile['alter'] ." Jahre alt

				(". timestamp_mysql2german($expDate[0])."".substr($expDate[1],0,5).")
				<br />";
					$anzahl++;
					}

26.05.2012 16:19

45 Jörg Kruse

1951-06-01

$zeile['geburtsdatum'] enthält also kein Leerzeichen und insofern macht es auch keinen Sinn, den String anhand von Leerzeichen aufzuspalten:

$expDate = explode(" ",$zeile['geburtsdatum']);

Es gibt dann nur $expDate[0], was identisch ist mit $zeile['geburtsdatum']

26.05.2012 19:14 | geändert: 26.05.2012 19:15

46 tobi

und was heißt dies für mich als Laie ;)

07.06.2012 16:52

47 Jörg Kruse

Mit explode() spaltest du den String auf, siehe Beschreibung im Manual:

http://php.net/manual/de/function.explode.php

Als Begrenzungszeichen hast du " " angegeben, also ein Leerzeichen. Da $zeile['geburtsdatum'] kein Leerezeichen enthält, kann da aber nichts aufgespalten werden.

Möglicherweise hast du das Datumsformat ja irgendwann mal geändert, vorher war da vielleicht noch ein Leerzeichen zwischen Datum und Uhrzeit.

Bei einem "1951-06-01" macht der Code an der Stelle aber keinen Sinn. Wenn du das Datum direkt ausgeben möchtest, kannst du ja einfach $zeile['geburtsdatum'] ausgeben?

date_mysql2german($zeile['geburtsdatum'])

07.06.2012 17:49

48 tobi

wenn ich
$expDate = explode(" ",$zeile['geburtsdatum']);	
auskommentiere, dann tauchen noch mehr Fehlermeldungen auf und alles wird mit 00.00. (00.00.0000) ausgegeben.

07.06.2012 17:57

49 Jörg Kruse

Du musst dann natürlich auch $expDate[0] durch $zeile['geburtsdatum'] ersetzen (siehe meinen letzten Beitrag) und die Abschnitte mit $expDate[1] rausschmeißen.

07.06.2012 18:04

1 Forenmitglied fand diesen Beitrag gut

50 tobi

habe wohl eine Kleinigkeit vergessen zu ändern, nun wird es mal gänzlich ohne Fehlermeldungen angezeigt.

SELECT id, name, vorname, geburtsdatum, (IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())) - YEAR(geburtsdatum)) AS `alter`, DAYOFMONTH(geburtsdatum) AS geburtstag, MONTH(geburtsdatum) AS geburtsmonat
FROM geburtstagsliste
WHERE CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m'))
BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1)
AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)
ORDER BY geburtsmonat, geburtstag

da ich von tag heute + 9 Tage die Geburtstage auflisten möchte, muß ich ja den Bereich hier in Angriff nehmen, richtig?
BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1)
AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)

und so in etwa Abändern?
DATE_ADD(CURDATE(),INTERVAL 9 DAY);

07.06.2012 18:38 | geändert: 07.06.2012 18:38