Zum Inhalt springen
ThreadPHP & MySQL

Mehrere Auswahlfelder und nur ein Submit-Button

Kategorie
PHP & MySQL
Gelesen
4408
Antworten
18
Erstellt von: gelöschter BenutzerDatum: 01.07.2011, 22:31 Uhr
Archiv-KommentarArchiviert, nicht priorisiertCMS & technische Umsetzung

Redaktionelle Einordnung

Diese archivierte Diskussion behandelt Mehrere Auswahlfelder und nur ein Submit-Button aus Sicht der Rubrik PHP & MySQL.

CMS- und Technikfragen sind heute besonders dann relevant, wenn sie Indexierung, Rendering, interne Verlinkung oder Relaunch-Risiken beeinflussen.

Sinnvoll nutzbar bleibt der Thread vor allem als historischer Kontext, für typische Fragestellungen und zur Einordnung älterer Empfehlungen.

Einige im historischen Thread genannte Tools, Dienste oder externe Links könnten heute nicht mehr verfügbar oder inhaltlich überholt sein. Nutzen Sie sie bitte nur mit zusätzlicher Prüfung.

Startbeitrag

Originaler Foreninhalt in modernisierter Darstellung.

Zur Kategorie
gelöschter Benutzer
Threadstart · PHP & MySQL 4408 mal gelesen · 01.07.2011, 22:31 Uhr

Hallo zusammen!

Es würde mich freuen, wenn ich Eure Hilfe in Anspruch nehmen könnte:

Ich habe ein Formular mit mehreren Auswahlfeldern.

Das Formular habe ich nun so umgestaltet, das ich nur noch ein Reset bzw. Submit-Button habe.

Bislang funktioniert es leider nur, wenn man den Wochentag auswählt. Die anderen Auswahlfelder ignoriert die Routine.




<form action="kurssuche.php" method="post" accept-charset="utf-8"> <br> <tr> <br> <td><strong>Angebot:</strong></td> <br> <td width="600"> <br> <br> &lt;select name="searchterm" size="1" id="Angebot" class="select"&gt; <br> &lt;?php <br> //Angebot auslesen <br> $sqlbefehl =" <br> Select distinct <br> Angebot <br> From <br> programm <br> ORDER BY <br> Angebot <br> "; <br> $erg_cats = mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl); <br> while($cat = mysql_fetch_assoc($erg_cats)){ <br> echo '&lt;option value="'.$cat['Angebot'].'"&gt;'.$cat['Angebot'].'&lt;/option&gt;'; <br> } <br> ?&gt; <br> &lt;/select&gt; <br> <br> <br> </td> <br> <td width="550"> <br> &lt;style="text-align:left;"&gt;Der MTV Treubund behlt sich das Recht vor,<br> Angebote mit schwacher Resonanz unangekndigt einzustellen <br> </td> <br> </tr> <br> <tr> <br> <td><strong>Ort:</strong></td> <br> <td> <br> <br> &lt;select name="searchterm" size="1" id="Ort" class="select"&gt; <br> &lt;?php <br> //Ort auslesen <br> $sqlbefehl =" <br> Select distinct <br> Ort <br> From <br> programm <br> ORDER BY <br> Ort <br> "; <br> $erg_cats = mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl); <br> while($cat = mysql_fetch_assoc($erg_cats)){ <br> echo '&lt;option value="'.$cat['Ort'].'"&gt;'.$cat['Ort'].'&lt;/option&gt;'; <br> } <br> ?&gt; <br> &lt;/select&gt; <br> <br> <!--&lt;input type = &quot;submit&quot; value=&quot;Suchen&quot; /&gt; &lt;br /&gt; &lt;input type = &quot;reset&quot; value=&quot;Abbrechen&quot; /&gt; &lt;br /&gt; &lt;/form&gt;--> <br> </td> <br> <td width="550"> <br> &lt;style="text-align:left;"&gt;Der MTV Treubund behlt sich das Recht vor,die Kurs-Orte bei Bedarf zu wechseln <br> </td> <br> </tr> <br> <tr> <br> <td><strong>bungsleiter:</strong></td> <br> <td> <br> <br> &lt;select name="searchterm" size="1" id="Uebungsleiter" class="select"&gt; <br> &lt;?php <br> //bungsleiter auslesen <br> $sqlbefehl =" <br> Select distinct <br> Uebungsleiter <br> From <br> programm <br> ORDER BY <br> Uebungsleiter <br> "; <br> $erg_cats = mysql_query($sqlbefehl)or die(mysql_error().$sqlbefehl); <br> while($cat = mysql_fetch_assoc($erg_cats)){ <br> echo '&lt;option value="'.$cat['Uebungsleiter'].'"&gt;'.$cat['Uebungsleiter'].'&lt;/option&gt;'; <br> } <br> ?&gt; <br> &lt;/select&gt; <br> <br> <br> </td> <br> <td width="700"> <br> &lt;style="text-align:left;"&gt;Der MTV Treubund behlt sich vor, Kursleiter (auch sehr kurzfristig) auszuwechslen <br> </td> <br> </tr> <br> <tr> <br> <td><strong>Tageszeit:</strong></td> <br> <td> <br> <br> &lt;select name="searchterm" size="1" id="Tageszeit" class="select"&gt; <br> &lt;option value="0"&gt;Uhrzeit&lt;/option&gt; <br> &lt;option value="Vormittags"&gt;08 h - 12 h&lt;/option&gt; <br> &lt;option value="Nachmittag"&gt;12 h - 18 h&lt;/option&gt; <br> &lt;option value="Abends"&gt;18 h - 22 h&lt;/option&gt; <br> &lt;/select&gt; <br> <br> <br> </td> <br> <td width="550"> <br> &lt;style="text-align:left;"&gt;mgliche zeitliche Verlegungen durch den MTV Treubund sind nicht ausgeschlossen <br> </td> <br> </tr> <br> <tr> <br> <td><strong>Wochentag:</strong></td> <br> <td> <br> <br> &lt;select name="searchterm" size="1" id="Tage" class="select"&gt; <br> &lt;option value="0"&gt;Wochentag&lt;/option&gt; <br> &lt;option value="Montag"&gt;Montag&lt;/option&gt; <br> &lt;option value="Dienstag"&gt;Dienstag&lt;/option&gt; <br> &lt;option value="Mittwoch"&gt;Mittwoch&lt;/option&gt; <br> &lt;option value="Donnerstag"&gt;Donnerstag&lt;/option&gt; <br> &lt;option value="Freitag"&gt;Freitag&lt;/option&gt; <br> &lt;option value="Samstag"&gt;Samstag&lt;/option&gt; <br> &lt;option value="Sonntag"&gt;Sonntag&lt;/option&gt; <br> &lt;/select&gt; <br> <br> <br> </td> <br> <td width="550"> <br> &lt;style="text-align:left;"&gt;Der MTV Treubund behlt sich die rtliche Verlegung von Kursen (bei Bedarf auch sehr kurzfristig) vor <br> </td> <br> </tr> <br> <td></td><td><input name="reset" type="reset" id="reset2" value="Zurcksetzen"> <br> <br> <input type="submit" id="send2" name="send" value="Ergebnisse anzeigen"></td> <br> <td width="12"></td> <br> <br> <br></form>




