Kann mir jemand eine Frage zu Schleifen und "isset" beantworten

Hallo,

ich lerne gerade PHP und wiederhole die Grundlagen, in denen ich Defizite habe. (Also eigentlich alles). Dazu habe ich im Moment 2 Fragen

  1. Problem mit der Logik von Schleifen

Folgende Aufgabe wollte ich lösen:
Eine Zahl zwischen 1 und 10 wird per Zufallsgenerator ermittelt. Sollte die Zahl größer oder gleich 5 sein, soll eine neue Zahl ermittelt werden.

Selbstverständlich funktioniert mein Code nicht. Alles andere hätte mich auch gewundert.

So sieht mein PHP – Code aus:

<?php

        $zufall = rand(1, 10);
        echo "Zufallszahl $zufall<br />";

        while($zufall <= 5) {
            echo "Nach Durchlauf der Schleife: $zufall";
            if($zufall == $zufall > 5 || $zufall <= 10) {
                $zufall = rand(1, 10);
            }
        }


     ?>

Wenn die Zufallszahl z. B. 4 ist, wird mir als Ergebnis ‚‚Nach Durchlauf der Schleife 4 Nach Durchlauf der Schleife 3 Nach Durchlauf der Schleife 2‘‘ angezeigt. Oder es wird nur 1 Zahl angezeigt. Im Prinzip alles was man sich an Zahlen vorstellen kann Was hat das zu bedeuten?
Bin ich hier etwa auf einen Umschlagplatz dunkelster Magie gestoßen?

  1. Einsatz von isset, !empty und $xyz != null

Ich lerne PHP anhand von 3 Büchern. Davon ist Eins ‚‚grottenschlecht‘‘, dass Zweite ‚‚schlecht‘‘ und das Dritte: ‚‚Na ja‘‘.

Der Autor des ‚‚Na ja‘‘ Buches schreibt, das mit isset geprüft wird ob eine Variable vorhanden ist. Mit empty werden Variablen auf ‚‚nicht gesetzt‘‘, ‚‚leer‘‘ oder ‚‚0‘‘ geprüft. Und !emty kehrt das Ganze ins Gegenteil um und kann somit für ‚‚isset‘‘ eingesetzt werden.
Über die Filterfunktionen schreibt er, das der Rückgabewert auch 0 sein kann und ebenfalls für isset angewandt werden kann z. B. so: $xyz != null.

In den weiteren Projekten im Buch werden dann isset, !empty und $xyz != null bunt gewürfelt eingesetzt, ohne weitere Erklärungen.

Super – genau was ich mir gewünscht habe. Fröhlicher Ratespaß mit PHP.

Folgt der Einsatz von isset, !empty und $xyz != null irgendwelchen Regeln oder kann ich auch 'ne Münze werfen? Sollte das mit der Münze zutreffen habe ich noch ein Problem.

Ich habe hier 3 Funktionen zur Auswahl.

Kennt jemand eine Münze mit 3 Seiten? Auf dem Rand bleibt die Münze nämlich nur sehr selten stehen.

Danke für’s Lesen

Christopher

Hi!

Dass dein Code funktioniert:
Eine Frage: Was soll der Code $zufall == $zufall > 5 eigentlich wirklich bedeuten?
Und warum ein ODER zu $zufall<=10? Bei einer Zufallszahl von 1 bis 10 ist die IF-Bedingung IMMER erfüllt.
Was willst Du genau erreichen?

Zu 2.)
isset: Schaut nach, ob es die Variable überhaupt gibt, ob sie irgendwo schon mal vorher deklariert, definiert, o.ä. wurde.
empty: Schaut nach, ob die Variable leer oder 0 oder Leerstring ("") ist.
NULL: Bedeutet, dass die Variable zwar existiert, aber NICHT gesetzt ist.
Beispiel:
($x gar nicht definiert)

  • isset liefert FALSE
  • empty liefert FALSE (weil etwas, was gar nicht existiert, auch nicht empry sein kann)
  • $x==NULL liefert FALSE ($x gibt es nicht, kann also auch nicht NULL sein)
    (und ich bin mir jetzt gar nicht sicher, ob meine empty und NULL-Aussagen wirklich zutreffen)

$x=NULL;

  • isset liefert TRUE
  • empty liefert TRUE
  • $x==NULL liefert TRUE

