Bernd: if Problem

Hallo,

in einem if kann man doch mehrere Werte zusammenfassen?

// Error nur setzten wenn Ende eingegeben wird
		if ($_POST["usz_ende"] != "") {
			
			if($TestStundenTag != $ABAE){
        		$errors[] = "Deine Anwesenheitszeit stimmt nicht mit deiner Arbeits- & Pausenzeit überein.";
    		}

    	if (($StundenTagMitarbeiter > 6) and 
         ($PauseProTagMitarbeiter < 9) and 
         ($PauseProTagMitarbeiter < 0.5)) {
    			
           $errors[] = "Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein";
    		} 

    		if (($StundenTagMitarbeiter > 9) and 
           ($PauseProTagMitarbeiter < 0.75)) {
    			  
           $errors[] = "Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein";
    		}  		
		
		}

Hier habe ich das Beispiel her:
https://www.soscisurvey.de/help/doku.php/de:create:filter-boolean

Als Ergebnis erhalte ich alle Fehrmeldungen

Deine Anwesenheitszeit stimmt nicht mit deiner Arbeits- & Pausenzeit überein. Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein

Dieses ist zwar nicht schön, denn als erstes sollte nur das Pausenproblem behoben werden, aber dennoch warum werden beide Pausen Bereich ausgegeben?

  1. @@Bernd

        	if (($StundenTagMitarbeiter > 6) and 
             ($PauseProTagMitarbeiter < 9) and 
             ($PauseProTagMitarbeiter < 0.5)) {
    

    Das macht nicht wirklich Sinn. Wenn $PauseProTagMitarbeiter kleiner ist als 0.5, dann ist das auch garantiert kleiner als 9. Die Abfrage ist also überflüsiig.

    warum werden beide Pausen Bereich ausgegeben?

    Weil alle Bedingungen erfüllt sind und du mit $errors[] jeweils einen Eintrag ans Array anhängst.

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    1. Hallo,

      Das macht nicht wirklich Sinn. Wenn $PauseProTagMitarbeiter kleiner ist als 0.5, dann ist das auch garantiert kleiner als 9. Die Abfrage ist also überflüsiig.

      jetzt wo du es sagst :/ Die Abfrage muss natürlich so lauten

      if (($StundenTagMitarbeiter > 6) and 
         ($StundenTagMitarbeiter < 9) and 
         ($PauseProTagMitarbeiter < 0.5)) {
          	$errors[] = "Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein";
         } 
      

      Jetzt bleibt nur noch das Problem mit den doppelten Fehlermeldungen

      Deine Anwesenheitszeit stimmt nicht mit deiner Arbeits- & Pausenzeit überein.
      Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein

      Wie könnte ich da vorgehen? Rein logisch sind beide Meldungen richtig, aber wenn die Pausenzeit noch nicht stimmt, soll die obere erst gar nicht ausgegeben werden.

      1. Ok, ich habe die Fehlermeldungen so hinbekommen

        $errors = array();
        $errors1 = array();
        
        // Error nur setzten wenn Ende eingegeben wird
        		if ($_POST["usz_ende"] != "") {
        			
        			if($TestStundenTag != $ABAE){
                		$errors[] = "Deine Anwesenheitszeit stimmt nicht mit deiner Arbeits- & Pausenzeit überein.";
            		}
        
            		if (($StundenTagMitarbeiter > 6) and 
                   ($StundenTagMitarbeiter < 9) and 
                   ($PauseProTagMitarbeiter < 0.5)) {
            			  $errors1[] = "Deine Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein";
            		} 
        
            		if (($StundenTagMitarbeiter > 9) and  
                   ($PauseProTagMitarbeiter < 0.75)) {
            			  $errors1[] = "Deine Pausenzeit stimmt nicht mit der gesetzlich vorgeschriebenen Zeit überein";
            		}  		
        		
        		}
        
        <?php if(isset($_POST['abschicken']) && empty($errors1) === false) {?>
            <?php echo '<ul><li>'.implode('</li><li>',$errors1).'</li></ul>'; 
            ?>
          <?php } ?>
        
          <?php if(isset($_POST['abschicken']) && empty($errors) === false && empty($errors1) === true) {?>
            <?php echo '<ul><li>'.implode('</li><li>',$errors).'</li></ul>'; 
            ?>
          <?php } ?>
        
        1. Hallo Bernd,

          heißer Tipp

          Rolf

          --
          sumpsi - posui - clusi
        2. @@Bernd

          <?php if(isset($_POST['abschicken']) && empty($errors1) === false) {?>
              <?php echo '<ul><li>'.implode('</li><li>',$errors1).'</li></ul>'; 
              ?>
            <?php } ?>
          
            <?php if(isset($_POST['abschicken']) && empty($errors) === false && empty($errors1) === true) {?>
              <?php echo '<ul><li>'.implode('</li><li>',$errors).'</li></ul>'; 
              ?>
            <?php } ?>
          

          Zu dem Code einige Anmerkungen:

          empty($errors1) === false Würdest du das in natürlicher Sprache so ausdrücken: Ist es wahr, dass es keine Fehler gab? Oder würdest du sagen: Gab es keine Fehler?

          Vermutlich letzteres, und genau das solltest du im Code auch tun: !empty($errors1)

          Vergleiche von booleschen Werten gegen true oder false sind unsinnig; stattdessen gleich die booleschen Werte verwenden. So wie du es bei isset($_POST['abschicken']) ja auch tust.

          Statt empty($errors1) === true dann auch einfach empty($errors1).


          Markup (HTML-Tags) nicht mit echo ausgeben. Nicht HTML in PHP schachteln, sondern andersrum: PHP in HTML, d.h. nur die Daten mit PHP ausgeben.

          Dabei sollten im Ausgabeteil keine geschweiften Klammern auftreten, sondern die alternative Syntax für Kontrollstrukturen verwendet werden. Die Gründe dafür kannst du dieser Diskussion mit Dem Martin entnehmen.

          Waren wir an der Stelle nicht vor einem Jahr schon mal?

          Der Code sähe dann so aus:

          <?php if (isset($_POST['abschicken']) && !empty($errors1)): ?>
          	<ul>
          		<li>
          			<?php echo implode('</li><li>',$errors1); ?>
          		</li>
          	</ul>'; 
          <?php endif; ?>
          
          <?php if (isset($_POST['abschicken']) && !empty($errors) && empty($errors1)): ?>
          	<ul>
          		<li>
          			<?php echo implode('</li><li>',$errors); ?>
          		</li>
          	</ul>'; 
          <?php endif; ?>
          

          Äh Moment, immer noch Markup im PHP-Code. Der Trick mit implode() mag den Code kürzer machen, aber nicht besser lesbar. So sieht man, was da wirklich passiert:

          <?php if (isset($_POST['abschicken']) && !empty($errors1)): ?>
          	<ul>
          		<?php foreach ($errors1 as $error1): ?>
          			<li>
          				<?php echo $error1; ?>
          			</li>
          		<?php endforeach; ?>
          	</ul>'; 
          <?php endif; ?>
          
          <?php if (isset($_POST['abschicken']) && !empty($errors) && empty($errors1)): ?>
          	<ul>
          		<?php foreach ($errors as $error): ?>
          			<li>
          				<?php echo $error; ?>
          			</li>
          		<?php endforeach; ?>
          	</ul>'; 
          <?php endif; ?>
          

          Die Benennung der Variablen (errors, errors1) solltest du überdenken und aussagekräftigere Bezeichner wählen.

          Außerdem kann es nicht schaden, die Ausgaben mit htmlspecialchars() abzusichern, selbst wenn sie in diesem Fall vollständig unter deiner Kontrolle sind. Also <?php echo htmlspecialchars($error1); ?>) usw.

          LLAP 🖖

          --
          „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
          1. Tach!

            Markup (HTML-Tags) nicht mit echo ausgeben. Nicht HTML in PHP schachteln, sondern andersrum: PHP in HTML, d.h. nur die Daten mit PHP ausgeben.

            Da fehlt noch die Begründung. Während bei echo '<p>Text</p>'; der Text lediglich ein String ist, ist es bei ?><p>Text</p><?php vom Editor erkennbarer HTML-Code. Es stehen dann alle angebotenen sprachspezifischen Unterstützungen zur Verfügung. Andererseits gibt es mittlerweile auch IDEs, die Code in Text erkennen können und Unterstützung dafür bieten.

            Dabei sollten im Ausgabeteil keine geschweiften Klammern auftreten,

            Da fehlt ein "meiner Meinung nach".

            sondern die alternative Syntax für Kontrollstrukturen verwendet werden. Die Gründe dafür kannst du dieser Diskussion mit Dem Martin entnehmen.

            Im verlinkten und den anschließenden Postings sehe ich nur einen Grund, die angebliche Unterbrechung von Blöcken.

            
            <?php if ($bedingung) { ?>
              <p>Text</p>
            <?php } ?>
            
            <?php if ($bedingung): ?>
              <p>Text</p>
            <?php endif; ?>
            

            Wo ist da der Unterschied? Wird im zweiten Fall der Block etwa nicht unterbrochen? Im ersten Fall findet wenigstens der Klammernpaarmechanismus im Editor noch das Gegenstück. Ich finde das Argument nicht überzeugend.

            dedlfix.

            1. @@dedlfix

              Andererseits gibt es mittlerweile auch IDEs, die Code in Text erkennen können und Unterstützung dafür bieten.

              Anstatt Entwickler dazu zu bringen, vernünftigen™ Code zu schreiben, werden IDEs immer weiter überladen‽ 🤔

              Dabei sollten im Ausgabeteil keine geschweiften Klammern auftreten,

              Da fehlt ein "meiner Meinung nach".

              Das ist nicht nur meine Meinung. Das war schon coding style bei meinem ersten Arbeitgeber in Vollzeit. (Und das war keine unbedeutende Klitsche, sondern StudiVZ.)

              sondern die alternative Syntax für Kontrollstrukturen verwendet werden. Die Gründe dafür kannst du dieser Diskussion mit Dem Martin entnehmen.

              Im verlinkten und den anschließenden Postings sehe ich nur einen Grund, die angebliche Unterbrechung von Blöcken.

              Da ist ein „angebliche“ zu viel.

              
              <?php if ($bedingung) { ?>
                <p>Text</p>
              <?php } ?>
              
              <?php if ($bedingung): ?>
                <p>Text</p>
              <?php endif; ?>
              

              Wo ist da der Unterschied? Wird im zweiten Fall der Block etwa nicht unterbrochen? Im ersten Fall findet wenigstens der Klammernpaarmechanismus im Editor noch das Gegenstück.

              Es geht um die Sicht menschlicher Codeleser.

              Außerdem macht es den Code besser lesbar, wenn beim jeweiligen Ende am Bezeichner erkennbar ist, auf welchen Anfang sich das bezieht – so wie es Entwickler von HTML (End-Tags) auch gewöhnt sind.

              Nehmen wir uns nochmal den Codeschnipsel vor:

              <?php if (isset($_POST['abschicken']) && !empty($errors1)): ?>
              	<ul>
              		<?php foreach ($errors1 as $error1): ?>
              			<li>
              				<?php echo $error1; ?>
              			</li>
              		<?php endforeach; ?>
              	</ul>'; 
              <?php endif; ?>
              

              Da ist sofort zu erkennen, welche Schleife da jeweils geschlossen wird. Bei wiederholtem <?php } ?> ist das nicht gegeben. Einrückungen können verlorengehen.

              LLAP 🖖

              --
              „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
              1. Tach!

                Andererseits gibt es mittlerweile auch IDEs, die Code in Text erkennen können und Unterstützung dafür bieten.

                Anstatt Entwickler dazu zu bringen, vernünftigen™ Code zu schreiben, werden IDEs immer weiter überladen‽ 🤔

                Das grundlegende Problem lässt sich nicht restlos beseitigen. Es wird immer Situationen geben, wo Code in Strings erstellt werden muss. Nur wenige Sprachen haben einen Mechanismus um fremden Code einzubetten. Selbst PHP kann das nur für den Code des umschließenden Dokuments. Beispielsweise SQL-Statements werden immer als String formuliert werden müssen. Es ist also gar nicht möglich, generell Entwickler zu "vernünftigem" Code in diesem Sinne zu bringen, weil das Ziel nicht erreichbar ist. Eine Hilfe für Code in Strings empfinde ich deshalb fernab von überladen.

                
                <?php if ($bedingung) { ?>
                  <p>Text</p>
                <?php } ?>
                
                <?php if ($bedingung): ?>
                  <p>Text</p>
                <?php endif; ?>
                

                Wo ist da der Unterschied? Wird im zweiten Fall der Block etwa nicht unterbrochen? Im ersten Fall findet wenigstens der Klammernpaarmechanismus im Editor noch das Gegenstück.

                Es geht um die Sicht menschlicher Codeleser.

                Das hatte ich schon aus der Diskussion herausgelesen, dass es nicht um PHPs Parsefähigkeiten geht. Aber auch als Mensch sehe ich in der einen Schreibweise keinen mehr oder weniger zusammenhängenden Block als in der anderen.

                Außerdem macht es den Code besser lesbar, wenn beim jeweiligen Ende am Bezeichner erkennbar ist, auf welchen Anfang sich das bezieht – so wie es Entwickler von HTML (End-Tags) auch gewöhnt sind.

                Das Argument ist mir nicht stark genug. Das klappt nur, wenn unterschiedliche Kontrollstrukturen im Spiel sind. Bei verschachtelten if-endif zum Beispiel hat man das gleiche Problem mit der nicht mehr ganz eindeutigen Zuordnung. Erwähnte ich schon den nützlichen Klammernpaaranzeigemechanismus der Editoren? Der hilft mir bei der Zuordnung weitaus mehr als mein eingebauter Parser, der es als anstrengend empfindet, die Übersicht zu behalten, je komplexer der Code wird.

                Nehmen wir uns nochmal den Codeschnipsel vor:

                <?php if (isset($_POST['abschicken']) && !empty($errors1)): ?>
                	<ul>
                		<?php foreach ($errors1 as $error1): ?>
                			<li>
                				<?php echo $error1; ?>
                			</li>
                		<?php endforeach; ?>
                	</ul>'; 
                <?php endif; ?>
                

                Je kleiner der Code in den Blöcken ist, desto geringer macht sich ein Unterschied beider Methoden bemerkbar. Die Schwierigkeit steigt mit der Entfernung zwischen Blockanfang und -ende. Inwieweit da die eine oder die andere Methode und die dabei zur Verfügung stehenden Hilfsmittel besser helfen, vermag ich nicht allgemeingültig zu klären.

                Ich sehe ein größeres Problem in der Geschwätzigkeit des Codes, weil PHP mit <?php ?> oder <?= ?> ziemlich viele Zeichen für den Wechsel zwischen den Kontexten benötigt. Derselbe Code in Razor-Syntax (für C#-Projekte) lässt sich auch mit Klammern statt ausführlichen Blockenden einfach lesen. 4 statt 2 Leerzeichen Einrückung mag auch zur besseren Übersichtlichkeit beitragen.

                @if (isset(_POST["abschicken"]) && !empty(errors1)) {
                    <ul>
                        @foreach (var error11 in errors1) {
                            <li>@error1</li>
                        }
                    </ul>
                }
                

                Meinetwegen auch im Allman-Stil

                @if (isset(_POST["abschicken"]) && !empty(errors1))
                {
                    <ul>
                        @foreach (var error11 in errors1)
                        {
                            <li>@error1</li>
                        }
                    </ul>
                }
                

                Wenn man also Probleme mit der Übersichtlichkeit hat, sollte man vielleicht besser eine insgesamt einfachere Syntax (und damit eine Template-Engine) in die Waagschale werfen.

                dedlfix.

                1. @@dedlfix

                  4 statt 2 Leerzeichen Einrückung mag auch zur besseren Übersichtlichkeit beitragen.

                  Tabs statt Leerzeichen. Dann kann sich jeder seine gewünschte Einrückung selbst einstellen.

                  LLAP 🖖

                  --
                  „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
                  1. Tach!

                    4 statt 2 Leerzeichen Einrückung mag auch zur besseren Übersichtlichkeit beitragen.

                    Tabs statt Leerzeichen. Dann kann sich jeder seine gewünschte Einrückung selbst einstellen.

                    Egal wieviel, die eigentliche Aussage ist, dass eine größere Einrückung pro Verschachtelungsebene ebenfalls schon die Übersichtlichkeit erhöhen kann.

                    dedlfix.