[PHP] IF und ELSE Afrage funktioniert nicht richtig

digiTALE

Lt. Junior Grade
Registriert
Juli 2004
Beiträge
270
Hallo an alle!

Ich bin gerade dabei ein Webkalender zu basteln wo unteranderem Geburtstage eingetragen werden. Nun wollte ich auf die erste Seite die Geburtstage anzeigen lassen die demnächst anstehen -> sprich Heute, Morgen und Übermorgen.

Über die If und Else Abfrage wollte ich das so machen das wenn ein Geburtstag ansteht er mir den anzeigt oder wenn keiner in dem Zeitraum ansteht, dann soll er mir "Keine Geburtstage vorhanden" ausgeben.

Nun habe ich die ganze Zeit versucht das selber irgendwie himzubekommen, aber leider ohne Erfolg. Da dacht ich mir schaust einfach mal im Web nach, aber das hat mir auch nicht wirklich weitergebracht. Weiß auch nicht so recht wie ich an die Sache rangehen soll.

Wie kann ich das Problem lösen das er mir die Geburtstage von "Heute, Morgen und Übermorgen" anzeigt oder halt "Keine Geburtstage vorhanden".


Das Script funktioniert nicht wirklich mit der If Abfrage :(
PHP:
<?php
$DatabasePointer = mysql_connect("localhost", "...", "...");

mysql_select_db("Geburtstage", $DatabasePointer);

$ResultPointer = mysql_query("SELECT * FROM Geburtstage WHERE Geburtsdatum
LIKE '13.01.____'", $DatabasePointer);

$Geburtstage = mysql_fetch_object($ResultPointer);

if($Geburtstage->Tage == 13) {

echo"<b>Name :</b> $Geburtstage->Name<br>\n",
"<b>Alter :</b> wird <script type=\"text/javascript\">alter(",
"$Geburtstage->Jahre, ",
"$Geburtstage->Monate, ",
"$Geburtstage->Tage ",
");</script> alt<br>\n",
"<b>Geburtstag :</b> $Geburtstage->Geburtsdatum <br>\n";
}
else 
{ ?>
<br>Kein Geburtstag vorhanden
<?php } 
?>

mfg digiTALE
 
PHP:
<?php
$DatabasePointer = mysql_connect("localhost", "...", "...");

mysql_select_db("Geburtstage", $DatabasePointer);

$ResultPointer = mysql_query("SELECT * FROM Geburtstage WHERE Geburtsdatum
LIKE '13.01.____'", $DatabasePointer);

$Geburtstage = mysql_fetch_object($ResultPointer);

if($Geburtstage->Tage != 'FALSE') {

echo"<b>Name :</b> $Geburtstage->Name<br>\n",
"<b>Alter :</b> wird <script type=\"text/javascript\">alter(",
"$Geburtstage->Jahre, ",
"$Geburtstage->Monate, ",
"$Geburtstage->Tage ",
");</script> alt<br>\n",
"<b>Geburtstag :</b> $Geburtstage->Geburtsdatum <br>\n";
}
else 
{ ?>
<br>Kein Geburtstag vorhanden
<?php } 
?>
auch wen mir dein script an sich so garnix sagt denke ich geht es am ehsten so ..
 
Das Script soll die Datenbank auslesen und soll halt erkennen welche Geburtstage in den nächsten 2 Tagen anstehen. Deshalb habe ich in der Tabelle 3 Spalten angelegt.
Die erste ist Heute, die zweite Morgen und die dritte Übermorgen.

ein Bsp. wie das Ablaufen soll.
Heute ist der 13.Januar (Heute) und kein Geburtstag ist in der Datenbank vorhanden genausowenig wie am 14.Januar (Morgen) aber am 15.Januar (Übermorgen) ist ein Geburtstag. Die am 13. und 14. soll dann "Kein Geburtstag eingetragen" ausgegeben werden und am 15. soll dann der Geburtstag angezeigt werden.

Das ganze ist dann vortlaufend, sprich wenn wir heute den 14.Januar (Heute) hätten dann -> Kein Eintrag, 15.Januar (Morgen) -> Geburtstag, 16. Januar (Übermorgen) -> Kein Geburtstag.

Ich hoffe ihr habt das Prinzip verstanden!?


Hier mal ein Screenshot wie das aussehen soll.

klickst du hier, schaust du da

@AlbertLast
das hat leider nicht funktioniert

mfg digiTALE
 

Anhänge

  • webkalender.jpg
    webkalender.jpg
    31,8 KB · Aufrufe: 329
Also wen ic hdas richtig verstehe dann muss ic hsagen das es scheisse ist was du tust weil am besten ist wen du für jeden tag ein query machst sprich 3 query für heute morgen und übermorgen und dan mysql_num_rows nimmst um die anzahl der datensätze zu zählen und dan würde ich persöhnlich mysql_result benutzen um die einzelenn datensätze aus zu lesen
 
Na na, nich so frech. Ausserdem habe ich für Heute, Morgen und Übermorgen ein eigenes Query gegeben ;). Daran sollte es nicht liegen!

jedenfalls werd ich das mal versuchen mit "mysql_num_rows" und "mysql_result"

mfg digiTALE
 
Also ICH würde:
- Das Datumsformat in der Datenbank auf Unixtimestamp ändern, damit kann man nämlich dann vernünftig rechnen

- Im Skript dann:
- Das aktuelle Datum generieren (Unixtimestamp)
- Den Unixtimestamp von Uebermorgen generieren
- Mit einem Query alle Geburtstage, deren Timestamp dazwischen liegt, abfragen.
 
Hallo,

ich schließe mich Phux an. So wie es im Moment ist macht das keinen Sinn. Allerdings würde ich dir zu einem Feld des Typs "DATE" raten, da es ja auch Personen gibt die vor 1970 geboren sind, was sonst bei einem Unix-Timestamp zu Problemen führen würde. ;)
Anschließend würde ich wie Phux schon gesagt hat vorgehen oder die Abfrage je nach Anwendungsgebiet einfach in drei Queries aufsplitten.

MfG mh1001
 
Ups, habe im Screenshot übersehen, dass das Alter angezeigt werden soll.
Ich ging vom Geburtsdatum (also Tag und Monat) ohne Jahr aus.

Das lässt sich auf verschiedene Arten lösen.

Ua:
- Spalte für das Jahr
- MySQL-Timestamp benutzen
- date benutzen.

Nichts desto Trotz lässt sich mit den Unixtimestamps am einfachsten rechnen.
 
Hey,

hmm soll ich das nun über "Timestamp" machen oder nicht?

Hab vorher noch was anderes probiert. Das Mysql_Result über $Result und LIKE zu machen. Klappt auch irgendwie, nur wenn bei einem Datum kein Geburtstag eingetragen ist bringt er mir einen Fehler! (siehe unten Screenshot)

Hier die Abfrage (das wird aus der Datenbank ausgelesen und auf der Hauptseite angezeigt)
PHP:
<table width="790" cellpadding="0" cellspacing="0" align="center" height="120">
<tr>
<td bgcolor="#FFE0CC" align="left" width="263" valign="top"><div
class="result"><b><u><?php echo $date0 ?> (Heute)</u></b><br><br>

<?php
$MysqlServer = mysql_connect("localhost", "...", "...");

mysql_select_db("Geburtstage", $MysqlServer);

$Result = mysql_query("SELECT * FROM Geburtstage WHERE Geburtsdatum
LIKE '14.01.____'", $MysqlServer);

$Geburtstage = mysql_fetch_object($Result);

if(mysql_result($Result, 'LIKE')) {

echo"<div class=\"result\">\n",
"<b>Name :</b> $Geburtstage->Name<br>\n",
"<b>Alter :</b> wird <script type=\"text/javascript\">alter(",
"$Geburtstage->Jahr, ",
"$Geburtstage->Monat, ",
"$Geburtstage->Tag ",
");</script> alt <br>\n",
"<b>Geburtstag :</b> $Geburtstage->Geburtsdatum <br>\n";
}
else 
{ ?>
<br>Kein Geburtstag vorhanden
<?php } 
?></div></td>

<td bgcolor="#EEEEEE" align="left" width="263" valign="top"><div
class="result"><b><u><?php echo $date1 ?> (Morgen)</u></b><br><br>

<?php
$MysqlServer = mysql_connect("localhost", "...", "...");

mysql_select_db("Geburtstage", $MysqlServer);

$Result = mysql_query("SELECT * FROM Geburtstage WHERE Geburtsdatum
LIKE '15.01.____'", $MysqlServer);

$Geburtstage = mysql_fetch_object($Result);

if(mysql_result($Result, 'LIKE')) {

echo"<b>Name :</b> $Geburtstage->Name<br>\n",
"<b>Alter :</b> wird <script type=\"text/javascript\">alter(",
"$Geburtstage->Jahr, ",
"$Geburtstage->Monat, ",
"$Geburtstage->Tag ",
");</script> alt<br>\n",
"<b>Geburtstag :</b> $Geburtstage->Geburtsdatum <br>\n";
}
else 
{ ?>
<br>Kein Geburtstag vorhanden
<?php } 
?></div></td>

<td bgcolor="#EEEEEE" align="left" width="263" valign="top"><div
class="result"><b><u><?php echo $date2 ?> (Übermorgen)</u></b><br><br>

<?php
$MysqlServer = mysql_connect("localhost", "...", "...");

mysql_select_db("Geburtstage", $MysqlServer);

$Result = mysql_query("SELECT * FROM Geburtstage WHERE Geburtsdatum
LIKE '16.01.____'", $MysqlServer);

$Geburtstage = mysql_fetch_object($Result);

if(mysql_result($Result, 'LIKE')) {

echo "<b>Name :</b> $Geburtstage->Name<br>\n",
"<b>Alter :</b> wird <script type=\"text/javascript\">alter(",
"$Geburtstage->Jahr, ",
"$Geburtstage->Monat, ",
"$Geburtstage->Tag ",
");</script> alt <br>\n",
"<b>Geburtstag :</b> $Geburtstage->Geburtsdatum <br>\n";		
}
else 
{ ?>
<br>Kein Geburtstag vorhanden
<?php } 
?></div></td>
</tr>
</table>

Screenshot

mfg digiTALE
 

Anhänge

  • webkalender2.jpg
    webkalender2.jpg
    43,8 KB · Aufrufe: 293
Phux schrieb:
Was genau ist daran nicht klar?
Wahrscheinlich hatte AlbetrLast das mit der seperaten Spalte für das Jahr überlesen. ;)
Dennoch halte ich dies für absolut ineffizient.
Wie schon angesprochen würde ich das Datum in einem Feld des Typs "DATE" speichern. Dieses ist ja auch schließlich auch extra dafür vorhergesehen. ;)
Mit den Datums-Funktionen sollte es dann auch keine Probleme bereiten die entsprechenden Datensätze nach speziellen Kriterien auszulesen. ;)

MfG mh1001
 
mh1001 schrieb:
Wahrscheinlich hatte AlbetrLast das mit der seperaten Spalte für das Jahr überlesen. ;)
Dennoch halte ich dies für absolut ineffizient.
Wie schon angesprochen würde ich das Datum in einem Feld des Typs "DATE" speichern. Dieses ist ja auch schließlich auch extra dafür vorhergesehen. ;)
Mit den Datums-Funktionen sollte es dann auch keine Probleme bereiten die entsprechenden Datensätze nach speziellen Kriterien auszulesen. ;)