$x=0 oder $x=""

  • isset liefert TRUE
  • empty liefert TRUE
  • $x==NULL liefert FALSE

$x=1 oder $x=„Sapperlott“

  • isset liefert TRUE
  • empty liefert FALSE
  • $x==NULL liefert FALSE

Dazu kommen dann noch die feinen kleinen Unterschiede, ob es sich bei $x um eine stinkige Variable, ein Array, ein Object oder sonst was handelt - aber das würde den Rahmen hier sprengen.

NULL bedeutet zwar defniert, aber nicht gesetzt (naja, außer auf NULL halt)
isset, empty und NULL-Abfrage liefern drei vollkommen unterschiedliche Sachen.

Zum Beispiel bei Übergabe-„Parametern“ (z.B. bei POST und GET, deswegen auch die Anführungszeichen, weil es sich hier eigentlich um Übergabevariablen und nicht um Parameter handelt) sollte man zuerst mit ISSET prüfen, ob der „Parameter“ überhaupt vorhanden ist, um dann mit EMPTY oder !=NULL (je nach Wunsch - oder weiterführend IS_ARRAY und IS_OBJECT usw.) zu prüfen, ob auch ein Wert mitgegeben wurde.

Ich hoffe, die Verwirrung ist noch größer.

Grüße,
Tomh

PS: Dieses „existiert“, „ist leer“ bzw. „besitzt keinen Wert“ ist in jeder Programmiersprache mehr oder weniger abgebildet, da ist PHP keine Ausnahme - PHP ist nur sehr großzügig.

@Tomh

Hallo und erstmal vielen Dank für die viele Mühe die du dir gemacht hast.

Zu der ersten Aufgabe mit der Schleife:

Leider macht das Programm nicht was ich eigentlich bezweckte.

Per Zufallsgenerator soll eine Zahl zwischen 1 und 10 ermittelt werden . Ist die Zahl zwischen 1 - 4 soll sie angezeigt werden. Sollte die Zahl zwischen 5 - 10 liegen, soll der Zufallsgenerator so oft gestartet werden, bis eine Zahl zwischen 1 - 4 erzeugt wurde. Ich wollte erreichen, dass also nur eine Zahl zwischen 1 - 4 angezeigt werden kann. Das Programm macht alles mögliche, nur nicht das, was ich wollte. Manchmal werden mehrere Zahlen angezeigt. Manchmal nur eine. Und es werde auch die Zahlen 5 - 10 angezeigt.

Somit scheitere ich an der Eigendynamik, der von mir in Gang gesetzten Entwicklungen. :slightly_smiling_face:

Zur 2. Frage

Hier geht es mir umd die Regeln wann isset, !empty (mit dem Ausrufezeichen vorne) $xyz != null benutzt wird.

Mal ein Beispiel aus dem Buch

Überprüfen ob Passwort eingetragen wurde:
if(isset($_POST["passwort"]))

Überprüfen ob E-Müll eingetragen wurde:
if(!empty($_POST["emüll"]))

Überprüfen ob die Zahlen bei einem einfachen Taschenrechner eingetragen wurden:
if($zahl1 !== null && $zahl2 !== null)

Ich möchte gerne verstehen, wann ich welche Funktion benutzen muss.

Es könnte ja sein, dass ich irgendwann mal etwas anderes (vor allen Dingen mal selber) machen möchte als immer nur Passwort - Zugänge konfigurieren, E - Mülladressen abfragen oder mit dem Taschenrechner rumspielen :slightly_smiling_face:

Christopher

Nun, schau genau hin. Deine Schleifenbedingung ist

„Solange die Zufallszahl <=5 ist, führe folgendes aus“

Die Funktion empty() liefert ja True oder False zurück. Mit dem ! kann man das negieren, den Wahrheitswert also umkehren. Der rechte und linke Ausdruck ist hier gleichwertig:

if(empty(...))    <->    if(empty(...) == True)
if(!empty(...))   <->    if(empty(...) == False) 

Das != bedeutet „nicht gleich“. Folgendes ist als auch gleichwertig:

if(!empty(...))   <->    if(empty(...) == False)    <->   if(empty(...) != True) 

Wenn es um Zahlen und Strings geht, willst du meist eine Gleichheit oder Ungleichheit prüfen, also

if($zahl == 42)
if($zahl != 42) 

denn sowas wie if(!42) macht ja wenig Sinn.

zum thema „null“:

