if($var==1) reagiert auch bei $var = 11?

Security

Erfahrenes Mitglied
Hallo,
ich hab dda so ein Problem. Ich will einen Terminplan in PHP schreiben, den Inhalt speichere ich dabei extern. Ich will mir alle Termine von dem aktuellen Datum anzeigen lassen. Doch lasse ich für jeden Termin auch ein Wochentag berechnen.
So nun zu meinem eigentlich en Problem, ich muss jedem Mpnat eine bestimmte Anzahl an Tagen zuordnen. Dazu habe ich die monats nummer in einer Variable z.B. $var. Jetzt mache ich eine Abfrage mit if und füge eine Tagesanzahl hinzu.
PHP:
 <?php
$var = date(n); // Es ist ja November also der 11.
if($var=1){$md = 31}
// Da sind jetzt noch die anderen Monate.
elseif($var=11){$md = 30};
?>
Was jetzt dabei rummkomt ist sehr komisch. Nicht nur das $md 31 ist sonder $var ist nicht mehr 11 (November) sonder 1 (Januar).
Ich komme einfach nicht weiter, also helft mir bitte.

Falls ihr noch ganz andere Ideen habt kommt hier der gesammte PHPcode.
PHP:
<?php
$j = date(j);
$n = date(n);
$Y = date(Y);
$w = date(w);
$L = date(L);
require "data/plan.php";
$c = "t_" . $Y . $n . $j;
$zeit = time();
$datum = getdate($zeit);
echo $datum[yday] . "<br>";
$g = $datum[yday];
for($x=1;$x<50;$s++){
if($w == 0){$day="SO";$w++;}
elseif($w == 1){$day="MO";$w++;}
elseif($w == 2){$day="DI";$w++;}
elseif($w == 3){$day="MI";$w++;}
elseif($w == 4){$day="DO";$w++;}
elseif($w == 5){$day="FR";$w++;}
elseif($w == 6){$day="SA"; $w=0;};
$c = "t_" . $Y . $n . $j;
if($$c != ""){
echo "<table border=0 cellpadding=3 cellspacing=3 width=600>";
echo " <tr>";
echo " <td class=$day align=center style=width:25px; >$day</td>";
echo " <td style=width:50px; >$j.$n.$Y</td>";
echo " <td align=left><p align=left>" . $$c . "</p></td>";
echo " </tr>";
echo "</table>";
$x++;
};
$g++;
$j++;
// An dieser Stelle wollte ich die If klausel haben.
if($j==32){
$j = 1;
$n++;};
if($L==0 && $g == 365){
$Y++;
$g = 0;
$n = 1;
$j = 1;
}
elseif($L==1 && $g == 367){
$Y++;
$g = 0;
$n = 1;
$j = 1;
};
if($s==500){$x=30;};
};
?>
 
= ist kein Vergleichsoperator.
Zum Vergleichen zweier Werte musst du == verwenden.
Die Syntax in der Betreffzeile ist richtig. Im Beispiel ist die Bedingung dann falsch.

Anmerkung:
= setzt einen Wert in eine Variable.
Verwendest du $var=1 als Bedingung, ist diese immer erfüllt. Die Variable $var wird gkleichzeitig aber in der Bedingung auf 1 gesetzt.
Du veränderst also mit der Bedingung den Wert der Variablen und vergleichst diese nicht!

Einige Vergleichsoperatoren:
== -> ist gleich
>= -> ist größer oder gleich
<= -> ist kleiner odet gleich
> -> ist größer
< -> ist kleiner
!= -> ist nicht gleich
 
Ja ist mir grade ebend auch aufgefallen, aber trotzdem danke das du dir die mühe gemacht hast.
Das nächste mal werde ich auch bestimmt nochmal nachdenken bovor ich hierein poste.
 
Mal eine Frage nebenbei: Wird der oben beschriebene Quelltext ohne Bemerkungen ausgeführt? Denn eigendlich sollten massenhaft Fehlermeldungen zur Syntax ausgegeben werden, solange j, n, Y, w, L und yday keine Konstanten sind, wovon ich anhand ihrer Benutzung mal ausgehe. Außerdem gibt es viele deplatzier Semikola.
 
@Gumbo: Das gibt wenn dann nur Notices, und die sind per default ausgeschaltet (E_ALL ~E_NOTICES ist der Standardwert für error_reporting). Die zusätzlichen Semikola sind in dem Sinne keine Syntaxfehler, sondern stellen einfach eine Anweisung dar, die nichts tut. Schlechter Programmierstil sind die von dir genannten Kritikpunkte aber allemal.
 
