PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Datumsüberprüfung...hilfe


ne0
2003-02-11, 11:29:16
Ich will eine datumsabfrage für ein formular machen.

Und zwar kann man da ein termin auswählen. Aber ich will das man nur einen termin, der 8 tage vor dem heutigen ist, wählen kann.

Also soll man zum Beispiel nicht heute einen termin für morgen machen können...es soll dann eine fehlermeldung kommen.

Hinzu kommt das es 4 Felder sind. Einmal kann man den Wochentag auswählen, dann den tag (also 1. bis 31.) dann den monat und dann das jahr...ich denke man braucht nur den tag...

Ich poste jetzt mal den PHP Code

Ich hoffe ihr könnt mir helfen.


<?

// Prüfung der Angaben nach dem Senden
if(!$Clanname) $fehler[] = "Der Clanname fehlt.";
if(!$WararrangerEMail) $fehler[] = "Die Emailadresse fehlt.";
if(!$Wochentag1) $fehler[] = "Du hast kein Wochentag angegeben.";
if(!$Tag1) $fehler[] = "Du hast kein Tag angegeben.";
if(!$Monat1) $fehler[] = "Du hast keinen Monat angegeben.";
if(!$ClanHomepage) $fehler[] = "Du hast keine Homepage (angegeben).";
if(!$Wararranger) $fehler[] = "Wir brauchen einen Ansprechpartner...";
if(!$Server) $fehler[] = "Wir brauchen einen Server...";

$lastip=fopen("lastip.dat","r");
$lip=fgets($lastip,255);
fclose($lastip);
$ip=getenv("REMOTE_ADDR");
if ($lip==$ip) {
$fehler[] = "Mit dieser IP Adresse ($ip) wurde vorhin erst ein Formular an den Webmaster gesendet.";
}
if($Team=="Sledgehammer")
{
$emailentscheidung ="test@web.de";
}
else
{
$emailentscheidung ="clawhammer@gmx.de";
}
if(!count($fehler)) { // Sendet Email, wenn Prüfung "ok"
$inhalt ="Folgendes wurde abgeschickt:\r\n Von: $Clanname \r\n Absender IP: $ip\r\n Clan Squad: $GegnerSquad \r\n Clan Homepage: $ClanHomepage \r\n Wararranger: $Wararranger \r\n Wararranger Email: $WararrangerEMail \r\n Server IP: $Server \r\n Map: $Map \r\n Gegen Team: $Team \r\n Spielzeit: $Spielzeit \r\n Typ: $Typ \r\n FriendlyFire: $FriendlyFire \r\n Terminvorschlag1: $Wochentag1 $Tag1 $Monat1 $Jahr1 \r\n Terminvorschlag2: $Wochentag2 $Tag2 $Monat2 $Jahr2 \r\n Terminvorschlag3: $Wochentag3 $Tag3 $Monat3 $Jahr3 \r\n Sontiges: $Sonstiges";
$empfaenger=$emailentscheidung;
$empfaenger2="analle@test.de";
@mail($empfaenger,"From: ".$Clanname,$inhalt,"CC: $empfaenger2");
$lastip=fopen("lastip.dat","w");
fputs($lastip,"$ip");
fclose($lastip);
echo "<strong>Kontaktformular erfolgreich gesendet</strong><br><br>\n";
echo "<center>\n";
echo "Von: <b>$Clanname ($GegnerSquad)</b><br>\n";
echo "An: <b>P3D Clan - $Team </b><br>\n";
echo "Betreff: <b>Fight us</b><br>\n";
echo "Von IP: <b>$ip</b><br><br>\n";
echo "<a href=\"news.shtml\">Zurück</a>";
echo "</center>\n";


} else { // Fehlerausgabe, wenn Felder leer waren

echo "<strong>Fehler:</strong>";
echo "<ul><li>".implode("<li>",$fehler)."</ul>";
echo "<a href=\"javascript:history.back(1)\">ich muss zurück</a>";
}
?>


Danke im voraus

greetz
NEO

JTHawK
2003-02-11, 11:33:51
ich würde das so lösen das ich den termin nicht auswähle .. sonder eingebe im format:

24.12.2002