Ein PC rechnet nur mit Speicherstellen, an denen Werte liegen. Eine (numerische) Variable ist gleich 0, wenn der Variablen ein Speicherplatz zugewiesen wurde, und dort der Wert 0 steht. Wenn der Variablen kein Speicher zugewiesen wurde, dann hat sie gar keinen Wert, das wird in vielen Programmiersprachen als null dargestellt.

Passent zur aktuellen Lage:

Links gibt es nen Speicherplatz für Papier, der ist aber leer. Rechts ist nicht mal Speicher da.

@sweber

Hallo,

und auch dir vielen Dank für die ganze Mühe.

Der Fehler den ich gemacht habe, wurde korrigiert.
Statt while($zufall <= 5) sieht es jetzt so aus: while($zufall < 5)

Aber trotzdem macht das Programm nicht was es soll.

Darum habe ich die Programmzeilen jetzt mit Kommentaren versehen, damit man erkennt was ich mir dabei gedacht habe.

<?php
               $zufall = rand(1, 10);   // Zufallszahl wird erzeugt
                echo "Zufallszahl $zufall<br />";  // Ausgabe der Zufallszahl zur Kontrolle, damit ich weiß welche es ist

               while($zufall < 5) // Bedingung der Schleife - Wenn die Zufallszahl kleiner als 5 ist, dann...
               {
                echo "Nach Durchlauf der Schleife: $zufall<br />"; // ... soll die Zahl ausgegeben werden
                if($zufall == $zufall >= 5 || $zufall <= 10)  // Falls die Zufallszahl zwischen 5 - 10 ist, dann...
                {
                    $zufall = rand(1, 10);  // ... erneuter Start des Zufallsgenerators
                }
        }

         ?>

Warum werden bei einer ermittelten Zufallszahl zwischen 1 - 4 mehrere Durchläufe der Schleife angezeigt? (Auch wenn gleich die erste Zahl zwischen 1 - 4 lag)

Bei Zahlen zwischen 5 - 10 wird nichts angezeigt, außer meiner Kontrollausgabe der Zufallszahl. Ich hatte es aber so geplant, dass bei Zahlen zwischen 5 - 10 der Zufallsgenerator neu startet. Und das so oft, bis eine Zahl zwischen 1 - 4 erzeugt wird.

Zu meiner 2. Frage.

Diese Frage werde ich einfach mal umformulieren

Ein paar Beispiele aus dem Buch:

Überprüfen ob Passwort eingetragen wurde:
if(isset($_POST["passwort"]))
Warum hat der Autor hier isset verwendet und nicht !empty oder !== null?

Überprüfen ob E-Müll eingetragen wurde:
if(!empty($_POST["emüll"]))
Warum hat der Autor hier !empty verwendet und nicht isset oder !== null?

Überprüfen ob die Zahlen bei einem einfachen Taschenrechner eingetragen wurden:
if($zahl1 !== null && $zahl2 !== null)
Warum hat der Autor hier !== null verwendet und nicht isset oder !empty?

Danke für’s Lesen

Christopher

Weil du es so programmiert hast :wink:

Spiel den Ablauf einfach mal durch, z.B. erster Aufruf von rand liefert 4, zweiter Aufruf liefert 3.

Layer 8-Fehler, der Fehler sitzt vorm Bildschirm!

„while“ bedeutet nicht „wenn“, sondern „solange“
„wenn“ wird durch „if“ implementiert.

Du solltest weiter zurück anfangen zu wiederholen, erstmal einfache Anweisungen, dann Verzweigungen (erst einfache if-then, dann steigern auf if-then-else und dann auch mal versuchen zu verschachteln, switch-case kannst du dir bei der Gelegenheit auch anschauen) und dann Schleifen.

1 Like

@Axurit
Hallo,
und Danke für den Beitrag.

Wenn du mir jetzt noch verrätst wie ich den Ablauf durchspiele wäre ich einen Schritt weiter.

@Christa
Hallo,
und Danke für den Beitrag.

Das waren nur Kommentare, damit man meine Gedankengänge verfolgen kann und keine 1 : 1 Übersetzung vom Englischen ins Deutsche. Ich kann ja auch sagen „Wenn die Ampel Rotlicht zeigt muss ich halten“ oder „Solange die Ampel Rotlicht zeigt muss ich halten“. Im Endeffekt sollte vermutlich jeder wissen, was damit gemeint ist.