MfG mh1001

Es kommt drauf an, ob die Anwendung eher DB- oder Skriptlastig ist.
Reine Zahlenformate sind für die DB sehr viel effizienter handlebar als das Date-Format.
Dafür hat man etwas mehr Last in den Skripts.

Mit dem Date-Format ist es u.u. umgekehrt.
 
Wenn ich das jetzt in der Datenbank per "Date mache, kann ich aber im Formular wenn ich ein Geburtstag eintrage z.B. 16.06.1984 eingeben?

Ich habe auf mysql.com nachgeschaut und das Datumsformat wird wie folgt eingetragen -> "YYYY-MM-DD". Muss ich jetzt beim Formular auch 1984-06-16 eingeben, oder formatiert er mir das dann so?

mfg digiTALE
 
Das mit der Formatierung sollte kein Problem sein. ;)
Dazu kannst du die Eingabe einfach per explode() zersplitten und dann anschließend mit der mktime() und date()-Funktion entsprechend formatieren.

MfG mh1001


//Edit:

@Phux

Das mag zwar stimmen, jedoch wird sich dies in der Praxis wohl oft doch recht negativ auswirken. Wenn ich nun zum Beispiel alle Datensätze vom 12.11.2003 bis zum 14.4.2005 abfragen möchte wird sich dann sowohl bei der Performance der Abfrage als auch bei deren Komplexität (welche schon bei diesem simplen Beispiel weitaus höher ist) deutlich bemerkbar machen.
Queries dynamisch generieren mag ich da dann schon gar nicht. ;)
 
