Marcus
Avatar Marcus
Themenersteller
Guru (224 Beiträge)

Mehrere Auswahlfelder und nur ein Submit-Button

am 01.07.2011, 22:31 Uhr eröffnete Marcus folgenden Thread
PHP & MySQL    4408 mal gelesen    18 Antwort(en).

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 behält sich das Recht vor,<br> Angebote mit schwacher Resonanz unangekündigt 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; <br /> &lt;input type = &quot;reset&quot; value=&quot;Abbrechen&quot; /&gt; <br /> &lt;/form&gt;--> <br> </td> <br> <td width="550"> <br> &lt;style="text-align:left;"&gt;Der MTV Treubund behält 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 behält 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;mögliche 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 behält 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="Zurücksetzen"> <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


Das Regional-Magazin für Lüneburg und die Region:
salzsau-panorama.de

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

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!

Marcus
Avatar Marcus
Guru (224 Beiträge)
am 01.07.2011, 23:03 Uhr schrieb Marcus

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*


Das Regional-Magazin für Lüneburg und die Region:
salzsau-panorama.de


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

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


Marcus
Avatar Marcus
Guru (224 Beiträge)
am 02.07.2011, 12:51 Uhr schrieb Marcus

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.


Das Regional-Magazin für Lüneburg und die Region:
salzsau-panorama.de

Marcus
Avatar Marcus
Guru (224 Beiträge)
am 02.07.2011, 17:12 Uhr schrieb Marcus

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


Das Regional-Magazin für Lüneburg und die Region:
salzsau-panorama.de

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

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


Marcus
Avatar Marcus
Guru (224 Beiträge)
am 02.07.2011, 18:59 Uhr schrieb Marcus

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


Das Regional-Magazin für Lüneburg und die Region:
salzsau-panorama.de

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

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!

Marcus
Avatar Marcus
Guru (224 Beiträge)
am 02.07.2011, 20:54 Uhr schrieb Marcus

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?


Das Regional-Magazin für Lüneburg und die Region:
salzsau-panorama.de

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

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




« zurück zu: PHP & MySQL

Das Seitenreport Forum hat aktuell 5277 Themen und 36111 Beiträge.
Insgesamt sind 48343 Mitglieder registriert.