gabi: Mehrere Checkboxen Werte aus DB abfragen funkt nicht!

Hallo,
Ich habe ein Eingabeformular mit mehreren Checkboxen die folgendermaßen aussehen:

<input type="checkbox" name="hersteller[]" value="hersteller_ig1">Hersteller_ig1<br>
              <input type="checkbox" name="hersteller[]" value="hersteller_ig2">Hersteller_ig2<br>
              <input type="checkbox" name="hersteller[]" value="hersteller_ig3">Hersteller_ig3<br>

Jetzt möchte ich in diese Werte aus einer DB auslesen und die entsprechenden datensätze anzeigen lassen. Hab das so versucht:

<?
include("admin/config.php");

$hersteller  = $HTTP_POST_VARS["hersteller"];
mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");

$result=mysql_query("SELECT id,artnr,hersteller,bezeichnung,preis FROM artikel WHERE hersteller=$hersteller");
?>
<table width="600" cellspacing="1" cellpadding="3" bgcolor="#336699">
<TR>
<td align="center" bgcolor="#336699" colspan="7"><font size="3" color="#ffffff"><b>Artikel</b></font><br>
</td>
</tr>
<TR>
<td bgcolor="#ffffff">Art-Nr.</td>
<td bgcolor="#ffffff">Hersteller</td>
<td bgcolor="#ffffff">Bezeichnung</td>
<td bgcolor="#ffffff">Info</td>
<td bgcolor="#ffffff">Preis</td>
<td bgcolor="#ffffff">Stück</td>
<td bgcolor="#ffffff">Warenkorb</td>
</tr>
<?

while($row=mysql_fetch_array($result))
{
$id=$row["id"];
$artnr=$row["artnr"];
$hersteller=$row["hersteller"];
$bezeichnung=$row["bezeichnung"];
$preis=$row["preis"];

?>
<TR>
<TD bgcolor="#ffffff"><? echo $artnr; ?></td>
<TD bgcolor="#ffffff"><? echo $hersteller; ?></td>
<TD bgcolor="#ffffff"><? echo $bezeichnung; ?></td>
<TD bgcolor="#ffffff"> </td>
<TD bgcolor="#ffffff" align="right"><? echo "".number_format($preis,2)." EUR"; ?></td>
<TD bgcolor="#ffffff"> </td>
<TD bgcolor="#ffffff"> </td>
</TR>
<?
}
?>
</table>

