Vollstndige Version anzeigen : Problem mit Mehrfach-Auswahl im Formular
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.
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.
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.
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>";
}
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());
Ja, es knnen beide angeklickt werden. Es muss ja nicht Schler und Studnet sein, es kann auch Hund und Katze sein.
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.
Was fr ein Format hat `bildung` in der DB-Tabelle?
Bekommst Du bei der Testausgabe was auf dem Schirm?
Die Einstellung von 'bildung' ist VARCHAR(10). Es wird nur 'Array' im Tabellenfeld angezeigt. Ebenso auch ausgedruckt.
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.
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?
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.
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>";
}
}
?>
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]
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...
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
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.
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?
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')");
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.
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.
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?
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>";
}
//...
ALso implode statt explode?
Original geschrieben von flual
ALso implode statt explode?
Ich bitte vielmals um Entschuldigung. Mein Fehler. implode() ist natrlich richtig und nicht explode().
vBulletin v3.0.7, Copyright ©2000-2005, Jelsoft Enterprises Ltd.