[PHP] Auswahl mit Radiobuttons auf Checkboxen umstellen

M

Mr. Snoot

Gast
Hio,

ich habe bei der Suchfunktion auf meiner Homepage die Möglichkeit bestimmte Bereiche der Seite zu durchsuchen, also entweder:

O - Suche überall
O - Suche in Teil 1
O - Suche in Teil 2

Das geschieht im Moment mittels Radiobuttons. Nun dachte ich mir, dass es vielleicht schöner wäre, wenn man die gewünschten Bereiche mit einer Checkbox auswählt, also:

- Suche in Teil 1
- Suche in Teil 2


Sollte eigentlich nicht so schwer sein, aber irgendwie klappt es nicht.


Die Suche für Variante 1 sieht so aus:

Suchformular:
HTML:
<input id="komplett" type="Radio" name="bereich" checked value="komplett"><label for="komplett">Bereiche + Lexikon</label>

<input id="kapitel" type="Radio" name="bereich" value="kapitel"><label for="kapitel">Bereiche</label>

<input id="lex" type="Radio" name="bereich" value="lexikon"><label for="lex">Lexikon</label>
Script zur Auswahl der jeweiligen Datei mit den Suchbegriffen:
PHP:
<?php
if(($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel"))
{
  $logfile = "./admin/search_log_main.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt";   //Pfadangabe zur Datendatei
  $bereich = "kapitel";
}
elseif(($_POST["bereich"] == "lexikon") OR ($_GET["bereich"] == "lexikon"))
{
  $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
  $bereich = "lexikon";
}
else
{
  $logfile = "./admin/search_log.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt"; //Pfadangabe zur Datendatei
  $bereich = "komplett";

...


Dann sollte das doch für Variante zwei mit den Checkboxen irgendwie so aussehen:

Formular:
HTML:
<input id="kapitel" type="Checkbox" name="bereich" checked value="kapitel"><label for="komplett">Bereiche</label>

<input id="lex" type="Checkbox" name="bereich2" value="lexikon"><label for="lex">Lexikon</label>
Suchscript:
PHP:
<?php
if((($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel")) AND (($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon")))
{
  $logfile = "./admin/search_log.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt";   //Pfadangabe zur Datendatei
  $bereich = "komplett";
}
elseif(($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon"))
{
  $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
  $bereich = "lexikon";
}
else(($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel"))
{
  $logfile = "./admin/search_log_main.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt"; //Pfadangabe zur Datendatei
  $bereich = "kapitel";

...
Oder bin ich da auf dem Holzweg?

Jedenfalls liefert die Checkboxvariante bei der Suche erstmal nur Ergebnisse aus der search_data_lex.txt und nicht aus search_data.txt. Das sieht ja so aus, als benutzt das Script nicht die erste if-Abfrage, sondern die zweite.

Hab leider nicht viel Ahnung von PHP, darum bitte nicht zu knapp antworten :D
 
Fehlt bei der letzten Bedingung nicht ein if nach dem else?

//edit
PHP:
(($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel")) AND (($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon"))
Wenn diese Bedinung war sein soll, dann müssen ja beide Checkboxen aktiviert (oder es müssen die Werte eben über GET kommen). In dem HTML Code darüber wird aber nur die erste Checkbox aktiviert. Bei mir geht das Script dann direkt in die letzte Bedingung (Kapitel).

Welche Checkboxen waren bei deinem Test denn angeklickt?

Mit dem Code habe ich getestet...
PHP:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<input id="kapitel" type="Checkbox" name="bereich" checked value="kapitel"><label for="komplett">Bereiche</label>
<input id="lex" type="Checkbox" name="bereich2" value="lexikon"><label for="lex">Lexikon</label>
<input type="submit" />
</form>

<?php
	print_r($_POST);
	
if((($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel")) AND (($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon")))
{
  $logfile = "./admin/search_log.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt";   //Pfadangabe zur Datendatei
  echo "komplett";
}
elseif(($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon"))
{
  $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
  echo  "lexikon";
}
elseif(($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel"))
{
  $logfile = "./admin/search_log_main.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt"; //Pfadangabe zur Datendatei
  echo  "kapitel"; 
}
?>
 
Zuletzt bearbeitet:
Ich hatte mit beiden getestet (schlauerweise aber nicht einzeln ;)).

Geht der von dir gepostete Code denn? Seh da keine Änderung (außer des elseif).

Aber else oder elseif am Ende ist doch egal!? Wenn alle anderen Bedingungen nicht erfüllt sind dann einfach das letzte.

edit: also einzeln stimmt die Suche mit der Radiobuttonvariante überein, nur beide zusammen liefern was anderes.
 
Ich bin zwar auch kein PHPler, aber folgendes Script gibt bei mir von dir gewünschte aus:

PHP:
<?php
print_r($_POST);
echo "<br />";
$bereich_checked = ($_POST["bereich"] == "kapitel");
$bereich2_checked = ($_POST["bereich2"] == "lexikon");

echo "bereich: ";var_dump($bereich_checked);
echo "<br />";
echo "bereich2: ";var_dump($bereich2_checked);
echo "<br />";
if ($bereich_checked AND $bereich2_checked)
{
  $logfile = "./admin/search_log.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt";   //Pfadangabe zur Datendatei
  print "komplett";
}
else {
    if ($bereich_checked)
    {
        $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
        $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
        print "lexikon";
    }
    if ($bereich2_checked)
    {
        $logfile = "./admin/search_log_main.txt"; //Pfadangabe zu Logdatei
        $datenfile = "./admin/search_data_main.txt"; //Pfadangabe zur Datendatei
        print "kapitel";
    }
}
?>
Es wird allerdings je nachdem, welche Checkbox markiert ist, eine Notice ausgegeben, dass im POST ein index nicht existiert. Diese Ausgabe lässt sich aber mit
PHP:
Error_reporting(E_ERROR);
am Anfang des Scripts unterbinden.
 
Hm, ist aber eigentlich das gleiche wie bei mir, nur dass du zu Beginn halt die Variablen anders erzeugst, oder?


Ich hab jetzt jedenfalls nochmal alles zurückgesetzt (auf die Radiobuttons) und dann nochmal zu den Checkboxen geändert und so wie es aussieht, läuft es jetzt :)

Hatte vielleicht irgendwo bei der Benennung der Boxen (bereich - bereich2) was durcheinandergebracht.

Falls es doch nicht läuft, komm ich halt wieder :D

Trotzdem danke an dieser Stelle für die Tipps.

edit: @ Quidoff: es muss unten natürlich weiterhin heißen:
PHP:
else
{
  $logfile = "./admin/search_log_main.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt"; //Pfadangabe zur Datendatei
  echo  "kapitel"; 
}
So wie ich es oben gepostet habe gehört da natürlich elseif hin (warum auch immer das plötzlich geändert hatte :)).



edit: wie ich grad festgestellt habe, funktioniert die Suche doch nicht korrekt.

Die erste Ergebnisseite stimmt noch, blättert man dann aber weiter auf die nächste (oder eine andere) Seite mit Ergebnissen, wird die if-Anweisung scheinbar übergangen (und es wird die letzte else-Anweisung befolgt) und somit sind die Suchergebnisse dahin :(


Mit den Radiobuttons klappt es aber einwandfrei. Dass kann doch eigentlich kein großer Unterschied sein, oder?


Das script sieht also so aus
PHP:
if((($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel")) AND (($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon")))
{
  $logfile = "./admin/search_log.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt";   //Pfadangabe zur Datendatei
  $bereich = "komplett";
}
elseif(($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon"))
{
  $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
  $bereich =  "lexikon";
}
else
{
  $logfile = "./admin/search_log_main.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt"; //Pfadangabe zur Datendatei
  $bereich = "kapitel";
}
und das zugehörige Formular
HTML:
<form method="post" action="suche.php">
<input type="text" name="search_exp" class="eingabe" tabindex="1" value="Suchbegriff">
<input type="submit" value="Suche starten" class="eingabe" name="submit" tabindex="2">
<input type="Checkbox" name="bereich" value="kapitel" checked>Alle Kapitel
<input type="Checkbox" name="bereich2" value="lexikon" checked>Lexikon</form>
Was ist denn da schon wieder kaputt :(

Das komplette Suchscript gibts hier.



Zum Vergleich die funktionierende Radiobuttonvariante:
PHP:
if(($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel"))
{
  $logfile = "./admin/search_log_main.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt";   //Pfadangabe zur Datendatei
  $bereich = "kapitel";
}
elseif(($_POST["bereich"] == "lexikon") OR ($_GET["bereich"] == "lexikon"))
{
  $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
  $bereich = "lexikon";
}
else
{
  $logfile = "./admin/search_log.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt"; //Pfadangabe zur Datendatei
  $bereich = "komplett";
}
HTML:
<form method="post" action="suche.php">
<input type="text" name="search_exp" class="eingabe" tabindex="1">
<input type="submit" value="Suche starten" class="eingabe" name="submit" tabindex="2">
<input type="Radio" name="bereich" checked value="komplett">Kapitel + Lexikon
<input type="Radio" name="bereich" value="kapitel">Kapitel
<input type="Radio" name="bereich" value="lexikon">Lexikon
</form>
 
Zuletzt bearbeitet:
Du hast wahrscheinlich nur vergessen den Link zu einer anderen Seite zu ändern.

Du musst die Werte von bereich und/oder bereich2 noch an den Link anhängen.
PHP:
if((($_POST["bereich"] == "kapitel") OR ($_GET["bereich"] == "kapitel")) AND (($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon")))
{
...
}
elseif(($_POST["bereich2"] == "lexikon") OR ($_GET["bereich2"] == "lexikon"))
{
...
}
else
{
...
}
Du siehst ja, dass du zusätzlich zu $_POST auch noch $_GET überrüfst. Diese Überprüfung mit $_GET ist notwendig, da beim Seiten umblättern die Variablen nicht der $_POST gesendet werden, sondern per $_GET (also als Variablen im Link) übertragen werden.

Ich hoffe das war einigermaßen verständlich.

//edit
Mal ein Beispiel.
Zur Zeit sieht ein Link z.B. so aus:
Code:
http://www.halbleiter.org/suche/suche.php?search_exp=Oxidation&exp_full=no&exp_capital=no&a=10&bereich=komplett
Entscheident ist die Stelle: bereich=komplett

Mit Checkboxen müsste der Link so aussehen:
Code:
http://www.halbleiter.org/suche/suche.php?search_exp=Oxidation&exp_full=no&exp_capital=no&a=10&bereich=kapitel&bereich2=lexikon
Mit diesem Link müsste die erste if() Bedingung erfüllt werden.
 
Zuletzt bearbeitet: (Beispiel hinzugefügt.)
Ja, aber ich denke, dass das doch passiert. Ich setze ja jeweils die Variable $bereich (komplett, lexikon, kapitel) und das wird dann bei der Blätterfunktion eingebunden:
PHP:
#################################################
# Anzeige der Blätterfunktion
function seitenaufteilung($anz_zeilen) {

global $nps, $a, $_SERVER, $_GET, $search_exp, $exp_full, $exp_capital, $bereich;

$a = $_GET['a'];
$PHP_SELF = $_SERVER['PHP_SELF'];

$search_exp = urlencode($search_exp);

$seiten=ceil($anz_zeilen / $nps);
$foot = '<table width="400" border="0" cellspacing="0" cellpadding="0" align="center"><tr><td>&nbsp;</td></tr><tr><td align=center>';

if($a >= $nps) {
    $back = $a-$nps;
$foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$back.'
&bereich='.$bereich.'" class="page_link"><<</a>&nbsp;&nbsp;';
}

if ($anz_zeilen<=$nps) {
    $foot .= '';
}
else {
    for ($i=1; $i<=$seiten; $i++) {
        $fwd=($i-1)*$nps;

        if ($a==$fwd) {
        $foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'
&bereich='.$bereich.'" class="page_link"><b><u>'.$i.'</u></b></a> ';
        }
        else{
        $foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'
&bereich='.$bereich.'" class="page_link">'.$i.'</a> ';
        }

    }
}

if(($a < $anz_zeilen-$nps) && ($nps<$anz_zeilen)) {
    $fwd = $a+$nps;
$foot .= ' <a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'
&bereich='.$bereich.'" class="page_link">>></a>';
}

$foot .= '</td></tr></table></table>';

return($foot);
}
#################################################
?>
Angenommen ich suche überall, dann sind die Links auf der ersten Trefferseite zu den weiteren Seiten augenscheinlich auch noch korrekt:

.../suche.php?search_exp=wafer&exp_full=no&exp_capital=no&a=0&bereich=komplett

Rufe ich dann aber eine andere Seite auf wir die if-Anweisung nicht mehr beachtet und die Variable scheint vergessen.
 
Zuletzt bearbeitet: (Code angepasst, damit die Seite nicht in die Breite gezogen wird.)
Du musst die if() Abfragen nur ein wenig umändern. Der Fall, dass bereich den Wert "komplett" annimmt wird in deinem Skript nämlich gar nicht beachtet.

PHP:
if((($_POST["bereich"] == "kapitel") AND ($_POST["bereich2"] == "lexikon")) OR ($_GET["bereich"]=="komplett"))
{
  $logfile = "./admin/search_log.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data.txt";   //Pfadangabe zur Datendatei
  $bereich = "komplett";
}
elseif(($_POST["bereich2"] == "lexikon") OR ($_GET["bereich"] == "lexikon") )
{
  $logfile = "./admin/search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_lex.txt";   //Pfadangabe zur Datendatei
  $bereich =  "lexikon";
}
else
{
  $logfile = "./admin/search_log_main.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./admin/search_data_main.txt"; //Pfadangabe zur Datendatei
  $bereich = "kapitel";
}
 
Zuletzt bearbeitet: (Die erste if Bedingung vereinfacht.)
Ah, vielleicht besteht da ein Missverständnis.

Das ["bereich"] ist der Name der ersten Checkbox für die Kapitel, ["bereich2"] die zweite fürs Lexikon. Das kann also nicht stimmen
PHP:
["bereich"] == "lexikon"
Denn ["bereich"] kann ja nur den Wert "kapitel" annehmen.

Und das kann ja gar nicht auftreten:
PHP:
($_GET["bereich"]=="komplett")
denn ["bereich"] kann ja nur den Wert "kapitel" der Checkbox annehmen. "komplett" heißt's ja nur für den Fall, dass beide angeklickt wurden.

Oder bin ich wieder auf dem Holzweg :D
 
Das stimmt schon. Denn wie du schon richtig oben den Code zitiert hast, nimmt bei den Links die Variable bereich den Wert von $bereich an. Und der ist entweder "komplett", "lexikon" oder "kapitel".
PHP:
$foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$back.'&bereich='.$bereich.'" class="page_link"><<</a>&nbsp;&nbsp;';
Du musst auf die Unterscheidung von $_GET und $_POST achten. Auf $_POST bezogen stimmt deine Aussage, dass (vorausgesetzt man verwendet dein Suchskript) $_POST["bereich"] nur den Wert "kapitel" annehmen kann. Es ist aber $_GET["bereich"] und da sind zusätzlich noch die Werte "lexikon" und "komplett" möglich.
Das schreibst du ja in deinem Code auch selbst:
PHP:
if(...)
{
...
  $bereich = "komplett";
}
elseif(...)
{
...
  $bereich =  "lexikon";
}
else
{
...
  $bereich = "kapitel";
}
 
Zuletzt bearbeitet: (Näher begründet)
Achso, dann stimmt auch das ($_GET["bereich"] == "lexikon") anstelle von ($_GET["bereich2"] == "lexikon"); da hatte ich mich schon gewundert.


Ist also alles etwas verzwickt in diesem Fall :)

Und bei den Radiobuttons gibts die Problematik natürlich nicht, weil "bereich" ja immer eindeutig definiert wird.


Dann kann ich nur mal wieder sagen: herzlichen Dank Quidoff.

Ich hoffe mal, dass das jetzt hinhaut und ich dich nicht mehr belästigen muss ;)
 
Zurück
Oben