dann lasse ich php das ganze in den timecode umwandeln und erhöhe das um 8 tage .. dann vergleiche ich ob das mit dem aktuellen + 8 tage möglich ist und gebe dann eventuell ne fehlermeldung aus ..

ne0
2003-02-11, 12:10:32
hmm das ging ja echt schnell...danke :)

aber kannst du mir sagen wie das geht ?

ich habe nicht die größte ahnung von PHP

wäre net wenn du mir das mal posten könntest

danke nochmal

greetz
NEO

PS: Geht es wirklich nicht das man das ausgewählte aus dem Formular weiterbearbeiten kann. Also das würde dann zum Beispiel ein "23." rauskommen. So jetzt den Punkt weg machen (ich weiss zwar net wie aber das geht doch) und dann hat man doch schonmal ne feste zahl die man wie du gesagt hast in timecode umwandeln...so kann ich dann die anderen daten, wie monat und jahr auch stutzen und in ne variable packen...sach mir einfach wenn ich mist rede...

JTHawK
2003-02-11, 12:29:41
ja das geht auch is nur umsändlicher



<?
$datum = "10.12.2002";
$zeit = "16:30";

//also das was eingegeben wurde

$A_date = explode('.',$datum);
$A_time = explode(':',$zeit);

//jetzt hat er die . und : weggenommen und alle daten einzeln in arrays gebastelt

$datum = mktime($A_time[0],$A_time[1],10,$A_date[1],$A_date[0],$A_date[2]);

//und jetzt fummelt er mit der mktime funktion aus den einzelnen daten das UNIX-Timestamp zusammen
//die 10 steht da nur weil ich keine sekunden angegeben habe in der uhrzeit oben
//sicher kannst du die zeit auch ganz weglassen musst dann dafür aber werte eingeben .. zb 10 oder was auch immer
?>


die mktime funktion is so aufgebaut:

mktime(int Stunde, int Minute, int Sekunde, int Monat, int Tag, int Jahr)

am ende kommt ein wert wie 991165204 raus .. das sind dann die SEKUNDEN SEIT DEM 1.1.1970

wenn du nun wissen willst wie der zeitstempel von morgen ist dann musst du halt die sekunden dafür dazurechnen 1h hat 3600 sekunden macht für 24h 90.000 sekunden ..

also

991165204 + 90000 = 991255204

wäre dann der zeitstempel für den nächsten tag

usw .. wenns ausfürhlicher sein soll einfach fragen ..

ne0
2003-02-11, 12:54:37
wenn ich dich richtig verstanden habe muss ich das so machen das er jeden tag eben "1" Tag hinzufügt...damit er immer das aktuelle datum hat ? sehe ich das richtig ? wenn ja dann wüsste ich nicht wie ich das machen soll das er jeden tag was hinzufügt...


find ich echt klasse wie du mir hilfst :)

greetz
NEO

edit: hier ist die html datei dazu: http://mitglied.lycos.de/neo2k312/php/herausforderung1.htm
edit2: uff jetzt hats klick gemacht...also ich muss die variablen da reindrücken, und raus kommt die sekundenzeit (sozusagen)

aber wie mach ich das jetzt mit den 8 tagen vorraus...also mit if oder wie ?

edit3: muss ich dann mktime + 99999 (oder so) rechnen..wie wird das den korrekt geschrieben.. ?

JTHawK
2003-02-11, 17:42:35
ok .. dann etwas ausführlicher



$tag = 10;
$monat = 3;
$jahr = 2003;

//das sind die im formular eingegebenen daten

$neues_datum = mktime(24,59,59,$tag,$monat,$jahr); //falsch - sorry

$neues_datum = mktime(0,0,1,$monat,$tag,$jahr); //richtig

//jetzt fummelt er die eigegebenen Daten in ein Unix-Timestamp um
//übersetzt würde der befehlt dann lauten (zum verständnis):
//$datum = mktime(0,0,1,10,3,2003);
//heraus kommt eine lange zahl - der errechnete timestamp
//0,0,1 steht für 00:00:01 Uhr

$aktuelles_datum = time();

//php ermittelt den AKTUELLEN Unix-Timesamp

$vergleich_datum = $aktuelles_datum + 720000;

//jetzt rechnet er zum aktuellen datum 8 tage dazu

if ($vergleich_datum > $neues_datum) {
echo "was halt richtig is machen";
} else {
echo "fehlermeldung";
}