Zuletzt bearbeitet:
@Phux

Das mag zwar stimmen, jedoch wird sich dies in der Praxis wohl oft doch recht negativ auswirken. Wenn ich nun zum Beispiel alle Datensätze vom 12.11.2003 bis zum 14.4.2005 abfragen möchte wird sich dann sowohl bei der Performance der Abfrage als auch bei deren Komplexität (welche schon bei diesem simplen Beispiel weitaus höher ist) deutlich bemerkbar machen.
Queries dynamisch generieren mag ich da dann schon gar nicht. ;)[/QUOTE]

Da gibt es ja dann die MySQL-Timestamps :-)
Naja, ist ja wurscht. Ich wollte ja eigentlich nur ausdrücken, dass viele Wege nach
Rom führen und alle ihre Vor- und Nachteile haben.

@digiTALE

Versuch es doch mal nach diesem Prinzip:

include("connection.inc");

$Result = mysql_query("SELECT * FROM Geburtstage WHERE Datum
LIKE '____-11-15'");
$a=mysql_affected_rows();
while($row=mysql_fetch_array($Result)){
echo"<div class=\"result\">\n",
"<b>Name :</b> $row[Name]<br>\n",
"<b>Alter :</b> Javascriptblabla<br>\n",
"<b>Geburtstag :</b> $row[Datum] <br>\n";
}
if ($a==0)echo "kein Geburtstag";

So hast Du auch keine Probleme, wenn mehrere Personen am
gleichen Datum Geburtstag haben.
 
@Phux

Da hast du schon Recht. Dass es auch so möglich ist möchte ich auch gar nicht bestreiten. ;)