Danke für deine so ermunternden Worte Matthias, ich weiß ja selber das mein Programmierstil ein reinstes Caos ist, aber das must du ja nicht so auf den Punkt bringen.
Außerdem wüste ich nicht welche Semikola ich weglassen sollte bis auf das ganz zum Schluss ist kein's überflüssig. Mich Wundert es ja erlichgesagt auch warum ich am Ende von If vor der Klammer immer ein Semikolon setzten muss, obwohl mir das recht Sinnlos erscheint.

So und jetzt zu Gumbo, solche Sachen wie date(j) sind ansich selbstverständlich nicht Konstant, jedes mal wenn man sie abruft sind sie entsprechend dem Datum. Doch da ich den Wert in eine Variable lege ist das kein Problem, denn die ist selbstverständlich konstant.

Ihr könnt euch gerne weiter den Kopfzerbrechen und den Code weiter modifizieren, so wie ich ihn jetzt habe läut es auf jeden fall einwandfrei.
 
Security hat gesagt.:
Ihr könnt euch gerne weiter den Kopfzerbrechen und den Code weiter modifizieren, so wie ich ihn jetzt habe läut es auf jeden fall einwandfrei.
Dann füge mal ganz oben folgenden Befehl ein:
PHP:
error_reporting(E_ALL);
und gucke, was dir für Meldungen um die Ohren geschmissen werden...

Mamphil
 
Mamphil du bist ein Spielverderber, ich weiß das ich eine sehr fragwürdige Methode benutzte. Aber mir fällt keine bessere ein. Bin halt nicht grade der PHP Gott.
Aber ihr könntet ja auch mal nicht nur kritisieren sondern vorschläge machen wie ich es anders lösen könnte, dabei fällt mySQL überigens aus, da ich keinen zugriff auf eine Datenbank habe.
Doch wäre ganz schon wenn jemand 'ne Methode einfällt die nicht so Serverbelastend ist.
 
So jetzt gibts auch noch mal den gesammten code mit stylesheet.

PHP:
 <?php
$j = date(j);
$n = date(n);
$Y = date(Y);
$w = date(w);
$L = date(L);
require "data/plan.php";
$c = "t_" . $Y . $n . $j;
$zeit = time();
$datum = getdate($zeit);
$g = $datum[yday];
for($x=1;$x<30;$s++){
if($w == 0){$day="SO";$w++;}
elseif($w == 1){$day="MO";$w++;}
elseif($w == 2){$day="DI";$w++;}
elseif($w == 3){$day="MI";$w++;}
elseif($w == 4){$day="DO";$w++;}
elseif($w == 5){$day="FR";$w++;}
elseif($w == 6){$day="SA"; $w=0;};
$c = "t_" . $Y . "_" . $n . "_" . $j;
if($$c != ""){
if($color=="#333333"){$color = "#000000";}
else{$color = "#333333";};
echo "<table border=0 cellpadding=3 cellspacing=3 width=777>";
echo " <tr>";
echo " <td class=$day align=center style=width:25px; >$day</td>";
echo " <td style=width:80px; ><div style=color:$color; >$j.$n.$Y</div></td>";
echo " <td align=left><p align=left style=color:$color; >" . $$c . "</p></td>";
echo " </tr>";
echo "</table>";
$x++;
};
$g++;
$j++;
if($j==32){
$j = 1;
if($n==1){$m = 31;}
elseif($n==2){if($L==1){$g = $g - 2; $w = $w - 2;}else{$g = $g - 3; $w = $w - 3;};}
elseif($n==3){$m = 30;}
elseif($n==4){$g = $g - 1; $w = $w - 1;}
elseif($n==5){$m = 30;}
elseif($n==6){$g = $g - 1; $w = $w - 1;}
elseif($n==7){$m = 30;}
elseif($n==8){$m = 30;}
elseif($n==9){$g = $g - 1; $w = $w - 1;}
elseif($n==10){$m = 30;}
elseif($n==11){$g = $g - 1; $w = $w - 1;}
elseif($n==12){$m = 30;};
$n++;};
if($L==0 && $g == 365){
$Y++;
$g = 0;
$n = 1;
$j = 1;
}
elseif($L==1 && $g == 366){
$Y++;
$g = 0;
$n = 1;
$j = 1;
};
if($s==100){$x=30;};
};
?>