Falls es jetzt Kritik an meiner unkorrekten Ausdrucksweise gibt: Selbstverständlich muss es Wechsellichtzeichenanlage heißen und nicht Ampel. Aber der WLA - Ausdruck hat sich noch nicht so ganz in der deutschen Sprache eingebürgert.

Was ist eine if -then Anweisung?

Ich habe ja schon folgendes geschrieben:
Das Buch von der Autorin ist grottenschlecht und von 2019
Die Bücher der beiden Autoren sind schlecht bzw Na ja und von 2018 / 2019
Aber normalerweise hätten die Autoren/in eine if - then Anweisung zumindest erwähnt.

In allen 3 Bücher konnte ich diese Anweisung nicht finden
Selbst in dem Buch der Autorin, die sogar in der hintersten Ecke von PHP rumwühlt, konnte ich so eine Anweisung nicht finden. (Das Problem der Autorin ist, dass sie nicht verständlcih erklären kann. Deshalb hat sie die schlechteste Bewertung).

Leider drehen wir uns im Moment im Kreis

Da ich nicht so der Freund von Rätselraten bin mache ich folgenden Vorschlag:

Wenn jemand die Zeit/Lust hat, dann schreibt er doch mal bitte den korrekten Code der Schleife auf mit einem Kommentar hinter der Programmzeile und was sie bewirkt.

Zu isset usw.

Schreibt da doch einfach mal:

Der/ Die Autorin setzt hier isset ein weil damit … bewirkt wird.

Das könnte mir evtl. schon weiter helfen.

Das macht man, indem man selber den Computer spielt und das Programm Schritt für Schritt selber ausführt. Dabei setzt man dann sinnvoll gewählte Werte für die verschiedenen Variablen ein.

Natürlich hat das keinen Sinn, wenn man gar nicht weiß, was die Anweisungen eigentlich GENAU bedeuten.

Btw. hat es auch keinen Sinn, wenn man jemand höhere Mathematik beizubringen versucht, wenn demjenigen Addition und Subtraktion noch nicht klar sind. Wenn du weißt, was ich damit meine.

Hallo!

Stop!

Programmcode besteht aus Anweisungen, die der Computer genauestens abarbeitet. Um ihn in Worte zu fassen, mußt du sehr präzise und unmissverständlich formulieren. Das darf kein Roman sein, den man so oder so interpretieren kann. Ein „Jeder sollte vermutlich wissen, was gemeint ist“ hat da absolut nichts zu suchen.

Die Wörter „wenn“ und „solange“ werden sprachlich ziemlich gleich behandelt, haben aber zwei Bedeutungen, die hier zu unterscheiden sind:

if($x < 10){
   $x=$x+1
}

bedeutet:
Wenn x kleiner als 10 ist, dann erhöhe den Wert von x um 1. Und zwar genau ein mal!

while($x < 10){
   $x=$x+1
}

Und jetzt möchte ich, daß du folgendes machst:

  • Würfle mit einem Würfel!
  • Sage laut die Zahl, die oben auf dem Würfel steht
  • Solange die Zahl oben auf dem Würfel kleiner als 3 ist, führe immer wieder die folgenden Zeilen aus:
    • Sage laut die Zahl
    • Falls Die Antwort auf die Frage, „Ist die Zahl größer als 3?“ gleich der Zahl ist, oder falls die Zahl kleiner als 6 ist, dann:
      • Würfle erneut

Das ist dein Code. An einer Stelle solltest du dich ziemlich am Kopf kratzen…

2 Like

Jeder Mensch, ja. Aber der Computer macht nur das, was du ihm sagst. @sweber hat das bereits sehr gut erklärt, wie ich das gemeint habe, insofern muss ich das nicht wiederholen. Insbesondere das solltest du dir hinter die Ohren schreiben:

Du hast doch schon if! Normalerweise lautet die Anweisung
if (Bedingung trifft zu) /= wenn Bedingung zutrifft
then (führe Aktion 1 aus) /= dann führe Aktion 1 aus
else (führe Aktion 2 aus) /= sonst führe Aktion 2 aus.

In PHP ist die Syntax eine andere, es passiert aber genau, was ich geschrieben habe. Nur das Wort „then“ wird nicht angegeben, sondern das, was beim Zutreffen der Bedingung passieren soll. else wiederum wird angegeben als Schlüsselwort. Und jetzt sag nicht, dass in keinem der Bücher irgendwas von „else“ stand.

