Wie löse ich dieses Array wieder auf?
Stiven
- php
2 ChrisB0 Stiven0 ChrisB0 Vinzenz Mai0 Stiven
0 Tom1 Felix Riesterer
- html
HI,
In einem Formular darf der User mehrere Kombinationen per Checkbox auswählen.
//################################################################################
$db=mysql_connect($dbserver,$dbuser,$dbpasswd);
mysql_select_db($dbname,$db);
$query="select UserID,UserName,se_ip from user";
$result_user=mysql_query($query);
if ($result_user==FALSE) {
die(mysql_error());
}
while ($row_user=mysql_fetch_row($result_user)) {
if ($row_user[2] != "t") {
$optionen .="";
} else {
$optionen .= "<input type=checkbox name=Namen[] value="$row_user[1]">----> $row_user[1]<br>";
}
}
//################################################################################
Mein SQL-Insert sieht so aus:
$Optionen = ?????? (Hier sollen die vom User ausgewählten Namen rein)
$result=mysql_query("insert into table (...,Optionen) values (...,"$Optionen")");
Aber wie löse ich die vom User per Checkbox ausgewählten Optionen aus, sodaß sie dann durch Komma voneinandere seperiert eingetragen werden. Option1, Option2, Option3
Ich weiß übrigens, dass das nciht ganz Normalformkonform ist, aber da es hier nur um einen schnellen Workarround geht, soll das so sein.
Danke und schönen Abend
Stefan
Hi,
Aber wie löse ich die vom User per Checkbox ausgewählten Optionen aus, sodaß sie dann durch Komma voneinandere seperiert eingetragen werden. Option1, Option2, Option3
implode().
Denn Fall, dass es gar kein Array gibt, solltest du aber noch abfangen.
MfG ChrisB
Hi,
Aber wie löse ich die vom User per Checkbox ausgewählten Optionen aus, sodaß sie dann durch Komma voneinandere seperiert eingetragen werden. Option1, Option2, Option3
implode().
Denn Fall, dass es gar kein Array gibt, solltest du aber noch abfangen.
MfG ChrisB
Hi Chris,
Ok, das man ein Array mit Implode auflöst, weiß ich schon.
Kommt aber hier doch gar nicht zum tragen, oder?
Also, wie geh ich vor?
Anzahl der Array-Elemente ermitteln und dann $Option=Element1,Element2, ...
Oder über foreach-schleife?
foreach ... $Option .= ... ??
Wie machts mans sinnvoll, schlank und vor allem richtig? ;-)
Grüße, Stefan
Hi,
bitte zitiere vernuenftig!
Ok, das man ein Array mit Implode auflöst, weiß ich schon.
Du weisst also *nicht*, was implode macht - also lies es im Handbuch nach.
Wie machts mans sinnvoll, schlank und vor allem richtig? ;-)
Man liest nach, wenn man das passende Stichwort schon genannt bekommt.
MfG ChrisB
Weiß gar nicht, wo ich meinen Kopf hatte. *schäm*
Danke für die eigentlich schnelle Antwort ;-)
Stefan
Hallo,
bitte zitiere sinnvoll.
Wie machts mans sinnvoll, schlank und vor allem richtig? ;-)
Das hängt von Verschiedenem ab. Sind beispielsweise NULL-Werte erlaubt?
Freundliche Grüße
Vinzenz
Das hängt von Verschiedenem ab. Sind beispielsweise NULL-Werte erlaubt?
Hi Vinzenz,
Ja, ist erlaubt. (NULL-Wert heißt, dass der User keine Checkbox aktiviert??)
Grüße an Dich.
Stefan
Hallo,
Das hängt von Verschiedenem ab. Sind beispielsweise NULL-Werte erlaubt?
Ja, ist erlaubt. (NULL-Wert heißt, dass der User keine Checkbox aktiviert??)
oh je, ich habe erst jetzt verstanden, was in Deinen Optionen steht und was Du abspeicherst. Wo ist das Problem mit der Umsetzung von Chris' Vorschlag. Das ist einfach, simpel und passt.
Freundliche Grüße
Vinzenz
Hello,
ich schlage vor, dass Du erst einmal die HTML-Seite auflöst, und die (gewählten) Optionen anzeigen lässt.
Dann baust Du Dir ein Kontroll-Array mit den möglichen Optionen auf, und lässt Dir die als HTML anzeigen.
Nun verbindest Du die möglichen mit den gewählten/abgewählten Optionen, indem Du die beiden erzeugten Arrays vergleichst. Also das Optionen-Array, das Du aus der HTML-Seite erzeugst mit dem Optionen-Array, das Du im Script als Vorgabe gebaut hast...
Mach ein Affenformular daraus. Wenn dies funktioniert, kannst Du zum letzten Schritt kommen, nämlich der Bindung der übermittelten Paramerter an die Spalten in der Datenbank-Tabelle.
Beachte dabei, dass ein Nichtübertragen einer Checkbox einem Rücksetzen der Option entsprechen kann.
Für Datenbank-Kopplung finde ich aus diesem Grunde Checkboxen nicht so passend. Je eine Radio-Group mit JA/NEIN pro betroffender Spalte ist eindeutiger.
Zwischenschritt wäre noch, erstmal ein Statement für die Datenbank "lose" aufzubauen, damit Du später die gültige Syntax zur Verfügung hast.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo Tom,
Mach ein Affenformular daraus. Wenn dies funktioniert, kannst Du zum letzten Schritt kommen, nämlich der Bindung der übermittelten Paramerter an die Spalten in der Datenbank-Tabelle.
ja, in diese Richtung hatte ich ursprünglich auch gedacht.
Es gibt jedoch keine *Spalten*, es gibt nur _eine_ Spalte und genau aus diesem Grund ist für den angestrebten Workaround der Hinweis von Chris zielführend.
Klar, dass die Daten für die SQL-Anweisung kontextgerecht aufbereitet werden müssen, einer der Namen könnte ja O'Brien lauten ...
Unzweifelhaft, dass die Tabellenstruktur ungünstig gewählt ist, was der OP ja weiß.
Freundliche Grüße
Vinzenz
Hello Vinzenz, Ist Dein Bett auch schon wieder kalt? :-))
Mach ein Affenformular daraus. Wenn dies funktioniert, kannst Du zum letzten Schritt kommen, nämlich der Bindung der übermittelten Paramerter an die Spalten in der Datenbank-Tabelle.
ja, in diese Richtung hatte ich ursprünglich auch gedacht.
Es gibt jedoch keine *Spalten*, es gibt nur _eine_ Spalte und genau aus diesem Grund ist für den angestrebten Workaround der Hinweis von Chris zielführend.
geb ich zu, auf die genauere Umsetzung der Datenkoppling mit der DB bin ich extra nicht eingegangen. Es sollte besser aus jeder Option eine Zeile in einer abhängigen Tabelle entstehen.
Nur dann wird es wirklich kompliziert, das Formular sauber aufzulösen.
Es müssen dann die neuen Optionen, sofern nicht vorhanden, _hinzugefügt_ werden,
und es müssen die ausgeschalteten Optionen, sofern noch vorhanden, in der Tabelle gelöscht oder in ihr ausgeschaltet werden.
Dann wäre man auch schon fast beim Drei- bis Vier-Tabellen-Modell für diese Aufgabe:
Benutzer-Stammtabelle kennzeichnet den User
Optionen-möglich-Tabelle legt die pro Formular möglichen Optionen fest
(Optionen-pro-User-möglich-Tabelle) legt die Optionen fest, die ein spezieller User
von den möglichen nutzen darf/muss
Optionen gesetzt Tabelle die eigentliche Ergebnistabelle mit den Optionen
Wenn man noch einen Schritt weiter geht, kann man die letzte tabelle sogar noch als Bewegungsdaten-Tabelle ausführen und durch spezielle Abfragen den aktuellen Stand erfragen.
Beim Design ist darauf zu achten, dass das enable und das disable von Optionen in einer atomarisierten Operation stattfinden, sonst gibt es ein Problem.
Das wird vermutlich am einfachsten gehen, wenn man auch die abgewählten Optionen in der tabelle belässt, sie nur entsprechend kennzeichnet.
Kann man in MySQL 5.x Update und Delete in einem Statement/Substatement zusammen ausführen lassen?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Nur dann wird es wirklich kompliziert, das Formular sauber aufzulösen.
Es müssen dann die neuen Optionen, sofern nicht vorhanden, _hinzugefügt_ werden,
und es müssen die ausgeschalteten Optionen, sofern noch vorhanden, in der Tabelle gelöscht oder in ihr ausgeschaltet werden.
Moin,
Habt Ihr eigentlich Spaß daran, alles zu verkomplizieren? ;-)
In einem anderen Script hab ich genau dasselbe schon gelöst. Und zwar dann für jeden gewählten Namen einen Datenbankeintrag generiert. Funktionmiert astrein und ich seh auch keine Fehlerquelle dort.
Vorgehensweise:
Abfangen, ob User keine Option gewählt hat--> entsprechende Fehlermeldung erzeugen.
Sobald wenigstens 1 Option vom User gewählt ist --> foreach Schleife nach dem Motto: Für jeden Eintrag mach folgenden SQL-Insert...
Wo siehst Du dabei ein Problem?
Grüße, Stefan
Hello,
Habt Ihr eigentlich Spaß daran, alles zu verkomplizieren? ;-)
Jein. Reicht Dir das als Antwort? :-)
In einem anderen Script hab ich genau dasselbe schon gelöst. Und zwar dann für jeden gewählten Namen einen Datenbankeintrag generiert. Funktionmiert astrein und ich seh auch keine Fehlerquelle dort.
Du hast uns nur eine sehr dürftige Beschreibung des Workflows, also der Vorgehensweise bei der Vorgangsbearbeitung, geliefert. Da bleibt dann nichts anderes übrig, als die Aufgabe empirisch und theoretisch zu durchdenken.
Was soll denn überhaupt mit den gespeicherten Informationen angefangen werden?
Sollen sie nur einmalig erhoben werden, oder sollen sie ständig änderbar bleiben?
Wie hoch ist das erwartete Datenaufkommen?
Wie kurzlebig sind die Daten?
Welche Abfragen sollen auf die Daten in welchem Zyklus möglich sein?
Das sind doch alles Fragen, die sich auf das zu wählende Design auswirken können.
Nun bist Du nochmal dran:
.
.
.
.
.
.
.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hello,
Habt Ihr eigentlich Spaß daran, alles zu verkomplizieren? ;-)
Jein. Reicht Dir das als Antwort? :-)
Ja, reicht mir vollkommen. Denn es belegt, warum es Jobs gibt, die eine Mittlerposition zwischen wirtschaftlichen Entscheidungsträgen und Fachinformatikern gibt ;-))
Und das ist nicht despektierlich gemeint, sondern rein beschreibend.
Du hast uns nur eine sehr dürftige Beschreibung des Workflows, also der Vorgehensweise bei der Vorgangsbearbeitung, geliefert.
Finde ich nicht. Aber ich kenne auch nicht alle möglichen Fehlerquellen, insofern kannst Du das als Informatiker ganz sicher besser beurteilen.
Was soll denn überhaupt mit den gespeicherten Informationen angefangen werden?
Sollen sie nur einmalig erhoben werden, oder sollen sie ständig änderbar bleiben?
Einmalig erhoben. Wobei, selbst änderbar wäre unproblematisch, da der User aus max. 6-8 Alternativen nie mehr als 2 Alternativen wählen wird.
Wie hoch ist das erwartete Datenaufkommen?
Bezogen auf was? Beantwortet meine letzte Antwort diese Frage bereits?
Wie kurzlebig sind die Daten?
Wie misst man Kurzlebigkleit? In Zeit? Und was ist dann kurz? 3 Millisekunden oder 3 Wochen?
Ich versuche mal ne Antwort: Einmal eingetragen werden sie noch 4-5 mal ausgelesen innerhalb 1 Monats. Aber mehr auch nicht.
Welche Abfragen sollen auf die Daten in welchem Zyklus möglich sein?
Welche Abfragen? Einfach auslesen. Siehe letzte Antwort...
Das sind doch alles Fragen, die sich auf das zu wählende Design auswirken können.
Ich verstehe und nachvollziehe das. Und hoffe, ich konnte Dir die nötigen Infos geben :-)
Grüße, Stefan
Lieber Stiven,
$optionen .= "
<input type=checkbox name=Namen[] value=\"$row_user[1]\">----> $row_user[1]<br>
";
du weißt doch, dass man _alle_ Attributwerte in doppelten Anführungszeichen notieren sollte:
<element attribut1="wert1" attribut2="wert2">Elementinhalt</element>
Daher schlage ich vor, dass Du Deine Code-Zeile so abänderst:
$optionen .= '<input type="checkbox" name="Namen[]" value="'
.$row_user[1]
.'">----> '
.$row_user[1]
."<br />\n";
Liebe Grüße,
Felix Riesterer.
echo $begrüßung;
du weißt doch, dass man _alle_ Attributwerte in doppelten Anführungszeichen notieren sollte:
Du weißt doch, dass man Werte immer kontextabhängig behandeln muss (nicht nur sollte).
Daher schlage ich vor, dass Du Deine Code-Zeile so abänderst:
$optionen .= '<input type="checkbox" name="Namen[]" value="'
.$row_user[1]
stattdessen: .htmlspecialchars($row_user[1])
.'">----> '
.$row_user[1]
stattdessen: .htmlspecialchars($row_user[1])
."<br />\n";[/code]
Oder übersichtlicher mit sprintf()
$optionen .= sprintf('<input type="checkbox" name="Namen[]" value="%1$s">----> %1$s<br />', htmlspecialchars($row_user[1]));
echo "$verabschiedung $name";
Hello,
Oder übersichtlicher mit sprintf()
Was ist nun an sprintf() übersichtlicher gegenüber wesentlich moderneren Schreibweisen?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
echo $begrüßung;
Oder übersichtlicher mit sprintf()
Was ist nun an sprintf() übersichtlicher gegenüber wesentlich moderneren Schreibweisen?
Was definierst du als modernere Schreibweisen? Ich finde an sprintf() übersichtlicher, dass man den String als Ganzes notieren kann und nicht ständig rein-raus muss, um was einzufügen. sprintf() an sich mag vielleicht alt(bekannt) sein, aber das sprintf-Prinzip findet man auch in <del>modernen</del><ins>jüngeren</ins> Umgebungen wieder, beispielsweise dem .NET-Framework: string.Format().
echo "$verabschiedung $name";