Nur das funkt nicht! Kann mir jemand weiterhelfen????
Danke
Gabi

  1. Halihallo gabi

    <input type="checkbox" name="hersteller[]" value="hersteller_ig1">Hersteller_ig1<br>
    $hersteller  = $HTTP_POST_VARS["hersteller"];

    hersteller[] ist nicht hersteller. Lass die [] weg. Zu testzwecken solltest du dir
    immer den Query ausgeben lassen, dann hättest du bemerkt, dass $hersteller nicht
    eingelesen wird.

    Viele Grüsse

    Philipp

    1. Hallo alle zusammen,
      Danke für die zahlreichen Tipps. Hab das so gemacht wie Sven es erklärt hat und es funkt super.

      Danke, danke, danke

      Gabi

  2. Moin

    erstmal müsste es dann heißen '$hersteller = $HTTP_POST_VARS["hersteller[]"]'

    weil die Variable hersteller[] via POST übergeben wird und nicht hersteller..

    vG

    Sascha

    1. Moin!

      Moin

      erstmal müsste es dann heißen '$hersteller = $HTTP_POST_VARS["hersteller[]"]'

      weil die Variable hersteller[] via POST übergeben wird und nicht hersteller..

      Falsch. PHP setzt die [] hinten um in ein Array. In $_POST (bzw. $HTTP_POST_VARS) existiert dann tatsächlich das Element "hersteller" - nur ist es vom Typ Array und enthält den oder die selektierten Werte als Unterelemente.

      Und auf diese einzelnen Werte greift man nicht mit $hersteller zu, sondern z.B. mit $hersteller[1].

      Die SQL-Abfrage wird also derzeit umgesetzt in "WHERE hersteller = 'array'" - und das ist natürlich falsch.

      Die richtige Abfrage muß lauten: "WHERE hersteller = 'hersteller1' OR hersteller = 'hersteller2'" (wahlweise auch mit AND). Dazu muß man das Array noch passend "auspacken". join() ist dafür eine wirklich nette Funktion:

      $sql = "SELECT.... WHERE hersteller = '".join("' OR hersteller = '",$hersteller)."'";
      $result=mysql_query($sql);

      - Sven Rautenberg

      --
      "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
      1. Halihallo Sven

        erstmal müsste es dann heißen '$hersteller = $HTTP_POST_VARS["hersteller[]"]'
        weil die Variable hersteller[] via POST übergeben wird und nicht hersteller..

        Falsch. PHP setzt die [] hinten um in ein Array. In $_POST (bzw. $HTTP_POST_VARS) existiert dann tatsächlich das Element "hersteller" - nur ist es vom Typ Array und enthält den oder die selektierten Werte als Unterelemente.

        Danke. Muss dieses [] im Kontext von HTML stehen, oder beim Auslesen der $_POST?
        Letzteres wäre IMHO sinnbehafteter.

        Viele Grüsse

        Philipp

        1. Moin!

          Danke. Muss dieses [] im Kontext von HTML stehen, oder beim Auslesen der $_POST?
          Letzteres wäre IMHO sinnbehafteter.

          Häh, was, Kontext?

          Wenn du in HTML zwei Input-Felder mit dem Namen "bezeichner[]" definierst, kriegst du in PHP bei register_globals=on _eine_ Variable $bezeichner, die ein Array ist. Du greifst auf die einzelnen Elemente mit $bezeichner[indexzahl] zu. Der Trick mit den [] am Ende funktioniert aber auch in PHP sehr gut: $bezeichner[] = "irgendein wert" fügt ans Ende des Arrays ein neues Element mit dem angegebenen Wert hinzu.

          Du kannst in HTML den Indexwert, der im Array für den value vergeben werden soll, auch mit angeben:
          <input type="hidden" name="bezeichner[5]" value="wert">

          echo $bezeichner[5]; -> gibt wert aus.

          Bei register_globals = off werden alle Variablen, die vorher direkt ansprechbar waren, als Hashindex in $_GET, $_POST oder $_REQUEST zugänglich.

          Also $_POST["bezeichner"] ist identisch mit $bezeichner. Logischerweise ist dann $_POST["bezeichner"][5] identisch mit $bezeichner[5].

          Lass dir mal mit der PHP-Funktion gettype() den Typ der Variablen ausgeben. $bezeichner und $_POST["bezeichner"] sollten jeweils array sein.

          - Sven Rautenberg

          --
          "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
          1. Halihallo Sven

            Danke. Muss dieses [] im Kontext von HTML stehen, oder beim Auslesen der $_POST?
            Letzteres wäre IMHO sinnbehafteter.

            Häh, was, Kontext?

            Yo ;)
            Muss das von dir genannte [] in HTML (als Teil des Formularfeldnamens) oder PHP-Script
            (in $_POST) stehen, sodass die Formulardaten als Array eingelesen werden.

            Wenn du in HTML zwei Input-Felder mit dem Namen "bezeichner[]" definierst, kriegst du in PHP bei register_globals=on _eine_ Variable $bezeichner, die ein Array ist. Du greifst auf die einzelnen Elemente mit $bezeichner[indexzahl] zu. Der Trick mit den [] am Ende funktioniert aber auch in PHP sehr gut: $bezeichner[] = "irgendein wert" fügt ans Ende des Arrays ein neues Element mit dem angegebenen Wert hinzu.
            Du kannst in HTML den Indexwert, der im Array für den value vergeben werden soll, auch mit angeben:
            <input type="hidden" name="bezeichner[5]" value="wert">

            echo $bezeichner[5]; -> gibt wert aus.

            Spricht also alles für die Angabe von [] im HTML-_Kontext_ ;)

            Mich hat dies eben verwundert, da ich folgendes für sinnvoller erachte (was nach deiner
            Beschreibung eben nicht so ist):

            <form ...>
               <input type="checkbox" name="test" value="t1" />
               <input type="checkbox" name="test" value="t2" />
            </form>

            PHP:
            my $array = $_POST["test[]"];

            ich meine, wie die Daten in PHP gehandled werden sollen, sollte meiner Meinung nach nicht
            in der HTML-Ressource definiert werden. Wenn man in PHP ein Array will, sollte man _da_
            ein [] an den Namen des Feldes anhängen, nicht jedoch auf Seiten des Clients.
            Da könnte man ja einfach ein [] hinter das Formularfeld hängen und den Request selber
            senden und so das Script auf dem Server irreführen.

            Viele Grüsse und Danke

            Philipp

            1. Moin!

              Mich hat dies eben verwundert, da ich folgendes für sinnvoller erachte (was nach deiner
              Beschreibung eben nicht so ist):

              <form ...>
                 <input type="checkbox" name="test" value="t1" />
                 <input type="checkbox" name="test" value="t2" />
              </form>

              PHP:
              my $array = $_POST["test[]"];

              Du bist ja Perl-verseucht, igitti-nee!

              ich meine, wie die Daten in PHP gehandled werden sollen, sollte meiner Meinung nach nicht in der HTML-Ressource definiert werden. Wenn man in PHP ein Array will, sollte man _da_ ein [] an den Namen des Feldes anhängen, nicht jedoch auf Seiten des Clients.

              PHP hats eben anders gelöst, was ebenso prima funktioniert. Mit der geschilderten, gedanklichen Brücke mit dem leeren [] kann man sich diese Vorgehensweise eigentlich gut merken.

              Da könnte man ja einfach ein [] hinter das Formularfeld hängen und den Request selber senden und so das Script auf dem Server irreführen.

              Na und? Wenn der User das Formular manipuliert, kann man bei schlechter Programmierung noch viel mehr böse Sachen machen. Dass die Formulareingabe validiert werden sollte (was in diesem Fall eben auch umfassen kann, dass der Variablentyp geprüft wird), kann man ja kaum PHP anlasten.

              - Sven Rautenberg

              --
              "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
              1. Halihallo Sven

                PHP:
                my $array = $_POST["test[]"];

                Du bist ja Perl-verseucht, igitti-nee!

                Stimmt.                 *g*

                Viele Grüsse und Danke für deine Erklärungen

                Philipp

      2. Falsch. PHP setzt die [] hinten um in ein Array. In $_POST (bzw.
         - Sven Rautenberg

        Nö nö!!

        Ich nehme an wir haben uns falsch verstanden! als checkboxname wurde der String 'hersteller[]' verwendet... und dieser wird halt via POST auch so serviert...

        es ist so oder so müssig bezeichnungen mit '[]' zu schreiben

        viele nette Grüße

        Sascha ;-)

        1. Moin!

          Falsch. PHP setzt die [] hinten um in ein Array. In $_POST (bzw.
           - Sven Rautenberg

          Nö nö!!

          Ich nehme an wir haben uns falsch verstanden! als checkboxname wurde der String 'hersteller[]' verwendet... und dieser wird halt via POST auch so serviert...

          Der Browser schickt in der Tat den Namen "hersteller[]" im POST mit - PHP setzt diesen Namen aber um in "hersteller ist ein Array".

          In $_POST steht kein Element "hersteller[]" drin, sondern nur eines, das "hersteller" heißt. Deine diesbezügliche Behauptung ist also falsch.

          es ist so oder so müssig bezeichnungen mit '[]' zu schreiben

          Du scheinst aus dem Perl-Lager zu kommen. In PHP liegt die Sache etwas anders. Du kriegst anders als mit "[]" keine "SELECT multiple"-Felder komplett übertragen, und wie im Beispiel ist es durchaus sinnvoll, auch Checkboxen in ein Array übertragen zu lassen.

          - Sven Rautenberg

          --
          "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
          1. Du scheinst aus dem Perl-Lager zu kommen. In PHP liegt die Sache etwas anders.

            bin ich deswegen ein schlechter Mensch ?! ;)

            halt mich schon geschlossen :)

            VG

            SAscha

  3. Halihallo gabi

    $hersteller  = $HTTP_POST_VARS["hersteller"];
    mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
    mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");

    Zudem ist der Parameter hersteller mehrwertig, da gleicher Name, aber mehrere Werte.
    Demnach sollte $hersteller ein Array sein (?). MySQL erwartet aber ein String. Du musst
    aus dem Array ein String machen (eg. einzelne Werte mit ',' trennen). Du musst jedoch
    darauf achten, dass die Reihenfolge gleich bleibt, denn

    "hersteller1,hersteller2" ist _nicht_ gleich "hersteller2,hersteller1" und in welcher
    Reihenfolge die Parameter ankommen ist abhängig von deiner HTML-Seite und das ist ein
    zu hohes Risiko (HTML Seite ändert => Programm funktioniert nicht mehr richtig).

    Viele Grüsse

    Philipp