Code:
 .mo {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#FF0000; margin:3px; padding-bottom:3px;}
.mi {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#00FF00; margin:3px; padding-bottom:3px;}
.di {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#0000FF; margin:3px; padding-bottom:3px;}
.do {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#FFFF00; margin:3px; padding-bottom:3px;}
.fr {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#00FFFF; margin:3px; padding-bottom:3px;}
.sa {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#FF00FF; margin:3px; padding-bottom:3px;}
.so {font-size:12px; text-align:center; font-weight:bold; padding:2px; color:black; border:0 solid black; background-color:#FF6600; margin:3px; padding-bottom:3px;}
Macht was draus wenn ihr wollt. Solls im entefekt aussehen.
Ich hab mir dazu auch noch ein kleines Updatesystem entwickelt und es ist genau so eine Katastrophe.
Forumlar:
PHP:
<?php
if($term==""){$term="Termin";};
if($time==""){$term="Zeit";};
?>
<form action="add.php" method="post">
<?php
if($d==""){ echo
?><select name="day" size="1" >
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="month">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
<select name="year">
<option value="2004">2004</option>
<option value="2005">2005</option>
<option value="2006">2006</option>
</select>
<?php }
else{echo $d . "." . $m . "." . $y . ":";};
?>
<input type="Text" name="time" value="<?php echo $time ?>" size="5" maxlength="5">
<input type="Text" name="termin" value="<?php echo $term ?>" size="75" maxlength="300"><br>
<input type="submit" value="Speichern">
<input type="reset" value="Zurücksetzen">
</form>
Upload:
PHP:
<?php
$fp = fopen("../data/plan.php","a");
$var = "\n<?php $" . "t_" . $year . "_" . $month . "_" . $day . " = " . "'" . $time . " - " . $termin . "'; ?>";
fseek ($fp, 2,"SEEK_END");
fputs($fp, $var);
fclose($fp);
?>
<body><a href="plan.php" onLoad="plan.php">Falls sie nicht automatisch weitergeleitet werden sollten klien sie hier.</a></body>
So jetzt seht ihr das ganze Desaster auf einen Blick.
 
Security hat gesagt.:
Danke für deine so ermunternden Worte Matthias, ich weiß ja selber das mein Programmierstil ein reinstes Caos ist, aber das must du ja nicht so auf den Punkt bringen.
Tschuldigung, aber soll ich's lieber in symbolischer Sprache beschreiben? :rolleyes:

Security hat gesagt.:
Außerdem wüste ich nicht welche Semikola ich weglassen sollte bis auf das ganz zum Schluss ist kein's überflüssig. Mich Wundert es ja erlichgesagt auch warum ich am Ende von If vor der Klammer immer ein Semikolon setzten muss, obwohl mir das recht Sinnlos erscheint.
Woher hast du das denn, dass du nach Blockanweisungen ein Semikolon setzen musst? Dem ist nämlich nicht so.

Security hat gesagt.:
So und jetzt zu Gumbo, solche Sachen wie date(j) sind ansich selbstverständlich nicht Konstant, jedes mal wenn man sie abruft sind sie entsprechend dem Datum. Doch da ich den Wert in eine Variable lege ist das kein Problem, denn die ist selbstverständlich konstant.
Es ging ihm wohl eher um das 'j' bei date(j). Das wird von PHP nämlich als Konstante aufgefasst. Es sollte aber eigentlich ein String sein, also besser in einfache Anführungszeichen setzen.


Ich hab deinen Code mal überflogen und mir ein paar Sachen rausgeschrieben, die als gut gemeinte Tipps anzusehen sind...

Lesbarkeit:
Code einrücken, Leerzeichen einfügen (wo sinnvoll), aussagekräftige Variablennamen verwenden

Syntax:
Keine Semikola nach Blockanweisungen, einfache Anführungszeichen bei Strings (außer doppelte werden unbedingt benötigt), keine Konstanten verwenden, wo Strings notwendig wären

Universal:
Handbuch lesen ;) Man kann bspw. mit [phpf]date[/phpf] die Anzahl der Tage in einem bestimmten Monat ermitteln lassen - da brauchst du das Rad nicht neu zu erfinden...


Ich weiß, dass es am Anfang mühsam erscheinen mag, sich an solche Regeln zu halten, aber im Endeffekt ersparst du dir damit eine Menge Arbeit und Zeit... vor allem lesbarer Code ist ein großes Plus, wenn es darum geht, Fehler aufzuspüren oder aber auch hier im Forum rasch Hilfe zu erhalten.
 
Zurück