Ankündigung

Einklappen
Keine Ankündigung bisher.

variable wird nicht übergeben: (methode='post ---> '$_POST)

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • variable wird nicht übergeben: (methode='post ---> '$_POST)

    Hi,

    ich habe da eine kleine Herausforderung, welche an meine Frustgrenze treibt, und so dachte mir, dass mir hierbei online vielleicht geholfen werden kann....
    Unter Umständen bin ich ja einfach nur betriebsblind und sehe den möglicherweise offensichtlichen Fehler einfach nicht.

    da ich ich zum ersten mal in einem Form um Hilfe bitte versuche ich das ganze übersichtlich darzustellen, wenn mir dies nicht gelingt.... nun ich bitte wohl vorher schon mal um Vergebung.... =)
    natürlich bin für Kritik und Anregungen hierzu offen, hilft mir vielleicht später mal bei neuen Herausforderungen.

    aber nun zum eigentlichen....

    die Situation:

    Ein Kollege und ich, haben uns daran gemacht ein kleinen Browsergame zusammenzustellen und haben uns von daher fleißig ans programmieren gemacht

    Das Problem:

    nun....es will nicht wie es soll.... klar sonst würde ich ja hier keinen Beitrag erstellen =)
    das Problem ergibt sich im Ingameshop

    es gibt eine Datenbank mit den Items im Shop (bisher nur Behilfsobjekte, damit eben die Funktiionalität der Seite selbst geprüft werden kann,.... )
    das ganze soll am ende in einer Tabelle dargestellt werden,(das klappt soweit auch ganz gut) und der Spieler soll auswählen können welches Item Er/Sie wie oft kaufen möchte:

    dazu wird mit den daten der mySQL-datenbank einfach eine Tabelle generiert und befüllt:

    PHP-Code:
    <?php
    echo "<p align='right'>Gold:".$user['gold']."</p>";
    ?>
    <table type='table'>
    <tr>
        <th>#</th>
        <th>Objekt</th>
        <th>Beschreibung</th>
        <th>Preis</th>
        <th></th>
        <th>Anzahl</th>
    </tr>
    <tr><td><br></td></tr>
    <?php 
    $statement 
    $pdo->prepare("SELECT * FROM shop_item_list ORDER BY id");
    $result $statement->execute();
    $count 1;
    while(
    $row $statement->fetch()) {
        echo 
    "<tr>";
        echo 
    "<td>".$row['id']."</td>";
        echo 
    "<td>".$row['item_name']."</td>";
        echo 
    "<td>".$row['item_info']."</td>";
        echo 
    "<td id='preis_".$count."' align='right'>".$row['item_preis']."</td>";
        echo 
    "<td>Gold</td>";
        echo 
    "<td><form><input id='anzahl_".$count."' type='number' value='0' min='0' max='99' method='post' action='Ausrüstungsladen.php' name='anzahl_".$count."'></input></form></td>";
        
    $count++;
        echo 
    "</tr>";
    }
    ?>
    <tr>
        <td></td>
        <td></td>
        <td>Preis Gesamt:</td>
        <td id='kaufpreis'></td>
        <td>
        <td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td>
    ......

    </table>
    soweit alles kein Problem.....
    der Spieler bekommt die Items aufgelistet, kann hinter jedem Item angeben wie viele er möchte ect.

    der aktuelle Gesamtpreis aller ausgewählten Objekt inkl. der Beachtung deren Anzahl wird mittels js problemlos angezeigt.... auch hier kein Problem.

    jetzt soll aber natürlich der Gesamtpreis der waren von der virtuellen Geldbörse des Spieler abgezogen werden.
    und hier kommen wir auch schon zum Problem:
    das <input>-Feld in der die anzahl der gewünschten Items soll diese mittels POST weitergeben für eine spätere Bearbeitung im Script:

    PHP-Code:
    ....
        echo 
    "<td><form><input id='anzahl_".$count."' type='number' value='0' min='0' max='99' method='post' action='Ausrüstungsladen.php' name='anzahl_".$count."'></input></form></td>";
    ..... 
    die Auswertung erfolgt wiederum in einer schleife, die dann alles zusammenrechnet:

    PHP-Code:
    .....
                    while(
    $row $statement->fetch()) {
                        
    $anzahlx=$_POST['anzahl_'.$count];
                        
    $preisx=$row['item_preis'];
                        
    $preis=($preis+($anzahlx*$preisx));
                        
    $count++;

                    }
    ..... 
    Hierbei soll $preis am ende den Gesamtwert der zu erwerbenden waren beinhalten.

    aber anscheinen will er meine variable nicht übertragen, hierbei kommt im folgenden immer folgender Fehler angezeigt: (unter Umständen erst nach dem klicken des kaufen-Buttons)
    Code:
    Notice: Undefined index: anzahl_1 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
    
    Notice: Undefined index: anzahl_2 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
    
    Notice: Undefined index: anzahl_3 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
    
    Notice: Undefined index: anzahl_4 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
    
    Notice: Undefined index: anzahl_5 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
    
    Notice: Undefined index: anzahl_6 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
    klar... mehrfach durch die schleife halt....

    die eigentlich zu übergebende variablen aus der oberen generierten Tabelle: $anzahl_x werden als undefined index ausgegeben.....

    natürlich haben wir versucht den Fehler einzugrenzen.... die Funktion selbst funktioniert einwandfrei:
    mit folgender Änderung der unteren schleife(zu Testzwecken ausprobiert)
    PHP-Code:

    .....
                    while(
    $row $statement->fetch()) {
                        
    $anzahlx=1;
                        
    // $anzahlx=$_POST['anzahl_'.$count];  ---------------- (auskommentiert für den test)
                        
    $preisx=$row['item_preis'];
                        
    $preis=($preis+($anzahlx*$preisx));
                        
    $count++;

                    }
    ..... 
    ... läuft das ganze genau so ab wie man es erwarten würde, keine Fehlermeldungen..... nichts....es arbeitet genau wie wir uns das vorgestellt haben
    (nur mit dem Schönheitsfehler halt, dass die angaben des users- was die anzahl der gewünschten items angeht- ignoriert werden und von jedem Item einfach 1 gekauft wird,,,)

    ...hufff....
    ist doch mehr text geworden als gedacht....
    hoffe das mir weitergeholfen werden kann.
    PS.:
    im Anschluss mal besser noch das gesamte script der seite: (der relevane teil)

    PHP-Code:

    <div class="panel panel-default" id='div'>
    <?php
    echo "<p align='right'>Gold:".$user['gold']."</p>";
    ?>
    <table type='table'>
    <tr>
        <th>#</th>
        <th>Objekt</th>
        <th>Beschreibung</th>
        <th>Preis</th>
        <th></th>
        <th>Anzahl</th>
    </tr>
    <tr><td><br></td></tr>
    <?php 
    $statement 
    $pdo->prepare("SELECT * FROM shop_item_list ORDER BY id");
    $result $statement->execute();
    $count 1;
    while(
    $row $statement->fetch()) {
        echo 
    "<tr>";
        echo 
    "<td>".$row['id']."</td>";
        echo 
    "<td>".$row['item_name']."</td>";
        echo 
    "<td>".$row['item_info']."</td>";
        echo 
    "<td id='preis_".$count."' align='right'>".$row['item_preis']."</td>";
        echo 
    "<td>Gold</td>";
        echo 
    "<td><form><input id='anzahl_".$count."' type='number' value='0' min='0' max='99' method='post' action='Ausrüstungsladen.php' name='anzahl_".$count."'></input></form></td>";
        
    $count++;
        echo 
    "</tr>";
    }
    ?>
    <tr>
        <td></td>
        <td></td>
        <td>Preis Gesamt:</td>
        <td id='kaufpreis'></td>
        <td>
        <td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td>
        <?php
            
    //prüfe ob Geld reicht, wenn ja kaufe ware,
        
    ?>
        <form method='POST' action='Ausrüstungsladen.php'>
        <input type='submit' name='abschicken' value='Kaufen'>
        </form>
                <?php
            $statement 
    $pdo->prepare("SELECT * FROM shop_item_list ORDER BY id");
            
    $result $statement->execute();
                
    $preis=0;
                
    $count=1;
                if(isset(
    $_POST['abschicken'])) {

                    while(
    $row $statement->fetch()) {
                        
    //$anzahlx=1;
                        
    $anzahlx=$_POST['anzahl_'.$count];
                        
    $preisx=$row['item_preis'];
                        
    $preis=($preis+($anzahlx*$preisx));
                        
    $count++;

                    }



                    if(
    $preis>$user['gold']){
                        echo 
    "Du hast nicht genug Gold";
                        echo
    "<a href='Ausrüstungsladen.php'>Zurück zum Shop</a>";
                    }
                    else {
                    
    $statement $pdo->prepare("UPDATE users SET gold=gold-'$preis'");
                    
    $result $statement->execute();
                    echo 
    "Vielen Dank für Ihre Einkauf. Beehren Sie uns bald wieder!";
                    }
                }
            
    ?>
        </td>
    </tr>

    </table>
    <script type='text/javascript'>
        <?php
        $countmax
    =$count;
        
    ?>


        document.getElementById('div').onclick=function(){
            <?php
            $count
    =1;
            while(
    $count<$countmax){
                echo 
    "var vpreis_".$count."= document.getElementById('preis_".$count."').innerHTML;";
                echo 
    "vpreis_".$count."=(parseInt(vpreis_".$count."));";
                echo 
    "console.log(vpreis_".$count.");";
                echo 
    "var vanzahl_".$count."=document.getElementById('anzahl_".$count."').value;";
                echo 
    "console.log(vanzahl_".$count.");";
                echo 
    "vanzahl_".$count."=(parseInt(vanzahl_".$count."));";
                echo 
    "console.log(vanzahl_".$count.");";
                echo 
    "var kosten_".$count."= vpreis_".$count."*vanzahl_".$count.";";
                
    $count++;
            }
            echo 
    "var gesamtpreis=0;";
            
    $count=1;
            while(
    $count<$countmax){
                echo 
    "gesamtpreis=gesamtpreis+kosten_".$count.";";
                
    $count++;
            }
            echo
    "document.getElementById('kaufpreis').innerHTML=gesamtpreis + ' Gold';"
            
    ?>
        }

    </script>

    </div>


  • #2
    Moin, wilkommen im forum. Du suchst:
    https://php-de.github.io/jumpto/affenformular/
    https://php-de.github.io/#debugging

    Durchnummerierte variablen sind meist nicht so toll.
    übergebe doch ein array um das dann mit einer schleife abzufragen.

    und versuche doch html und php zu trennen, so liest sich das echt schwer.

    Kommentar


    • #3
      Auch das JavaScript ist grässlich.
      JS bietet die Möglichkeit alle Input-Felder eines gewissen Typs (oder mit einer gewissen Klasse) abzugrasen und die dann zusammenzuzählen. JS gehört in separate Dateien und sollte nichts generiertes enthalten. Du generierst da X-Mal denselben Code.

      Zum eigentlichen Problem.
      PHP-Code:
      <form method="post">
        <
      input type="text" name="daten">
      </
      form>

      <
      form method="post">
        <
      input type="submit">
      </
      form
      Wenn du jetzt hier den Submit-Button drücken würdest, würde das Text-Feld nicht übertragen werden, das sind unterschiedliche Formulare. Und wenn ich das richtig sehe hast du einen solchen Aufbau. Submit überträgt nur das Formular in welchem es sitzt.

      Und das Stichwort EVA ist in der Programmierung halt schon wichtig. Je mehr du programmierst desto mehr wirst du fluchen wenn du es nicht einhältst.

      Kommentar


      • #4
        Neben dem was die anderen schon schrieben:

        Zitat von Franjo Beitrag anzeigen
        PHP-Code:
        echo "<td><form><input id='anzahl_".$count."' type='number' value='0' min='0' max='99' method='post' action='Ausrüstungsladen.php' name='anzahl_".$count."'></input></form></td>"
        Du überträgst nichts per method="post". method- und action-Attribute gehören in <form>, nicht in <input> - das hätte dir ein Validator auch verraten.

        Kommentar


        • #5
          Notice: Undefined index: anzahl_1 in C:\xampp\htdocs\Ausrüstungsladen.php on line 89
          Und du erzeugst eine FORM pro Feld.
          Leg die Form um alle Felder (eg. um die Tabelle), wenn du alle Felder in einem Request haben möchtest.
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            <p align='right'>
            und
            <table type='table'>

            Wo lernt man diese falschen Schreibweisen?
            https://developer.mozilla.org/en-US/.../Element/table

            und das hätte dir ein Validator auch verraten.

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              [COLOR=#000000]...

              und das hätte dir ein Validator auch verraten.
              Aber ist es denn nicht so, daß die Validierung über eine Validator voraussetzt, daß die Site bereits veröffentlicht ist? Oder gibt es auch Validatoren für Code, der auf lokalen Servern (Localhost) liegt? Wahrscheinlich mal wieder eine dumme Frage...

              Kommentar


              • #8
                Du kannst zB: auf der W3C Seite den kompletten Quellcode via Copy & Paste einfügen und testen. https://validator.w3.org/ -> Dritter Reiter oben.

                Und/Oder es gibt für den Browser Addons, die du auch lokal verwenden kannst. zB: https://addons.mozilla.org/de/firefo...tml-validator/
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Zitat von Alf2016 Beitrag anzeigen
                  Aber ist es denn nicht so, daß die Validierung über eine Validator voraussetzt, daß die Site bereits veröffentlicht ist?
                  Nein. Man kann auch Dateien zum Prüfen hochladen (Opera konnte das sogar mal direkt per Menü) oder einfach den Quelltext dort reinkopieren.

                  Kommentar


                  • #10
                    zunächst mal vielen vielen dank fürs Feedback
                    hat mir auf jeden Fall weitergeholfen und bewirkt, dass genannte Herausforderung bewältigt werden konnte *yeahhhh*

                    im einzelnen:

                    Zitat von jonas3344 Beitrag anzeigen
                    PHP-Code:
                    <form method="post">
                    <
                    input type="text" name="daten">
                    </
                    form>

                    <
                    form method="post">
                    <
                    input type="submit">
                    </
                    form
                    Wenn du jetzt hier den Submit-Button drücken würdest, würde das Text-Feld nicht übertragen werden, das sind unterschiedliche Formulare. Und wenn ich das richtig sehe hast du einen solchen Aufbau. Submit überträgt nur das Formular in welchem es sitzt.

                    Und das Stichwort EVA ist in der Programmierung halt schon wichtig. Je mehr du programmierst desto mehr wirst du fluchen wenn du es nicht einhältst.

                    @jonas3344
                    vielen dank für die Erklärung des Problems, damit kann ich den Fehler in Zukunft auf jeden Fall vermeiden. Macht natürlich keinen Sinn mehrere <Form>-Tags zuöffnen, und nur einen zu submitten.....
                    --> Definitiv mein Versagen.... das wir aber auch zu zweit nicht gefunden haben- eigentlich fast schon peinlich.....

                    Zitat von lstegelitz Beitrag anzeigen

                    Und du erzeugst eine FORM pro Feld.
                    Leg die Form um alle Felder (eg. um die Tabelle), wenn du alle Felder in einem Request haben möchtest.
                    lstegelitz
                    dein Vorschlag war die letztendliche Lösung, hab die gesamte Tabelle in ein einzigen großes <form>-Tag gelegt und damit das ganze grundlegend zum laufen gebracht =)

                    großßen großen dank auch an @hausl
                    der Hinweis mit dem Validation ist echt hilfreich, wird in Zukunft den einen oder anderen Fehler vermeiden können ; )

                    PS.:
                    vielen dank auch an die anderen, für ihre Hinweise =)

                    Kommentar


                    • #11
                      Zitat von hausl Beitrag anzeigen
                      Du kannst zB: ...
                      Danke.

                      Kommentar

                      Lädt...
                      X