Variablen Wert bei Checkboxauswahl übergeben?
Philip
- php
Hi,
ich habe auf meiner Seite 6 Checkboxen, über die verschiedene Bereiche der Seite durchsucht werden sollen.
Bisher hatte ich die Seite nur in 2 Bereiche eingeteilt, und da war das mit den Checkboxen kein Problem. Entweder waren beide Boxen ausgewählt, nur eine der beiden oder keine. Es gab also vier Möglichkeiten, die ich im Skript weiterverarbeiten kann:
if((($_POST["suchbereich1"] == "hauptseite") AND ($_POST["suchbereich2"] == "unterseite"))
{
$datendatei = "komplett.txt";
$suchbereich = "komplett";
}
elseif(($_POST["suchbereich1"] == "hauptseite")
{
$datendatei = "hauptseite.txt";
$suchbereich = "hauptseite";
}
elseif(($_POST["suchbereich2"] == "unterseite")
{
$datendatei = "unterseite.txt";
$suchbereich = "unterseite";
}
...
Bei 6 Checkboxen hätte ich aber 2^6, also 64 Möglichkeiten, was den Code natürlich ein wenig aufbläht ;)
Folgendes habe ich dazu gefunden: "Haben mehrere Checkboxen den gleichen Namen und endet dieser mit den Zeichen [], so werden sie bei der Umwandlung durch PHP in ein Array umgewandelt, das genau die Einträge (mit den jeweils entsprechenden Werten) enthält, deren zugehörige Checkboxen beim Verschicken gesetzt waren. Auf diese Weise lassen sich besonders gut logisch zusammengehörende Mehrfachauswahlen realisieren."
D.h. ich würde jede Checkbox z.B. suchbereich[] nennen, und erhalte ich ein Array: [suchbereich] => Array ( [0] => seite1 [1] => seite2 )
Wie les ich das Array aber jetzt aus, v.a. wenn ich mehrere Boxen aktiviert habe?
Hi,
der Umbau auf die Array-Zugriffsmethode ist aus meiner Sicht zwar sinnvoll, löst aber noch nicht dein eigentliches Problem. Das besteht nämlich darin, dass du die Suchbereiche offenbar alle getrennt voneinander verwaltest, anstatt sie zu "kombinieren". Soll heißen, in der alten Variante ist das Ergebnis von beiden Boxen nicht "hauptseite,unterseite" sondern "komplett". Auf diese Variante brauchst du nunmal deine diversen Möglichkeiten. Ich würde versuchen das System so anzupassen, dass du beliebige Kombinationen einfach additiv nutzen kannst, d.h. wenn jemand die Bereiche a und b anklickt, dann verwendet das System eben "a" und "b" und nicht "a und b".
Dein Zugriff ließe sich dann in einer einzigen Schleife über das Checkboxen-Array realisieren.
MfG
Rouven
Hi,
das wollte ich ja mit diesem Array verwirklichen, dass eben jeweils die passenden Dateindateien genutzt werden.
Nur frag ich mich wie das gehen soll, dass eben alle gewählten Dateien durchsucht werden. Denn bisher isses ja so, dass eine Datei durchsucht wird und dann das Ergebnis ausgespuckt wird.
Leider bin ich nicht so fit in PHP, gibt's vielleicht irgendwo ähnliche Beispiele, damit ich weiß, wie ich das ungefähr angehen könnte?
Also, die Abfrage sollte ja so gehen:
<form method="post" action="ausgabe.php">
<input type="checkbox" name="suchbereich[]" value="1">
<input type="checkbox" name="suchbereich[]" value="2">
<input type="checkbox" name="suchbereich[]" value="3">
<input type="submit" name="senden" value="Senden">
</form>
...
// ausgabe.php
<?php
$suchbereich = $_POST['suchbereich'];
for($i=0;$i<count($suchbereich);$i++)
{
echo $suchbereich[$i];
}
?>
Aber wie kann ich jetzt auf die jeweiligen Datendateien zugreifen!?
echo $begrüßung;
Aber wie kann ich jetzt auf die jeweiligen Datendateien zugreifen!?
Mit Fallunterscheidung.
wenn 1 dann
durchsuche Seite1 und zeige Ergebnis
wenn 2 dann
durchsuche Seite2 und zeige Ergebnis
usw.
Dafür eignen sich mehrere if oder ein switch.
Oder du erzeugst ein Array, das als Keys die Checkbox-Werte enthält und als Wert die Dateinamen und greifst dann in der Schleife auf den jeweiligen Dateinamen über den Schlüssel des Arrays zu. Beachte, dass es sinnvoll ist, Zugriffe auf nicht vorhandene Array-Werte zu unterbinden.
echo "$verabschiedung $name";
Also so in der Art:
<?php
$suchbereich = $_POST['suchbereich'];
echo 'Ausgewählt wurden: ';
for($i=0;$i<count($suchbereich);$i++)
{
if($suchbereich[$i] == 1)
{
$datendatei = "seite1.txt";
$suchbereich = "seite1";
}
if($suchbereich[$] == 2)
{
$datendatei = "seote2.txt";
$suchbereich = "seite2";
}
if(suchbereich[$i"] == 3)
{
$datendatei = "seite3.txt";
$suchbereich = "seite3";
}
...
oder
<?php
$suchbereich = $_POST['suchbereich'];
echo 'Ausgewählt wurden: ';
for($i=0;$i<count($suchbereich);$i++)
{
switch($suchbereich[$i])
{
case 1;
$datendatei = "seite1.txt";
$suchbereich = "seite1";
break;
case 2;
$datendatei = "seite2.txt";
$suchbereich = "seite2";
break;
case 3;
$datendatei = "seite3.txt";
$suchbereich = "seite3";
}
...
Falls "Ja", was wäre denn die bessere Variante? :)
Bei beiden Varianten wird jeweils nur in der letzten ausgewählten Datei gesucht.
Das ist genau das, was ich mir gedacht habe. Wie bring ich dem Teil denn bei die Dateien zu "kombinieren"?
P.S. bitte die Fehler in den obigen Scripten ignorieren ;)
echo $begrüßung;
Es gibt keine "bessere" oder "schlechtere" Variante. Entweder sie erfüllt ihre Aufgabe oder sie macht es nicht oder nur teilweise oder mit Fehleren. Der Rest ist eine Frage der Performance oder der Eleganz.
Bei beiden Varianten wird jeweils nur in der letzten ausgewählten Datei gesucht.
Das ist genau das, was ich mir gedacht habe. Wie bring ich dem Teil denn bei die Dateien zu "kombinieren"?
Nix "kombinieren". Verlagere die Suche oder den Aufruf der Suchfunktion in die Auswerte-Schleife. Ich nehme an, dass er sich jetzt danach befindet.
echo "$verabschiedung $name";
Hi,
also mit "besser" meinte ich eben, ob die eine oder andere Variante schneller arbeitet. Wie gesagt, kenn mich mit PHP kaum aus, daher kann ich nicht sagen wann ich überhaupt switch und wann eine if-Abfrage nehmen sollte.
Vermutlich ist meine Lösung auch viel zu umständlich, denn ich hätte das jetzt so gelöst:
Ich überprüfe, ob ein Bereich durchsucht werden soll. Falls ja, wird der Inhalt der Datendatei dieses Bereichs in eine neue Datei geschrieben. Und so werden alle weiteren zu durchsuchenden Bereiche in diese Datei geschrieben. So habe ich immer eine entsprechende Datendatei für die gewählten Bereiche.
<?php
$dateiname="./admin/data.txt"; //altes Datenfile löschen
unlink($dateiname);
$suchbereich = $_POST['suchbereich'];
for($i=0;$i<count($suchbereich);$i++)
{
if($suchbereich[$i] == 1)
{
$FilePointer = fopen("./admin/1.txt", "r");
$Dateiinhalt = fread($FilePointer, filesize("./admin/1.txt"));
$Dateiname = "./admin/data.txt";
$Schreiben = $Dateiinhalt;
$FilePointer = fopen($Dateiname, "a+");
fwrite($FilePointer, $Schreiben."\n");
fclose($FilePointer);
}
if($suchbereich[$i] == 2)
{
$FilePointer = fopen("./admin/2.txt", "r");
$Dateiinhalt = fread($FilePointer, filesize("./admin/2.txt"));
$Dateiname = "./admin/data.txt";
$Schreiben = $Dateiinhalt;
$FilePointer = fopen($Dateiname, "a+");
fwrite($FilePointer, $Schreiben."\n");
fclose($FilePointer);
}
if($suchbereich[$i] == 3)
{
$FilePointer = fopen("./admin/3.txt", "r");
$Dateiinhalt = fread($FilePointer, filesize("./admin/3.txt"));
$Dateiname = "./admin/data.txt";
$Schreiben = $Dateiinhalt;
$FilePointer = fopen($Dateiname, "a+");
fwrite($FilePointer, $Schreiben."\n");
fclose($FilePointer);
}
if($suchbereich[$i] == 4)
{
$FilePointer = fopen("./admin/4.txt", "r");
$Dateiinhalt = fread($FilePointer, filesize("./admin/4.txt"));
$Dateiname = "./admin/data.txt";
$Schreiben = $Dateiinhalt;
$FilePointer = fopen($Dateiname, "a+");
fwrite($FilePointer, $Schreiben."\n");
fclose($FilePointer);
}
if($suchbereich[$i] == 5)
{
$FilePointer = fopen("./admin/5.txt", "r");
$Dateiinhalt = fread($FilePointer, filesize("./admin/5.txt"));
$Dateiname = "./admin/data.txt";
$Schreiben = $Dateiinhalt;
$FilePointer = fopen($Dateiname, "a+");
fwrite($FilePointer, $Schreiben."\n");
fclose($FilePointer);
}
if($suchbereich[$i] == 6)
{
$FilePointer = fopen("./admin/6.txt", "r");
$Dateiinhalt = fread($FilePointer, filesize("./admin/6.txt"));
$Dateiname = "./admin/data.txt";
$Schreiben = $Dateiinhalt;
$FilePointer = fopen($Dateiname, "a+");
fwrite($FilePointer, $Schreiben."\n");
fclose($FilePointer);
}
}
$datendatei = "./admin/data.txt";
$bereich = "bereich";
...
?>
Das ist bis dato das längste und anspruchsvollste, von mir selbst geschriebene Script.
Kann man mit sowas grausamem leben, oder ginge das auch viel eleganter :D
So wie ich dich verstehe, würdest du das ganze irgendwo "on the fly" machen, also ohne alle Datendateien zwischenzuspeichern!?
echo $begrüßung;
Vermutlich ist meine Lösung auch viel zu umständlich, denn ich hätte das jetzt so gelöst:
Eine Regel beim Programmieren lautet: DRY = Don't repeat yourself.
Code-Teile, die man durch Copy'n'Paste vervielfachst, sollte man lieber in eine Funktion stecken. Variable Anteile dieser Code-Teile werden dabei als Parameter übergeben. Funktionen haben den Vorteil, nur eine Stelle warten zu müssen, wenn sich Änderungen oder Korrekturen ergeben.
Kann man mit sowas grausamem leben, oder ginge das auch viel eleganter :D
Sicherlich sowohl als auch. Ich weiß nicht, was du insgesamt vorhast und wie der Rest deines Scripts aussieht. Deswegen kann ich dir zu deinem hier gezeigten Ausschnitt nicht sagen, ob er für das Ganze dienlich ist oder nicht. Aber vielleicht kann das Schreiben der Datei wegfallen. Als Zwischenablage eignen sich auch Datenstrukturen, die sich schrittweise erweitern lassen, beispielsweise ein Array.
echo "$verabschiedung $name";
Den Rest des Scripts gäb es hier: http://kaese.privat.t-online.de/suche.zip
Ich klöppel meinen Code da quasi nur oben dran :)
Leider hab ich jetzt festgestellt, dass das mit dieser Datei nicht klappt, da die Suche eine Blätterfunktion hat und beim Blättern die Datendatei immer gelöscht wird :(
Das hät sonst sehr schön funktioniert.
Naja mal sehn, ob ich das irgendwie anders hinbekomme - auch wenn ich noch keine Ahnung habe wie :D
Aber trotzdem danke für deine Unterstützung :)