//und der vergleich ob das eingegebene datum auch wirklich mindestens 8 tage nach dem heutigen liegt
//und wenn nicht fehlerausgabe

ne0
2003-02-11, 18:40:54
ok ich habs verstanden... :)

ich probiere es mal

vielen dank JTHawK du hast mir sehr geholfen und warst sehr geduldig mit mir anfänger :)

greetz
NEO

edit: mist es klappt noch nicht ganz...
er sacht mir immer egal welches datum, das es zu früh ist...


<?

// Prüfung der Angaben nach dem Senden
if(!$Clanname) $fehler[] = "Der Clanname fehlt.";
if(!$WararrangerEMail) $fehler[] = "Die Emailadresse fehlt.";
if(!$Wochentag1) $fehler[] = "Du hast kein Wochentag angegeben.";
if(!$Tag1) $fehler[] = "Du hast kein Tag angegeben.";
if(!$Monat1) $fehler[] = "Du hast keinen Monat angegeben.";
if(!$ClanHomepage) $fehler[] = "Du hast keine Homepage (angegeben).";
if(!$Wararranger) $fehler[] = "Wir brauchen einen Ansprechpartner...";
if(!$Server) $fehler[] = "Wir brauchen einen Server...";
if(!$kurz) $fehler[] = "Zu schnell";

$lastip=fopen("lastip.dat","r");
$lip=fgets($lastip,255);
fclose($lastip);
$ip=getenv("REMOTE_ADDR");
if ($lip==$ip) {
$fehler[] = "Mit dieser IP Adresse ($ip) wurde vorhin erst ein Formular an den Webmaster

gesendet.";

if($Team=="Sledgehammer")
{
$emailentscheidung ="neo2kmail@web.de";
}
else
{
$emailentscheidung ="neo2kmail@web.de";
}

$A_tag = explode('.',$tag1);
$A_monat = explode('.',$monat1);

$neues_datum = mktime(24,59,59,$tag[0],$monat[0],$jahr1);

//jetzt fummelt er die eigegebenen Daten in ein Unix-Timestamp um
//übersetzt würde der befehlt dann lauten (zum verständnis):
//$datum = mktime(0,0,1,10,3,2003);
//heraus kommt eine lange zahl - der errechnete timestamp
//0,0,1 steht für 00:00:01 Uhr

$aktuelles_datum = time();

//php ermittelt den AKTUELLEN Unix-Timesamp

$vergleich_datum = $aktuelles_datum + 720000;

//jetzt rechnet er zum aktuellen datum 8 tage dazu
}
if($vergleich_datum > $neues_datum)
{
$kurz = "1";
}
else
{
$kurz = "";
}

//und der vergleich ob das eingegebene datum auch wirklich mindestens 8 tage nach dem

heutigen liegt
//und wenn nicht fehlerausgabe



if(!count($fehler)) { // Sendet Email, wenn Prüfung "ok"
$inhalt ="Folgendes wurde abgeschickt:\r\n Von: $Clanname \r\n Absender IP: $ip\r\n Clan

Squad: $GegnerSquad \r\n Clan Homepage: $ClanHomepage \r\n Wararranger: $Wararranger \r\n

Wararranger Email: $WararrangerEMail \r\n Server IP: $Server \r\n Map: $Map \r\n Gegen Team:

$Team \r\n Spielzeit: $Spielzeit \r\n Typ: $Typ \r\n FriendlyFire: $FriendlyFire \r\n

Terminvorschlag1: $Wochentag1 $Tag1 $Monat1 $Jahr1 \r\n Terminvorschlag2: $Wochentag2 $Tag2

$Monat2 $Jahr2 \r\n Terminvorschlag3: $Wochentag3 $Tag3 $Monat3 $Jahr3 \r\n Sontiges:

$Sonstiges";
$empfaenger=$emailentscheidung;
$empfaenger2="neo2kmail@web.de";
@mail($empfaenger,"From: ".$Clanname,$inhalt,"CC: $empfaenger2");
$lastip=fopen("lastip.dat","w");
fputs($lastip,"$ip");
fclose($lastip);
echo "<strong>Kontaktformular erfolgreich gesendet</strong><br><br>\n";
echo "<center>\n";
echo "Von: <b>$Clanname ($GegnerSquad)</b><br>\n";
echo "An: <b>P3D Clan - $Team </b><br>\n";
echo "Betreff: <b>Fight us</b><br>\n";
echo "Von IP: <b>$ip</b><br><br>\n";
echo "<a href=\"news.shtml\">Zurück</a>";
echo "</center>\n";


} else { // Fehlerausgabe, wenn Felder leer waren

echo "<strong>Fehler:</strong>";
echo "<ul><li>".implode("<li>",$fehler)."</ul>";
echo "<a href=\"javascript:history.back(1)\">ich muss zurück</a>";
}
?>