Funktioniert das nur mit js? Weil dann kann ich es wohl abhaken, da ich mich damit überhaupt nicht auskenne!

Danke im voraus!

Marcus

Antworten

10 Beiträge
Foren Moderator Evil Genius Content Halbgott (973 Beiträge)
am 01.07.2011, 22:51 Uhr schrieb matthes
Antwort

Du benutzt gleiche Namen für alle Felder.
Damit bekommt die Variable den Wert des letzten Feldes dieses Namens.

Entweder aus den Namen ein "searchterm[]" machen, dann hast Du die Auswahlen als Array, oder unterschiedliche Namen verwenden.

Du machst das aber nicht beruflich, oder...?
Wenn sowas nicht klappt, lass Dir $_POST ausgeben (var_export, print_r, ...) und lies die Anzeige aufmerksam. In der Regel fällt einem dann schon auf, dass man gleiche Namen verwendet.


Make Seitenreport great again!
gelöschter Benutzer
am 01.07.2011, 23:03 Uhr schrieb
Antwort

Hallo Matthes!

Danke soweit!

Beruflich?

Um Gottes Willen, nee. Ich bastel das in meiner Freizeit, und um das vielleicht mal irgendwann zu lernen.

Beruflich würde ich ja am langen Arm verhungern... *lol*

gelöschter Benutzer
am 02.07.2011, 00:06 Uhr schrieb
Antwort

Dafür brauchst du kein JavaScript. Wie Matthes schon sagte, gib allen Suchkriterien unterschiedliche Bezeichnungen. Danach einfach prüfen welche gesetzt wurden und daraus entsprechend die WHERE Bedingungen bilden für die SQL Abfrage.

So kannst du auch die Anzeige eingrenzen oder besser gesagt die User können gezielter suchen.

JS brauchst du erst wenn du die Ergebnisse direkt einblenden willst ohne die Seite neu zu laden.

Schöne Grüße
Thomas

gelöschter Benutzer
am 02.07.2011, 12:51 Uhr schrieb
Antwort

Hallo Ultima!

Auch Dir Danke für Deine Antwort.

Dann weiß ich schon mal ein wenig weiter. Und da ihr mir bei der Abfrage damals ja auch schon so gut geholfen habt, brauche ich die ja eigentlich \'nur\' entsprechend anzupassen :lol:

Das, denke ich, sollte sogar ich hinbekommen.

gelöschter Benutzer
am 02.07.2011, 17:12 Uhr schrieb
Antwort

So, ich habs tatsächlich gebacken bekommen.

Aber ich würde gerne noch von den Experten wissen, obs da Optimierungspotenzial gibt. Meistens ist das bei so zusammengeschusterten Code ja der Fall:

if (isset($_POST[\'Angebot\']) && !empty($_POST[\'Angebot\']) || ($_POST[\'Ort\']) && !empty($_POST[\'Ort\']) || ($_POST[\'Uebungsleiter\']) && !empty($_POST[\'Uebungsleiter\']) || ($_POST[\'Tageszeit\']) && !empty($_POST[\'Tageszeit\']) || ($_POST[\'Tage\']) && !empty($_POST[\'Tage\'])) {
$db = mysql_connect("localhost","xxxxx","xxxxx") or die(mysql_error());
mysql_select_db("xxxxx") or die ("Die Datenbank existiert nicht.");
mysql_query(\'SET NAMES `utf8`\');
$begriff = mysql_real_escape_string($_POST[\'Angebot\']. $_POST[\'Ort\']. $_POST[\'Uebungsleiter\']. $_POST[\'Tageszeit\']. $_POST[\'Tage\']);


Danke und Gruß Marcus

JDev Xer Content Gott (1224 Beiträge)
am 02.07.2011, 17:32 Uhr schrieb romacron
Antwort

Was auf den ersten Blick auffällt

$_POST vars im Code

zu aller allererst Alle Variablen aus dem $_POST nehmen.

in etwa so:
$validatetPostVars

~~query( (string)$validatetPostVars[\'Angebot\'] .(int)$validatetPostVars[\'leiter\']);

...so diese Richtung.
ggf noch prüfen ob die übergebenen Werte eine maximale Länge nicht übersteigen.
Spassvögel submitten gern eine Textdatei mit 1.99MB.
Damit quält sich das Script


ich glaube Matthes oder Oscar hatten zum Abfangen von Posts und Gets gleich am Anfang des Scripts kommentiert

gelöschter Benutzer
am 02.07.2011, 18:59 Uhr schrieb
Antwort

Hallo Roman!

Wahrscheinlich ein völlig depperte Frage, aber eben Anfänger:

Auch wenn alles nur Select-Felder sind und keine Eingabe-Felder?

Weil das Formular nur aus Aswahlfeldern besteht: Hier zu finden

Gruß

Marcus

Foren Moderator Evil Genius Content Halbgott (973 Beiträge)
am 02.07.2011, 19:04 Uhr schrieb matthes
Antwort

Das kann selbst das schlechteste Scriptkiddie innerhalb einer Minute umbasteln und eigene Werte übergeben.
Wann immer Du Werte vom Besucher erhälst, musst Du sie prüfen und ggf. entschärfen. Egal ob das jetzt GET-Parameter sind, ob Du ein Formular verarbeitest, ob es Cookies sind, oderoderoder. Alle Daten, die von außerhalb kommen, sind potentiell böse, jederzeit.

PS: Wobei Du die POST-Variablen ja durch mysql_real_escape_string jagst, so schlimm ist es dann nicht mehr.

PPS: Entferne doch bitte einer das Passwort aus Marcus\' Codeschnippsel...


Make Seitenreport great again!
gelöschter Benutzer
am 02.07.2011, 20:54 Uhr schrieb
Antwort

Also müsste das ähnlich diesem hier sein:

$sqlbef = "insert into programm (angebot, tage, ort, von, bis, uebungsleiter, tageszeit, zielgruppe, anmerkung) values (\'$angebot\', \'$tage\', \'$ort\', \'$von\', \'$bis\', \'$uebungsleiter\', \'$tageszeit\', \'$zielgruppe\', \'$anmerkung\')";

Nur das das nicht insert into heißt, sondern $Validate PostVars?

JDev Xer Content Gott (1224 Beiträge)
am 03.07.2011, 07:50 Uhr schrieb romacron
Antwort

Ja, escaped ist das ganze (glückwunsch)

Von aussen betrachtet, sollte das soweit gehen.

Der Trick warum
$_Post[\'angebot\']
zu
$angebot wird ist recht simple. Du musst die Angebot aus $_Post rausziehen. Dann vilidiert man die Variable gleich mit.

Wenn wie zuerst in der Query $_Post[\'angebot\']; stand, weisst du nicht ob du sie bereits validiert hattest. Eine Variable nicht validiert ist nicht so toll.

Zur Tabellenstruktur:

Es ist üblich mit "id" und "bezeichnung" zu arbeiten

|id|angebot|
|1|gutes angebot|
|2|sonderangebot|
|3|sondersonder ja, auch angebot|

dann in den Angebots select-feldern

<option>
<select value="1">gutes angebot</select>
<select value="2">sonderangebot</select>
</option>


wenn alle Werte über id\'s laufen können die bei der Validierung nach dem Senden


$angebot = (int)$_Post[\'angebot\'];

geschrieben werden (bitte auch escapen m.e gehörts zu ordentlichen Schreibweise)

Die Query

natürlich sollte die id Spalte in der Tabelle als int oder tinyint erstellt sein.

SELECT ~~~ id=`$angebot`


Mit den ziffern als id\'s arbeitet das ganze system schneller direkter und ist im Code weniger anfällig für tippefehler
Addresse
Adresse
adrsse
...usw. 1 ist 1