W.: Undefined variable/index beim Abschicken.

<?php  
include 'init.php';  
 if (!isset($_POST['submit'])) {  
  $select = ("SELECT pointcategoryid,name  
  FROM pointcategory  
  INNER JOIN  
  pointcategoryrank");  
  $query = mysql_query($select);  
?>  
  <html>  
  <body>  
  <form action="pointcategoryadd.php" method="post">  
  <table border="0" cellpadding="3" cellspacing="0">  
  <tr>  
   <td align="right"><b>Name/Description:</b></td><br>  
   <td><textarea class="Feld" size="20" name="name" maxlength="55" rows="10" cols="50"></textarea></td>  
  </tr>  
  <tr>  
  <td align="right"><b>Add points:</b></td><br>  
  <td>  
  <?php  
  $select = ("SELECT rank,points  
  FROM pointcategoryrank");  
  $query = mysql_query($select);  
  $points = mysql_fetch_array($query);  
  $rank = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);  
  foreach ($rank as $key => $rank) {  
  echo "<b>$rank</b>&nbsp;<input name='.$points.' class='Feld' size='4' maxlength='4'><br>";  
  }  
  echo "</td>";  
  echo "</tr>";  
  echo "<tr>";  
  echo " <td align='right'>";  
  echo " <td><input type='submit' name='submit' value='Submit' /></td>";  
  echo "</tr>";  
  echo "</form>";  
  echo "</html>";  
  }  
  if (isset($_POST['submit'])) {  
  mysql_query("INSERT INTO pointcategory  
  (name)  
  VALUES  
  ('$_POST[name]')") or die (mysql_error());  
  mysql_query("INSERT INTO pointcategoryrank  
  (rank, points)  
  VALUES  
  ('$rank', '$_POST[points]')") or die (mysql_error());  
  }  
  
  ?>

Hallo!
Also, ich will für jeden Rang eine bestimmte Punktzahl eingeben, die dann in die Datenbank übertragen werden soll.
Als Fehlermeldung kommt:
Notice: Undefined variable: rank in pointcategoryadd.php on line 47

Notice: Undefined index: points in pointcategoryadd.php on line 47
Das ist die Zeile nach dem "VALUES".

Ich habe probiert die Variable mit isset zu kontrollieren und falls sie nicht existiert zu erstellen, jedoch ging das auch nicht, sondern erzeugte eine weitere Meldung.

Tabellenstruktur:
Tabelle "pointcategory":
pointcategoryid int(5) autoincrement
name varcha(55)

Tabelle "pointcategoryrank":
pcid int(5) autoincrement
rank int(11)
points int(11)

  1. Mahlzeit W.,

    mysql_query("INSERT INTO pointcategory
      (name)
      VALUES
      ('$_POST[name]')") or die (mysql_error());
      mysql_query("INSERT INTO pointcategoryrank
      (rank, points)
      VALUES
      ('$rank', '$_POST[points]')") or die (mysql_error());

    Wieso zeigst Du nicht einfach nur die relevanten Code-Zeilen?

    Als Fehlermeldung kommt:
    Notice: Undefined variable: rank in pointcategoryadd.php on line 47

    Dann hast Du die genannte Variable wohl nicht initialisiert.

    Notice: Undefined index: points in pointcategoryadd.php on line 47
    Das ist die Zeile nach dem "VALUES".

    Du weißt schon, wie man in PHP auf assoziative Arrays zugreift?

    Ich habe probiert die Variable mit isset zu kontrollieren und falls sie nicht existiert zu erstellen, jedoch ging das auch nicht, sondern erzeugte eine weitere Meldung.

    Die da lautet? Und wie sah Dein Versuch aus?

    Tabellenstruktur:
    Tabelle "pointcategory":
    pointcategoryid int(5) autoincrement
    name varcha(55)

    Tabelle "pointcategoryrank":
    pcid int(5) autoincrement
    rank int(11)
    points int(11)

    Das ist vollkommen irrelevant - Du hast ein PHP-Problem.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo. Das es ein PHP Problem ist habe ich ja bereits erkannt. Deswegen landete dieser Thread auch dort ;)

      if (isset($_POST['rank'])) $rank = $_POST['rank'];

      1. Mahlzeit W.,

        Hallo. Das es ein PHP Problem ist habe ich ja bereits erkannt. Deswegen landete dieser Thread auch dort ;)

        Dann brauchst Du aber nicht die Felder Deiner Tabellen zu benennen ... :-)

        if (isset($_POST['rank'])) $rank = $_POST['rank'];

        1. Warum das Umkopieren? Das verschleiert nur die Herkunft der Werte und vermindert dadurch u.U. die Sicherheit Deines Skripts.

        2. Und was ist, wenn kein entsprechender POST-Parameter übergeben wurde? Dann existiert gar keine Variable $rank? Vielleicht solltest Du zu Debug-Zwecken Dir mal direkt vor der entsprechenden Verwendung in der Abfrage den Inhalt der Variablen ausgeben lassen ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hallo,

          Ich habe jetzt mit print $rank und $_POST['points'] ausgeben wollen. Ergebnis:

            
          print 'rank '.$rank.'';  
          print 'points '.$_POST['points'].'';
          
          rank 16  
          Notice: Undefined index: points in pointcategoryadd.php on line 40  
          points 
          

          Das heißt also er hat irgendwie 16 in Rank, obwohl zu dieser Stelle noch gar nichts eingegeben worden ist.

          1. Mahlzeit W.,

            print 'rank '.$rank.'';
            print 'points '.$_POST['points'].'';

            
            >   
            > ~~~php
            
            rank 16  
            
            > Notice: Undefined index: points in pointcategoryadd.php on line 40  
            > points 
            
            

            Das bedeutet, die Variable $rank hat den Wert 16 und im Array $_POST existiert kein Eintrag mit dem Schlüssel/Index 'points'.

            Das heißt also er hat irgendwie 16 in Rank, obwohl zu dieser Stelle noch gar nichts eingegeben worden ist.

            Das kann sein - dafür kenne ich Deine Anwendung nicht. Aber anscheinend solltest Du dafür sorgen, dass im $_POST-Array auch eine Angabe zu den 'points' enthalten ist. Ist das entsprechende Formularelement evtl. deaktiviert?

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Schönen Abend,

              deaktiviert habe ich zumindest wissentlich nichts. Ich würde einfach schätzen, dass er 16 nimmt, da dieses das letzte Feld ist welches mit der foreach Schleife erstellt wird:

                $rank = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);  
                foreach ($rank as $key => $rank) {  
                echo "<b>$rank</b>&nbsp;<input name='.$points.' class='Feld' size='4' maxlength='4'><br>";  
                }
              

              Sodass er halt den letzten Wert als $rank übernimmt und ihn überträgt und die anderen womöglich überschreibt.

              Kann man das dann so umstellen, dass man soetwas wie ein "foreach INSERT INTO" macht?

              1. Hallo

                ... Ich würde einfach schätzen, dass er 16 nimmt, da dieses das letzte Feld ist welches mit der foreach Schleife erstellt wird:

                $rank = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);

                Dass man dies bequem mit range erledigen kann, ist dir noch nicht untergekommen? Mal'n bisschen im Manual stöbern! ;-)

                foreach ($rank as $key => $rank) {

                echo "<b>$rank</b>&nbsp;<input name='.$points.' class='Feld' size='4' maxlength='4'><br>";
                  }

                
                > Sodass er halt den letzten Wert als $rank übernimmt und ihn überträgt und die anderen womöglich überschreibt.  
                  
                Natürlich überschreibt er das Array, wenn du sagst, dass das Array und in der Schleife die Variable für den jeweiligen Wert den selben Namen -nämlich $rank- zu haben haben.  
                  
                
                > Kann man das dann so umstellen, dass man soetwas wie ein "foreach INSERT INTO" macht?  
                  
                Was denn nun schon wieder für'n INSERT?  
                  
                Tschö, Auge  
                
                -- 
                Die deutschen Interessen werden am Liechtenstein verteidigt.  
                  
                [Veranstaltungsdatenbank Vdb 0.2](http://termindbase.auge8472.de/)
                
                1. Moin,

                  oh, von Range wusste ich tatsächlich noch nichts ;) Danke.

                  Wie mache ich es denn am Besten, dass es nicht permanent den gleichen Namen hat. Sondern von 1 bis 16?

                  Da ich Range nicht kannte, dachte ich jetzt müsste man jeden Wert einzeln in die DB einfügen.

                  Was mich mit der Strukturierung verwirrt hat, ist halt das ich ja den foreach Teil als HTML String ausgebe. Und der muss ja dann auch an der richtigen Stelle sein. Ich werde den HTML Teil dann nach ganz hinten setzen.

              2. Mahlzeit W.,

                Sodass er halt den letzten Wert als $rank übernimmt und ihn überträgt und die anderen womöglich überschreibt.

                Abgesehen von dem, was Auge schrieb: Du solltest Dein Skript vielleicht etwas besser strukturieren: EVA-Prinzip ... erst Parameter entgegennehmen und überprüfen, dann verarbeiten und erst zum Schluss die HTML-Ausgabe aufbereiten und durchführen.

                Kann man das dann so umstellen, dass man soetwas wie ein "foreach INSERT INTO" macht?

                ?

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|