@sweber: woher hast du das Bild? Ich finde das super, weil ich insbesondere bei SQL es nicht immer schaffe, den Schülern den Unterschied klarzumachen, und durch das Bild wird es hoffentlich anschaulicher. Aber ich bräuchte eine Quelle, oder ich nutze das nur als Idee und mache selbst Fotos. :smiley:

1 Like

Obwohl ich @anon43214967 absolut Recht gebe mit

Deswegen schrieb ich auch:

Ich bin ja nicht so, aber du kannst dir trotzdem nichts davon kaufen!

<?php

        $zufall = rand(1, 10); //erzeuge eine Zufallszahl zwischen 1 und 10
        echo "Zufallszahl $zufall<br />"; //gib die erzeugte Zufallszahl aus
        while ($zufall >=5) //solange die Zufallszahl >= 5 ist
		{
		$zufall = rand(1, 10); //erzeuge neue Zufallszahl zwischen 1 und 10
	        echo "Zufallszahl $zufall<br />";//gib erzeugte Zufallszahl aus, mit einem Zeilenumbruch dahinter
}
     ?>

Schamlos im Netz geklaut. Ich hab das schonmal gesehen, und heute findest du das in diversen Variationen in der Bildersuche.

Ich bin 21 und somit volljährig. Mir gegenüber schlagen Sie bitte einen anderen Umgangston an.

Auch wenn Sie sich hiermit die Mühe gemacht haben.

Danke

So wie es aussieht komme ich mit den Mitforisten hier auf keinen gemeinsamen Nenner.

Ich entschuldige mich für die sinn- und nutzlos verschwendete Zeit und Energie.
Aber besser ein Ende mit Schrecken als ein Schrecken ohne Ende.

Aus diesem Grund beende ich das Thema.

Das stört mich nicht. Ich habe das auch nicht in Frage gestellt. Was Programmieren angeht, bist du immer noch grün hinter den Ohren.

Die Mitforisten sind auf einem Nenner, dass du kein Pferd von hinten aufzäumen kannst, ob du es glaubst oder nicht. Aber anders als du haben wir Ahnung von Programmieren, und wenn du nicht auf Erfahrene hören möchtest, dann ist dir auch nicht zu helfen. Bleib halt bei deinen Büchern „grottenschlecht“, „schlecht“ und „na ja“. Viel Spaß damit!

1 Like

Ich erlaube mir trotzdem noch eine Ergänzung zu den Ratschlägen, die du bereits bekommen hast. Wenn man anfängt, eine Programmiersprache zu lernen, sollte man dafür Beispiele nehmen, die immer gleich ablaufen. Nur so kann man nach einer Änderung erkennen, ob sie die erwartetet Wirkung hat. Das schließt die Verwendung von rand aus.

Noch etwas, aber das ist mein ganz persönlicher Standpunkt, das mögen andere ganz anders sehen: Überlege dir nochmals, ob PHP die beste Wahl für dein Vorhaben ist. Die Stärke von PHP liegt beim Erstellen dynamischer Webseiten. Das kann aber auch hinderlich sein, wenn es erst einmal darum geht, grundlegende Programmiertechniken zu lernen. Da ist es unnötiger Ballast, wenn die Testausgaben in korrektem HTML erstellt werden müssen. Wenn das Ziel ist, möglichst schnell PHP-Skripte zu schreiben, die unter einem Webserver ausgeführt werden, dann ist das ok. Wenn es vorrangig darum geht, die Grundlagen des Programmierens zu lernen, dann würde ich Perl oder Python empfehlen, Auf PHP umsteigen kannst du später immer noch.

1 Like

Also ich schon mal nicht. :slight_smile: Ich bin auch nicht dafür, dass man VBA zum Programmierenlernen nimmt, aber das „wissen“ viele Anfänger leider besser.

Mmmhh … Perl ist auch nur eine Skriptsprache. Python kenne ich zwar nicht von der Anwendung her, aber nach dem, was bei Wikipedia darüber steht, würde ich bestenfalls Python und nicht Perl als „Ersatz“ für PHP nehmen. Es spricht aber auch nichts gegen eine „klassische“ Programmiersprache.

1 Like

Dieses Thema wurde automatisch 36 Stunden nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt.