Bernd: foreach anpassen

Hallo,

ich lass ein select dynamisch füllen

<option value="">-- Bitte wählen --</option>
<?php 
$projektstatus = projektstatus($mysqli);
foreach($projektstatus as $array){ ?>
<option value="<?php echo $array['code'];?>"<?php echo ($status == $array['code'] ? "selected" : "");?>><?php echo $array['titel'];?></option>
<?php } ?>

Jetzt gibt es eine Variable

$erlaubeBestellung

diese hart startmäßig den Wert 1. Wenn während der Bestellung ein Fehler auftritt hat diese den Wert 2 damit wird der Bestellvorgang erst einmal abgebrochen. Ich möchte jetzt wenn Wert 2 vorhanden ist, einige Status nicht mit anzeigen. Ist dieses direkt möglich oder muss ich dafür eine neue Funktion schreiben und diese dann austauschen?

Die Funktion schaut so aus

    function projektstatus($mysqli) {
        $stmt = $mysqli->prepare("
                    SELECT id, code, titel, sort, farbe, s_class 
                    FROM projektstatus 
                    ORDER by sort ASC ");
        
        $stmt->execute();
        $stmt->bind_result($id, $code, $titel, $sort, $farbe, $s_class);
        $stmt->store_result();
        
        if($stmt->num_rows() >  0) {     
            while ($stmt->fetch()){
                $projektstatus[] = array( 
                    
                    'id'              => $id, 
                    'code'         => $code,
                    'titel'           => $titel,
                    'sort'          => $sort,
                    'farbe'       => $farbe,
                    's_class'     => $s_class
                );
            }
            return $projektstatus;
            }
    }
  1. Hi,

    wenn ich das in diesem Schlitzcode (Ausschnitt aus dem Ganzen) richtig sehe, fehlt zumindest die Kontextbehandlung in Orientierung auf die HTML-Ausgabe.

    Ich bin übrigens kein Freund dieser gemischten Ausgabe von PHP und HTML. Die macht das Ganze unübersichtlich.

    Bevor man eine Ausgabe einer SQL-Abfrage in HTML generieren lässt, sollte man außerdem überprüfen, ob die Abfrage überhaupt erfolgreich war. Und dann wäre es sinnvoll, das Ganze in wiederverwendbare Funktionen zu gießen.

    LG

    RoRo

    1. Hallo,

      wenn ich das in diesem Schlitzcode (Ausschnitt aus dem Ganzen) richtig sehe, fehlt zumindest die Kontextbehandlung in Orientierung auf die HTML-Ausgabe.

      ist doch nur nötig wenn ich eine Eingabe von einem User erwarte. Diese Werte kommen direkt aus einem System und können nicht vom User manipuliert werden.

      Ich bin übrigens kein Freund dieser gemischten Ausgabe von PHP und HTML. Die macht das Ganze unübersichtlich.

      Irgendwo muss ich ja mein select zusammenbauen.

      Bevor man eine Ausgabe einer SQL-Abfrage in HTML generieren lässt, sollte man außerdem überprüfen, ob die Abfrage überhaupt erfolgreich war. Und dann wäre es sinnvoll, das Ganze in wiederverwendbare Funktionen zu gießen.

      Es gibt immer einen Projektstatus, sonst würde das System überhaupt nicht arbeiten, daher ist eine Prüfung nicht von wichtig.

      1. Hallo Bernd,

        wenn ich das in diesem Schlitzcode (Ausschnitt aus dem Ganzen) richtig sehe, fehlt zumindest die Kontextbehandlung in Orientierung auf die HTML-Ausgabe.

        ist doch nur nötig wenn ich eine Eingabe von einem User erwarte. Diese Werte kommen direkt aus einem System und können nicht vom User manipuliert werden.

        Das heißt aber nicht, dass die Werte aus deinem System den Syntaxregeln von HTML entsprechen. Welchen Zeichenvorrat hat denn z.B. das Arrayfeld „titel“, können dort spitze Klammern, das Kaufmanns-Und oder Anführungszeichen auftauchen?

        Viele Grüße
        Robert

        1. Hallo,

          Das heißt aber nicht, dass die Werte aus deinem System den Syntaxregeln von HTML entsprechen. Welchen Zeichenvorrat hat denn z.B. das Arrayfeld „titel“, können dort spitze Klammern, das Kaufmanns-Und oder Anführungszeichen auftauchen?

          nein, da stehen nur Zahlen und - drin.

          1. Hi,

            Das heißt aber nicht, dass die Werte aus deinem System den Syntaxregeln von HTML entsprechen. Welchen Zeichenvorrat hat denn z.B. das Arrayfeld „titel“, können dort spitze Klammern, das Kaufmanns-Und oder Anführungszeichen auftauchen?

            nein, da stehen nur Zahlen und - drin.

            Dann schadet es erst recht nicht, es richtig™ zu machen, also eine vollständige Ausgaberoutine zu erstellen.

            1. Es schadet auch nicht es einfach so zu lassen wie es jetzt ist. HTML und PHP kann und darf ohne Probleme gemischt werden. Wenn du das nicht magst ist es deine Sache!

  2. Hallo Bernd,

    ich lass ein select dynamisch füllen

    <option value="">-- Bitte wählen --</option>
    <?php 
    $projektstatus = projektstatus($mysqli);
    foreach($projektstatus as $array){ ?>
    <option value="<?php echo $array['code'];?>"<?php echo ($status == $array['code'] ? "selected" : "");?>><?php echo $array['titel'];?></option>
    <?php } ?>
    

    drei Hinweise:

    1. Wenn du beim Vergleichen auf Nummer sicher gehen möchtest, verwende drei Gleichheitszeichen: $status === $array['code']
    2. In deinem value-Attribut fehlt das Leerzeichen, falls die Bedingung erfüllt ist.
    3. Es gibt eine Kurzform für <?php echo($var); ?>: <?= $var ?>.

    Viele Grüße
    Robert

    1. Hallo,

      ob ein Leerzeichen zu viel oder zu wenig ist für mein Problem überhaupt nicht relevant genauso ob es eine Kurzschreibweise gibt oder nicht interessiert in diesem Fall ebenfalls niemanden, das gleiche gilt für den Vergleich!

      Alle drei Hinweise haben mit meinem Problem überhaupt nichts zu tun!

      1. Hallo Bernd,

        Alle drei Hinweise haben mit meinem Problem überhaupt nichts zu tun!

        Beachte sie einfach trotzdem.

        Bis demnächst
        Matthias

        --
        Pantoffeltierchen haben keine Hobbys.
        ¯\_(ツ)_/¯
      2. Hallo Bernd,

        ob ein Leerzeichen zu viel oder zu wenig ist für mein Problem überhaupt nicht relevant genauso ob es eine Kurzschreibweise gibt oder nicht interessiert in diesem Fall ebenfalls niemanden, das gleiche gilt für den Vergleich!

        Alle drei Hinweise haben mit meinem Problem überhaupt nichts zu tun!

        vielen Dank für deine freundliche Antwort und entschuldige bitte, dass ich dich auf Dinge jenseits des Tellerrands hingewiesen habe.

        Wenn die Bedingung $status === $array['code'] erfüllt ist, gibt deine foreach-Schleife folgendes Option-Element aus, was eindeutig ungültiger HTML-Code ist ($code steht für den Wert von array['code'], $titel für array['titel']):

        <option value="$code""selected">$titel</option>
        

        Das ist zwar nicht jetzt dein Problem, aber eines deiner nächsten.

        Viele Grüße
        Robert

        1. Hallo,

          wenn ich bei mir in den Quelltext schaue, sehe ich folgendes

          <option value="2afeb8b8f86e17862748b6402da01db6" selected="">unterwegs</option>
          

          ist dieses ungültiger Code?

          Wenn eine Option nicht übereinstimmt wird sehe ich folgendes HTML

          <option value="07bc9a80a0da7031218f1a9514a327c3">offen</option>
          

          ist dieses ungültiger Code?

          Ich sehe keine Fehler

          1. Hallo Bernd,

            wenn ich bei mir in den Quelltext schaue, sehe ich folgendes

            <option value="2afeb8b8f86e17862748b6402da01db6" selected="">unterwegs</option>
            

            Dann guckst Du nicht in den Quelltext, sondern in den Inspektor. selected ist ein boolesches Attribut, sein Wert ist FALSE wenn es nicht angegeben wird und TRUE, wenn man es als selected, selected="" oder selected="selected" angibt.

            In deinem Quellcode dürfte dies stehen:

            <option value="2afeb8b8f86e17862748b6402da01db6"selected>unterwegs</option>
            

            was von Firefox und Chrome verstanden wird und vom W3C Validator nicht bemängelt wird. Von validator.nu aber schon - "no space between attributes".

            Dass vor einem Attributnamen ein Space stehen muss, finde ich tatsächlich gerade in der HTML Spec nicht, es mag aber sein, dass HTML das - als eine SGML-Sprache - einfach voraussetzt.

            Ist ja kein Problem, mach einfach " selected" statt "selected" in dein Programm und gut ist.

            Rolf

            --
            sumpsi - posui - clusi
            1. Wenn der W3C Validator nicht meckert und W3C für den ganzen Krempel verantwortlich ist, dann sollt es passen. Bis jetzt hat kein Browser (IE, Microsoft Edge, Safri, FF und Chrome) gemeckert.

              1. Hallo Bernd,

                Bis jetzt hat kein Browser (IE, Microsoft Edge, Safri, FF und Chrome) gemeckert.

                Dass Browser nicht meckern, hat mit der Qualität des HTML nun gar nichts zu tun.

                Rolf

                --
                sumpsi - posui - clusi
            2. @@Rolf B

              Dass vor einem Attributnamen ein Space stehen muss, finde ich tatsächlich gerade in der HTML Spec nicht

              §8.1.2.1. Start tags

              es mag aber sein, dass HTML das - als eine SGML-Sprache - einfach voraussetzt.

              HTML ist keine SGML-Sprache.

              (Es sei denn, du bist zu schnell durch den Ort gefahren und wurdest vom Blitz getroffen.)

              LLAP 🖖

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

      1. Wenn du beim Vergleichen auf Nummer sicher gehen möchtest, verwende drei Gleichheitszeichen: $status === $array['code']

      Ein typsicherer Vergleich ist kein Garant, irgendwas sicherer oder besser zu machen. PHPs Typkonzept inklusive automatische Konvertierung ist nicht auf Vergleiche beschränkt und einfach nur typsicher zu vergleichen, erspart nicht das Wissen darum. Man sollte das auch nicht gedankenlos vorschlagen, ohne dass man weiß, was für Konsequenzen das für den Rest des Projektes nach sich zieht. Besonders dann nicht, wenn man nicht nach TDD entwickelt und Probleme nicht beim Testlauf auffallen. Es ist vermutlich nicht so, dass Bernd immer genau weiß, welche Typen seine Variablen haben und er die automatische Konvertierung PHPs nutzt, vielleicht vielfach auch unbewusst. Solange kein Problem zu sehen ist, zum Beispiel dass false und 0 zu Verwechslungen führen kann, bringt es keine Punkte, einfach mal so auf typsichere Vergleiche umzustellen.

      dedlfix.

  3. Hallo,

    Du behauptest, es gibt die Variable erlaubeBestellung, zeigst aber keinen weiteren dazu passenden Code. Wo ist das Problem, an geeigneter Stelle eine If-Abfrage zu notieren?

    Dass zum gezeigten Code Kommentare kommen, überrascht nicht wirklich, oder?

    Gruß
    Kalk

    1. Und genau dieses war ja meine Frage, muss ich mit einer IF oder wie ich es genannt habe einer zweiten Funktion arbeiten wo ich dann einfach Ausgabe also Status weg lasse?

      Und was soll ich bei erlaubeBestellung zeigen? Entweder ist $erlaubeBestellung = 1 oder eben $erlaubeBestellung = 2, mehr gibt es dazu nicht.

      1. Hallo,

        sinnvoller wäre ˋerlaubeBestellungˋ als boolsche Variable zu verwenden mit Werten 0/1 bzw. true/false, so dass du mit ˋIf(erlaubeBestellung)ˋ arbeiten kannst.

        Gruß
        Kalk

        Edith meint, ˋBestellungErlaubtˋ wäre als Bezeichnung besser.

        1. Auch hier wie vorhin, es ist doch egal wie ich die Variable intern nennen, das gleiche gilt für den Wert.

          1. Hallo,

            dann schlage ich als Bezeichnung 'rutzliPlutzi' vor…

            Gruß
            Kalk

  4. Da man mich hier einfach nur verarschen möchte oder schlicht weg mobbing betreibt habe ich es ganz einfach gelöst

    <select name="status" id="status" onchange="if (this.value) { this.form.submit(); }" <?php if ($erlaubeBestellung == 0): ?>disabled="true" <?php endif ?> >
    

    Lösch-Abstimmung (3/5)

    Der Beitrag und die folgenden Antworten werden gelöscht.Der angegebene Grund: Der Beitrag ist unkonstruktiv oder provokativ und trägt zu einer Verschlechterung der Stimmung bei.

    1. Ich habe davon schon ein Screenshot gemacht und werde dieses an die öffentlichen Medien weiterleiten, dann sehe die, wie hier vorgegangen wird. Mit eurem Mobbing werdet ihr nicht weit kommen!

      1. Hallo,

        Offensichtlich weißt du nicht, was echtes Mobbing ist. Sei froh!

        Gruß
        Kalk

        1. Hast du eine Ahnung!

      2. Hallo

        Ich habe davon schon ein Screenshot gemacht und werde dieses an die öffentlichen Medien weiterleiten, dann sehe die, wie hier vorgegangen wird. Mit eurem Mobbing werdet ihr nicht weit kommen!

        Ich weiß nicht, was dir jetzt schon wieder querliegt. Da du ähnliche Ankündigungen und Drohungen schon mehrfach ausgestoßen hast, aber daraufhin nie etwas bemerkbares passiert ist, sehe ich entspannt in die Zukunft.

        Mach mal.

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
        1. Bei Mobbing sieht dieses ganz anderes aus und hier wird Mobbing betrieben. Ich habe von diesem ganzen Verlauf Screenshots gemacht!

          Und beim Thema Mobbing ist die Bild-Zeitung ganz scharf. So ein Verein kann ganz schnell seinen e.V. Status verlieren.

          1. Aloha ;)

            Und beim Thema Mobbing ist die Bild-Zeitung ganz scharf. So ein Verein kann ganz schnell seinen e.V. Status verlieren.

            Dir ist bewusst, wofür e.V. steht?

            Offenbar nicht.

            Sonst würdest du vielleicht was über die Gemeinnützigkeit schreiben.

            Aber selbst das wäre substanzlos.

            Also blubber nur weiter.

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
            # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
            1. e.V. steht für eingetragener Verein. Denkst du ich bin blöd? Und gerade ein Verein sollte vom Mobbing absehen oder dieses unterbinden. Aber die Herrschaften hier machen ja nichts, sieht man auch an den Beiträgen die ständig von PL als - gekennzeichnet werden weil den Herrschaften etwas nicht passt. Das und noch viel mehr nennt man Mobbing!

              1. Aloha ;)

                e.V. steht für eingetragener Verein. Denkst du ich bin blöd?

                Nein, das denke ich nicht.

                Ich weiß aber, dass du über deine Aussage nicht nachgedacht hast.

                Sonst würdest du nicht in dem Wissen, dass e.V. eingetragener Verein heißt, irgendwas daherblubbern wo's drum geht einen ominösen e.V.-Status entzogen zu bekommen.

                Das und noch viel mehr nennt man Mobbing!

                Falsch. Das nennst du Mobbing.

                So wie ich das, was du hier tust, „sich zum Obst der Woche machen“ nenne.

                Grüße,

                RIDER

                --
                Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
  5. Hallo Bernd,

    Hinweis vorweg: ich habe vor 2 Stunden angefangen zu schreiben und war zwischendurch weg, daher wusste ich nicht was zwischendurch gelaufen ist.

    Dem Vorschlag von RR kann ich mich nur anschließen - Trennen von Code und HTML macht alles viel lesbarer. Ein Minimum könnte darin bestehen, die Erzeugung des option-Elements auszulagern, eine Erweiterung wäre eine Art „select Widget“, also eine Funktion, die das komplette <select>...</select erzeugt und die nötigen Daten dafür bekommt. Aber das würde zu weit führen...

    Fachlich sprechende Variablennamen sind ebenfalls sinnvoll. $option statt $array zum Beispiel. Die as Variable einer foreach Schleife kann man dagegen schon mal kurz benennen - sofern die Schleife kurz und übersichtlich ist. Auf Grund der frühen Zeilenumbrüche des neuen Forums habe ich meinen Code stärker umgebrochen als sonst.

    $projektstatusliste = liesProjektstatusListe($mysqli);
    
    erzeugeProjektstatusOption([ "code" => "",
                                 "value" => "-- Bitte wählen --" ]);
    
    foreach ($statusliste as $ps)
    {
       if (istProjektstatusSichtbar($ps, $erlaubeBestellung))
       {
          erzeugeProjektstatusOption($ps, $status);
       }
    }
    
    // Dies kommt in die Funktionensammlung
    // Hauptzweck der Funktion ist, das Kuddelmuddel zur Erzeugung 
    // des option Elements aus der Fachlogik herauszuhalten.
    
    function erzeugeProjektstatusOption(
            $projektstatus,
            $aktuellerCode = null
    )
    {
       // Temp-Variablen zur besseren Übersicht.
       // Mutige Coder machen es direkt und bekommen eine
       // Monsterzeile...
       $val = htmlspecialchars($projektstatus['code']);
       $sel = $projektstatus['code'] == $aktuellerCode 
                ? "selected" 
                : "";
       $text = htmlspecialchars($projektstatus['titel']);
    ?>
       <option value="<?=$val?>" <?=$sel?>><?=$text?></option>
    <?php
    }
    
    function istProjektstatusSichtbar(
          $projektstatus,
          $erlaubeBestellung
    )
    {
       if ($erlaubeBestellung == 1)
          return true;
    
       // Darzustellende Codes bei $erlaubeBestellung != 1
       return ($projektstatus['code'] == 1 
            || $projektstatus['code'] == 3 
            || $projektstatus['code'] == 9);
    }
    

    Deine Ausgabeschleife ist damit viel übersichtlicher geworden. Und in der istProjektstatusSichtbar Funktion kannst Du nun übersichtlich die Abfrage einbauen, ob ein bestimmter Code anzuzeigen ist oder nicht.

    Was auch bei der Übersicht hilft, ist <?= ... ?> statt <?php echo ...; ?>. Sage ich Dir sicher nicht zum ersten Mal ;)

    Die Variable $erlaubeBestellung macht mir noch Bauchweh. Zum einen frage ich mich, warum sie die Werte 1 und 2 enthält. Gibt's noch mehr Werte? Wenn nein - verwende TRUE statt 1 und FALSE statt 2. Ich würde sie auch lieber $bestellungErlaubt nennen (was aber meine Einzelmeinung sein dürfte). Mein Code oben wäre dann entsprechend anzupassen...

    Und ich frage mich, ob die Information, dass ein bestimmter Code bei $bestellungErlaubt == FALSE zu verbergen ist, nicht in die Datenbank gehört. Das ist ja eine Eigenschaft eines bestimmten Codes, dass er nur bei erlaubter Bestellung zulässig ist. Das könnte man zu einer Spalte der Tabelle machen, und in istProjektstatusSichtbar diese Spalte überprüfen, wenn Bestellungen nicht erlaubt sind.

    Nimm Dir davon, was Du brauchen kannst.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo,

      (was aber meine Einzelmeinung sein dürfte)

      das mag ich mir garnicht vorstellen…

      Gruß
      Kalk