Zum Code:

Für SELECT-Abfragen gibt es mysql_num_rows(). mysql_affected_rows() ist dafür eigentlich nicht vorgesehen.
Wenn du für das Datum nun ein DATE-Feld verwendest könnte die SELECT-Abfrage dann zum Beispiel so aussehen:

Code:
SELECT * FROM geburtstage WHERE DAY(geburtsdatum) = 14 AND MONTH(geburtsdatum) = 1;
Das Ergebnis wären dann alle Geburtstage des 14.1.

MfG mh1001
 
Zuletzt bearbeitet:
Habe jetzt in der Mysql Datenbank das Geburtsdatum als Type "date" eingerichtet, also liegt das Datum jetzt so vor -> 1984-06-16 in der Datenbank.

Jetzt will ich das Datum aber wieder auf der index Seite in ein anderes Format bringen per explode!

ein Beispiel:
PHP:
<?php
$MysqlServer = mysql_connect("localhost", "...", "...");

mysql_select_db("calendar", $MysqlServer);

$Result = mysql_query("SELECT * FROM birthdate WHERE Geburtsdatum
LIKE '____-06-16'", $MysqlServer);

$auslesen  = "$row[Geburtsdatum]"; //liest das Geburtsdatum in der Datenbank aus !? 1984-06-16
$teile = explode("-", $auslesen); //hier sollte er das Zeichen - entfernen

$a=mysql_affected_rows();

while($row=mysql_fetch_array($Result)){

echo"<b>Name :</b> $row[Name]<br>\n",
"<b>Alter :</b> wird <script type=\"text/javascript\">alter(",
"$teile[0], ", //hier wird nur das Jahr (1984) von der explode funktion ausgelesen
"$teile[1], ", //hier wird nur der Monat (06) von der explode funktion ausgelesen
"$teile[2] ", //hier wird nur der Tag (16) von der explode funktion ausgelesen
");</script> alt<br>\n",
"<b>Geburtstag :</b> $teile[2].$teile[1].$teile[0] <br>\n"; //so soll das Datum aussehen 16.06.1984
}
if ($a==0)echo "kein Geburtstag";			
?>

Das "explode" funktioniert nicht wenn ich das Geburtsdatum über "$row[Geburtsdatum]" einlese, nur wenn ich das manuell eingebe! Wie kann man das ändern?

@mh1001
Wenn ich die Funktion "mysql_affected_rows" durch "mysql_num_rows" ersetze bringt er mir eine Fehlermeldung.

mfg digiTALE
 
Probiere es einmal so:
PHP:
$datumsarray = explode(".", $gegebenes_datum);
$geburtsdatum = date("Y-m-d", mktime(0, 0, 0, $datumsarray[1], $datumsarray[0], $datumsarray[2]));
Das mit den mysql_num_rows() sollte dann so aussehen:
PHP:
$a = mysql_affected_rows($Result);
Wenn du ein Datum aus der Datenbank ausliest brauchst du da auch nicht extra das ganze mit irgendwelchen PHP-Funktionen zerpflücken. ;)
Dazu gibt es DATE_FORMAT(). ;)

MfG mh1001
 
Zuletzt bearbeitet:
Zurück
Oben