PDA

Vollstndige Version anzeigen : Problem mit Mehrfach-Auswahl im Formular


flual
19-07-2004, 10:08
Hallo,
ich habe in meinem Formular ein <Select>-Tag eingefgt mit zwei Antwortmgkichkeiten. Es soll dem Benutzer mglich sein auch beide Antworten auszuwhlen. Danach werden beide bzw. nur eines in ein und dem selben Feld der Tabelle in der Datenbank geschrieben. Bei einem AUfruf des Tabelleninhalts, sollen dann beide bzw. nur eines (wenn nur eine Mglichkeit gewhlt worden ist) angezeigt werden.

Formular.php
<select multiple name="bildung[]">
<option value="Schler">Schler</option>
<option value="Student">Student</option>
</select>

Speichern.php
if (empty($bildung[0])) {
echo "<p>Whlen Sie zwischen <b>Student und Schler</b>aus";
}
.
.
.
mysql_query("insert tabelle(bildung) values('bildung[$i]');

Anzeige.php
while ($dsatz = mysql_fetch_assoc($res))
{
echo "<td>" . $dsatz["bildung[$i]"] ."</td>";


Wo ist der Fehler?
Danke

feuervogel
19-07-2004, 10:12
willkommen im forum!

diese daten werden mittlerweile ber das array $_POST betragen.

$bildung = $_POST[ 'bildung' ];

if (empty($bildung[0])) {
echo "<p>Whlen Sie zwischen <b>Student und Schler</b>aus";
}


des weitern darfst auch du die php-tags benutzen, um deinen code besser lesbar zu machen.

flual
19-07-2004, 10:49
Das heit ich muss bei Speichern.php einfach nur $bildung = $_POST("bildung") eintragen und dann luft das?

feuervogel
19-07-2004, 10:51
jede variable aus deinem formular befindet sich in $_POST

am besten du bastelst dir mal ein formular, trgst daten ein und das script, das beim abschicken aufgerufen wird macht nur

print_r( $_POST );

zweitens schrieb ich, dass $_POST ein array ist, also

$bildung = $_POST("bildung")

wird nix. eckige klammern und einfache anfhrungszeichen.

flual
19-07-2004, 10:59
Ich habe in speichern.php die von Dir angegebene Zeile in meinem Formular ergnzt. Allerdings werden die Werte dabei nicht bertragen. Ich wsste gerne was ich noch tun msste.

Danke

feuervogel
19-07-2004, 11:07
bitte poste deinen jetzigen code. vielleicht auch mal ein wenig mehr.

flual
19-07-2004, 11:13
Formular.php <select multiple name="bildung[]">
<option value="Schueler">Schler</option>
<option value="Student">Student</option>
</select>

speichern.php
$bildung = $_POST['bildung'];
if (empty($bildung[0])) {
echo "<p>Whlen Sie zwischen <b>Student und Schler</b>aus";
}
.
.
.
mysql_query("insert tabelle(bildung) values('$bildung');

Anzeige.php
$res = mysql_query("select * from tabelle");
while ($dsatz = mysql_fetch_assoc($res))
{
echo "<td>" . $dsatz["bildung[$i]"] ."</td>";
}

chris17
19-07-2004, 11:42
Formular.php<select multiple name="bildung[]">
<option value="Schueler">Schler</option>
<option value="Student">Student</option>
</select>
// Willst Du wirklich "multiple"? -> Es ist mglich Schler und Student gleichzeitig zu markieren...


$bildung = $_POST['bildung'];
print_r($bildung); // WICHTIG, TESTAUSGABE -> kommt hier was raus?
if (empty($bildung[0])) {
echo "<p>Whlen Sie zwischen <b>Student und Schler</b>aus";
}
.
.
.
// Obacht, Du versuchst hier ein Array in das Feld `bildung` zu speichern! INTO, " und ) fehlen.
// or die(mysql_error()); ist zu Testzwecken sehr ntzlich
mysql_query("insert INTO tabelle(bildung) values('$bildung[0]')")or die(mysql_error());

flual
19-07-2004, 11:55
Ja, es knnen beide angeklickt werden. Es muss ja nicht Schler und Studnet sein, es kann auch Hund und Katze sein.

flual
19-07-2004, 11:57
Die anderen Werte meiens Formulars werden problemlos in die Tabelle bertragen und knne auch aufgerufen werden. Nur mit dieser spetziellenForm des Formularfeldes habe ich Probleme. Into und )") sind in der mysql enthalten, habe sie nur vergessen mit zu kopieren.

chris17
19-07-2004, 12:01
Was fr ein Format hat `bildung` in der DB-Tabelle?
Bekommst Du bei der Testausgabe was auf dem Schirm?

flual
19-07-2004, 12:48
Die Einstellung von 'bildung' ist VARCHAR(10). Es wird nur 'Array' im Tabellenfeld angezeigt. Ebenso auch ausgedruckt.

chris17
19-07-2004, 14:06
Original geschrieben von flual
Die Einstellung von 'bildung' ist VARCHAR(10). Es wird nur 'Array' im Tabellenfeld angezeigt. Ebenso auch ausgedruckt.
Genau, das hatte ich ja schon geschrieben, da Du ein Array abspeicherst.

Bsp.: "Schueler" u. "Student"
Du sagst ja, da beide Informationen gespeichert werden sollen/knnen.

-> Das Array $bildung ("Schueler","Student") in ein String wandeln, und dann in Tabelle speichern. Nur dann httest Du mehr als VARCHAR(10)!

... oder Du speicherst zwei Datenstze ab, einmal INSERT $bildung[0] und nochmal $bildung[1] usw.

Zum Speichern von Arrays in Tabellen ist un/serialize() (http://de3.php.net/manual/de/function.serialize.php) sehr ntzlich.

xabbuh
19-07-2004, 14:29
Original geschrieben von flual


if (empty($bildung[0])) {
echo "<p>Whlen Sie zwischen <b>Student und Schler</b>aus";
}


Noch etwas: Wenn ich im Formular nur die Mglichkeit Student auswhle, wird er mir auch diese Fehlermeldung anzeigen. Ist das so erwnscht?

flual
19-07-2004, 14:41
Nein, eigentlich ist das nicht so erwnscht.
Ich versuche mal zu berlegen, wie jetzt die drei Skripte aussehen knnen, wenn ich $bildung = $_POST['bildung']; setze. Besonders bei der Anzeige der Array inhalte bin ich sehr unsicher.

xabbuh
19-07-2004, 14:46
Die Speicherung knnte so aussehen:

<?php
$bildung = serialize($_POST['bildung']);
mysql_query("INSERT INTO tabelle (bildung) VALUES ('$bildung')");
?>


Die Ausgabe so:

<?php
while($dsatz = mysql_fetch_assoc($res)) {
$bildung = unserialize($dsatz['bildung']);
if(is_array($bildung)) {
echo "<td>" . explode('<br>', $bildung) . "</td>";
} else {
echo "<td>keine Angaben</td>";
}
}
?>

flual
19-07-2004, 15:30
Ich werde es heute abend ausprobiere.
Ist $_POST tatschlich so wichtig?
Meine anderen Variablen haben den Wert nicht und werden trotzdem problemlos bergeben.

feuervogel
19-07-2004, 16:05
welche php-version? was steht bei dir bei register globals?

wichtig? das gilt ab version 4.1. vor kurzem ist version 5.0 rausgekommen. wenn du also willst, dass scripte nicht nur bei dir daheim laufen, ja, _sehr_ wichtig.

zitat von c4:
[quote]Mit Version 4.1 wurde in PHP ein neues Sicherheitskonzept eingefhrt, welches seit Version 4.2 standardmig aktiviert ist. Seit dem muss man alle bergebenen Variablen mit
$_GET['variable'] - fr Urlparameter
$_POST['variable'] - fr mit method=post versendete Parameter
$_COOKIE['variable'] - fr Cookies
$_REQUEST['variable'] - $_POST, $_GET und $_COOKIE zusammen
$_FILES['variable'] - fr hochgeladene Dateien
$_SERVER['variable'] - fr Servervariablen (z.B. $_SERVER['PHP_SELF'])
$_ENV['variable'] - fr Umgebungsvariablen
ansprechen. Also ehemals $str mit $_GET['str']
Oder Du setzt in der php.ini register_globals auf on. Davon rate ich aber ab.[quote]

flual
19-07-2004, 16:08
Schon klar, ich verwende eben gerade PHP5

feuervogel
19-07-2004, 16:09
dann steht register globals vielleicht auf on? linke mal bitte deine phpinfo...

flual
19-07-2004, 18:51
Es klappt immer noch nicht.
Ich habe meine Variablen alle mit $_POST versehen.
Nun zu meinem Problem, ich habe die Sktipte wie folgt verndert:

speichern.php
$bildung = serialize($_POST["bildung"]);
.
.
.
$bildung = $_POST['bildung'];
if (empty($bildung[0])) {
echo "<p>Whlen Sie zwischen <b>Student und Schler</b>aus";
}
.
.
.
mysql_query("insert into tabelle(bildung) values ('$bildung')");

anzeigen.php
while ($dsatz = mysql_fetch_assoc($res))
{
echo "<tr>";
echo "<td>" . $dsatz["datum"] ."</td>";
$bildung = unserialize($dsatz['bildung']);
if (is_array($bildung)) {
echo "<td> . explode('<br>', $bildung) .</td>";
}
else
{
echo "<td>Keine Angaben</td>";
}


Muss ich vielleicht in den Einstellungen der Tabellenfelder etwas ndern?

Danke schon mal

xabbuh
19-07-2004, 20:44
Original geschrieben von flual

Muss ich vielleicht in den Einstellungen der Tabellenfelder etwas ndern?


Was hast du bis jetzt als Tabellenfeldtyp? varchar(10)? Das drfte zu kurz sein, allerdings wei ich jetzt auch nicht, wie lang der von serialize erstellte String sein kann. Zur Not kannst du es ja mal probieren, in dem du als Feldtyp text nimmst.

flual
20-07-2004, 10:16
Ich habe jetzt bei allen Feldern mit Mehrfach-Auswahl die Einstellung aud Mediumtext ohne Zahleingabe gestellt. Das solte ausreichen, oder?

Nun wird in dreien im Feld der Tabelle eine Angabe gemacht, hnlich wie folgt:
a:1:{i:0;s:8:"haus";}

nur bei bildung steht immer noch Array.

Beim Aufrufen der Feldeingabe wird allerdings immer noch "Keine ANgaben" angezeigt, in anzeige.php.
Wo ist da noch ein Fehler?

chris17
20-07-2004, 10:19
Hi,

speichern.php

#$bildung = serialize($_POST["bildung"]); // macht hier kein Sinn...
.
.
.
$bildung = $_POST['bildung']; // ..weil Du $bildung hier wieder berschreibst, und dann hast Du wieder ein Array

if (empty($bildung[0])) {
echo "<p>Whlen Sie <b>Student und/oder Schler</b>aus";
}
.
.
// serialize() wrde ich erst hier vor dem INSERT machen.
$bildung = serialize($bildung);

mysql_query("insert into tabelle(bildung) values ('$bildung')");

flual
20-07-2004, 10:24
Danke, werde es heute abend versuchen.
Aber was ist mit anzeigen.php, warum wird hier die Auswahl "Keine ANgben" angezeigt? Mein Code steht oben auf Seite 2 dieses Themas.

chris17
20-07-2004, 10:37
Original geschrieben von flual
Danke, werde es heute abend versuchen.
Aber was ist mit anzeigen.php, warum wird hier die Auswahl "Keine ANgben" angezeigt? Mein Code steht oben auf Seite 2 dieses Themas.
Weil das INSERT noch nicht richtig luft, siehe mein letztes Posting.

So wie Du es bisher gemacht hast wird in der Tabelle wieder nur der String 'Array' stehen, und deswegen "funktioniert" in der anzeigen.php is_array() nicht.

flual
20-07-2004, 11:07
Ich werde es heute abend mal versuche, aber ich habe auch mal die Variablen auf die anderen Felder mit Mehrfach-Auswahl gendert und da kam auch nur "Keine Angaben" als ergebnis.
Der Code oben msste aber funktionieren?

chris17
20-07-2004, 11:57
Hm, da ist noch 'n "Bug" drin:

//...
if (is_array($bildung)) {
// implode() -> Array zu String!!! " haben bei den <td> gefehlt.
echo "<td>" . implode('<br>', $bildung) . "</td>";
}
//...

flual
20-07-2004, 12:17
ALso implode statt explode?

xabbuh
20-07-2004, 13:26
Original geschrieben von flual
ALso implode statt explode?

Ich bitte vielmals um Entschuldigung. Mein Fehler. implode() ist natrlich richtig und nicht explode().