Mehrere Checkboxen Werte aus DB abfragen funkt nicht!
gabi
- datenbank
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
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
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
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
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
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
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
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
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
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
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 ;-)
Moin!
Falsch. PHP setzt die [] hinten um in ein Array. In $_POST (bzw.
- Sven RautenbergNö 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
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
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