milkaman: Array auslesen, das in FORM gefüllt wurde.

Hallo liebe Leser,
habe ein Array Problem:

Die Form wird richtig gefüllt. Das Problem ist, dass im folgenden Teil nicht der Wert von  $row->gebietid ausgegeben wird, sondern $row->gebietid selbst, siehe INSERT...:

INSERT INTO tbl_buecher_fachgebiete (buchid, gebietid) VALUES (8515, $row->gebietid)

statt  $row->gebietid  sollte in diesem Beispiel die Zahl 83 angezeigt werden.

Wer kann mir den entscheidenden Tipp geben. Bin schon seit Stunden an dem Thema dran und kämpfe mich durchs Internet und Foren, finde aber nicht die Lösung.
Herzlichen Dank für jede Unterstützung.

Auszug aus dem Quelltext:

<form action="<?PHP echo $PHP_SELF ?>" method="POST">
<table border="0" cellspacing="3" cellpadding="0">
          <tr>
            <td>
              <select name="gebiet[]" multiple size="5">
                <?PHP
           // fachgebiete auflisten
                while($row=mysql_fetch_object($allegebiete))
                {
                echo '<option value="$row->gebietid" ';
                if (isset($sgebiet[$row->gebietid])) echo "selected";
                echo ">";
                echo $row->gebiet;
                echo "</option>";
                }
                ?>
              </select>
            </td>
            <td valign="top"> <b>Mehrere ausw&auml;hlen</b>: <br>
              Strg-Taste w&auml;hrend
              des Ausw&auml;hlens gedr&uuml;ckt halten </td>
          </tr>
        </table>
</form>

// Fachgebiete aendern
$query=mysql_query("DELETE FROM tbl_buecher_fachgebiete WHERE buchid=$buchid") or die ("alte Gebiete loeschen schlug fehl: ".mysql_error());

if(isset ($_POST[gebiet]))
{
 foreach($_POST[gebiet] as $gebietid)
 {
  $xx="INSERT INTO tbl_buecher_fachgebiete (buchid, gebietid) VALUES       ($buchid, $gebietid)";
        echo "$xx<br>";
        $query=mysql_query("INSERT INTO tbl_buecher_fachgebiete (buchid, gebietid) VALUES ($buchid, $gebietid)")
           or die ("neue Gebiete eintragen schlug fehl: ".mysql_error());
  }
}

  1. Hi!

    <form action="<?PHP echo $PHP_SELF ?>" method="POST">

    Kontextwechsel zur Vermeidung von Sicherheitslücken beachten. Statt htmlspecialchars($PHP_SELF) kann das Attribut action="" auch einfach leer notiert werden, das verweist ebenfalls und ohne HTML/Javascript-Injection-Potential auf die aktuelle URL. Wo kommt außerdem $PHP_SELF her? Verwende die Werte in $_GET, $_POST oder hier $_SERVER bitte direkt, ohne sie umzukopieren oder gar auf Register Globals zu bauen.

    echo '<option value="$row->gebietid" ';

    Anfängerwissen. Bitte beachte den essentiellen Unterschied zwischen in "" und '' eingefassten Strings.

    <td valign="top"> <b>Mehrere ausw&auml;hlen</b>: <br>
                  Strg-Taste w&auml;hrend
                  des Ausw&auml;hlens gedr&uuml;ckt halten </td>

    Verwende eine angemessene Zeichenkodierung, dann kannst du dir das Gehampel mit den Umlaut-Entities sparen.

    $query=mysql_query("DELETE FROM tbl_buecher_fachgebiete WHERE buchid=$buchid") or die ("alte Gebiete loeschen schlug fehl: ".mysql_error());

    Auch hier wieder ein nicht beachteter Kontextwechsel, der das Potential hat, die gesamte Tabelle löschen zu können.

    if(isset ($_POST[gebiet]))
    foreach($_POST[gebiet] as $gebietid)

    Auch wenn PHP großzügig ist, was die Notation von Array-Keys anbelangt, solltest du immer solche String-Werte in Anführungszeichen setzen. (Also, nicht immer, es gibt Ausnahmen.) Wenn du irgendwann mal entdeckt hast, dass ein aus E_ALL gesetztes error_reporting bei Entwickeln eine wertvolle Hilfe beim Finden von Tipp- und anderen Fehlern ist, wirst du danken, wenn nicht auch noch dafür Notice-Meldungen generiert werden.

    Lo!

    1. Hi!

      <form action="<?PHP echo $PHP_SELF ?>" method="POST">

      Kontextwechsel zur Vermeidung von Sicherheitslücken beachten. Statt htmlspecialchars($PHP_SELF) kann das Attribut action="" auch einfach leer notiert werden,

      Cooler Tipp in Sachen 'relative Pfadangaben', echt der Hammer ;)

      Funktioniert aber nur, wenn der Kontechstwexel beachtet wird.

      Hotti

      1. hallo dedlfix,

        vielen Dank für deine Antwort.
        Der Tipp mit den "" und '' war der richtige Weg.
        Funktioniert jetzt wie es soll.

        Die anderen Hinweise werde ich auch beachten.

        Super, freut mich, dass ich so schnell eine Antwort und Lösung bekommen habe. :-)))