ne0
2003-02-11, 19:22:36
edit: ah jetzt hab ichs 2 mal gepostet sry
edit2: is wech :)

JTHawK
2003-02-11, 21:27:27
oh sorry .. mein fehler .. ein kleiner logigfehler - hab monat mit tag vertauscht :D

anstatt

$neues_datum = mktime(24,59,59,$tag,$monat,$jahr);

muss es

$neues_datum = mktime(0,0,1,$monat,$tag,$jahr);

heißen!

das 0,0,1 stand schonmal da .. warum sich da 24,59,59 eingeschliche hat weis ich nich :D siehe erklärung oben

achja .. editier doch mal deinen doppelpost so das nur noch einer zu sehen ist .. einfach den 2. inhalt löschen :D

und das mit den . hinter den zahlen kannst du auch weglassen - erspart ne menge code

Matthias2x
2003-02-12, 00:37:01
Meines erachtens nach kann das auch nicht funktionieren, selbst mit JTHawks neuem Code.

Als erstes muß hier folgendes rein,
statt:

$A_tag = explode('.',$tag1);
$A_monat = explode('.',$monat1);

dies hier:

$A_tag = explode('.',$Tag1);
$A_monat = explode('.',$Monat1);

Ich sag nur Groß-/Kleinschreibung, das sind sonst völlig verschiedene Variablen.
Weiter gehts,
statt:

$neues_datum = mktime(24,59,59,$tag[0],$monat[0],$jahr1);

dies hier:

$neues_datum = mktime(24,59,59,$A_tag[0],$A_monat[0],$Jahr1);

Erstens sind für Tag und Monat 2 nicht gesetzte Variablen drin gewesen, und bei $jahr1 muß sicher auch wieder Groß-/Kleinschreibung beachtet werden. Ich denke mal du hast Jahr1 als Name des Eingabefeldes vergeben, analog zu Tag1 und Monat1 (?!).
Da die letzten 3 Variablen falsch waren, kommt am Ende beim Vergleich zwischen $vergleich_datum und $neues_datum immer $vergleichdatum als der größere Wert heraus, weil $neues_datum dann immer der 1.1.1970 um 00:00:01 Uhr ist. Wenn die Fehler beseitigt sind, sollte der Rest funktionieren. Korrigiert mich falls ich einen Denkfehler haben sollte...

JTHawK
2003-02-12, 00:53:15
du hast recht ..

bei variablen IMMER auf gross und kleinschreibung achten

wenn du $zeit definierst und $Zeit abfragst bekommst du immer NULL ..

aber seinen code umschreiben tu ich net :D da sollte jeder selbst drauf achten - soweit kommts noch

achja .. das was ich da oben gepostet habe ist alles nur

EINE MÖGLICHKEIT :D (ich liebe diese -> :D :D <-)

soll heißen das kann man auch anders machen :D

achja .. bei mir funzte das ganze im test den ich ebend schnell gemacht hab .. hab das da oben nur gepostet net vorher getestet ..

edit:

ok .. also doch

für deinen code - ne0 - muss die zeile so lauten:


$neues_datum = mktime(0,0,1,$A_monat[0],$A_tag[0],$Jahr1);


und nimm mal meine kommentare da raus .. das schaut ja schrecklich aus - soviel organge

ne0
2003-02-12, 14:35:02
ah es klappt..

vielen vielen dank an euch...das hätte ich nie hinbekommen

greetz
NEO :)

JTHawK
2003-02-12, 17:10:15
ach .. übung macht den meister :D

Matthias2x
2003-02-12, 18:26:12
*zustimm*

@ne0,
wir helfen doch gerne....:)