checkboxen array als db abfrage
systom
- php
Hallo Zusammen,
Ich habe 90 FormFelder Diese werden als Array an ein Suchscript gesendet.
<input type="text" name="rupr[]" value="spaltenname1">
<input type="text" name="rupr[]" value="spaltenname2">
<input type="text" name="rupr[]" value="spaltenname3">
<input type="text" name="rupr[]" value="spaltenname4">
<input type="text" name="rupr[]" value="spaltenname5">
...usw
Nun möchte ich die ganze Tabelle (90 Spalten) durchsuchen. Für die Spaltennamen der DB Abfrage sollen die value´s
der checkboxen benutzt werden:
$val0 = $rupr[0];
$val1 = $rupr[1];
$val2 = $rupr[2];
$val3 = $rupr[3];
$val4 = $rupr[4];
$val5 = $rupr[5];
...usw
$val86 = $rupr[90];
$query_such1 = "SELECT * FROM Tabelle
WHERE
$val0='1' && $val1='1' && $val2='1' && $val3='1' && $val4='1' && $val5='1'.....$val90='1'
GROUP BY ID
ORDER BY Name1 ASC";
Ergebnis soll sein:
in der jeweiligen Spalte soll geprüft werden, in welcher zelle eine 1 steht -->
Gib den Datensatz aus-->
Wenn weniger suchbegriffe eingegeben werden ignoriere den leeren string und suche nur nach der eingabe-->
Wie muss ich den array behandeln und die Query für die Datenbank bilden
Vielen Dank im Voraus
Tom
Begriff 1 = der value des input rupr[0]
Begriff 2 = der value des input rupr[1]
Begriff 90 = der value des input rupr[90]
----+------------+-------------+----------+-------+---------+-------+
id | begriff1 | begriff1 | begriff90| plz | Name | Str |
----+------------+-------------+----------+-------+---------+-------+
1 | 0 | 0 | 1 | 12345 | Firma 1 | Str 1 |
2 | 1 | 1 | 1 | 12345 | Firma 2 | Str 2 |
3 | 0 | 1 | 0 | 12345 | Firma 3 | Str 3 |
4 | 1 | 0 | 1 | 12345 | Firma 4 | Str 4 |
5 | 0 | 1 | 1 | 12345 | Firma 5 | Str 5 |
6 | 1 | 0 | 0 | 12345 | Firma 6 | Str 6 |
----+------------+-------------+----------+-------+---------+-------+
Hi,
Nun möchte ich die ganze Tabelle (90 Spalten) durchsuchen.
Du möchtest Dich mit Normalisierungen beschäftigen. Mit annähernd 100%iger Sicherheit wäre hier eine 1:n-Beziehung sinnvoll - bzw. deutlicher gesagt: Alles andere als eine 1:n-Beziehung sinnfrei.
$query_such1 = "SELECT * FROM Tabelle
"SELECT *" ist *nur* für Testzwecke sinnvoll. Im Livebetrieb hat sowas nichts verloren! Siehe Archiv.
$val0='1' && $val1='1' && $val2='1' && $val3='1' && $val4='1' && $val5='1'.....$val90='1'
Du möchtest das Statement abhängig von den vorliegenden Daten generieren.
Cheatah
Du möchtest das Statement abhängig von den vorliegenden Daten generieren.
Genau, abgesehen von 1:n usw. Möchte ich diese Tabelle erhalten.
Das letztere wüsste ich gerne, wie ich es umsetzen muss!
Vielen Dank
Tom
Hi,
Du möchtest das Statement abhängig von den vorliegenden Daten generieren.
Das letztere wüsste ich gerne, wie ich es umsetzen muss!
mittels simpler String-Operationen baust Du Dir genau jenes Statement zusammen, welches im aktuellen Kontext benötigt wird.
Cheatah
mittels simpler String-Operationen baust Du Dir genau jenes Statement zusammen, welches im aktuellen Kontext benötigt wird.
Hast du ein Beispiel
Danke
Hi,
mittels simpler String-Operationen baust Du Dir genau jenes Statement zusammen, welches im aktuellen Kontext benötigt wird.
Hast du ein Beispiel
wo ist Dein Problem?
Cheatah
Hello,
ich hatte Dir in Deinem letzen Posting schon geschrieben, dass das hier nach Normalisierung schreit. Ich bin auch kein unbedingter Freund von Normalisierung um jeden Preis, aber hier handelt es sich ja eindeutig um Felder mit gleichem Typ. Da sehe ich nur Vorteile in der Normalisierung.
Noch ein paar Worte zu Abfragen mit logischen Werten. Der Browser überträgt nur ausgewählte Logische Felder. Dazu gehören:
Da in den heute gebräuchlichen Datenbanken die (logischen) Felder immer drei Zustände haben, sollte man auch das berücksichtigen.
logisch | Als Wert | Beispiele
--------+------------------------------------+------------------------
Man sollte also beim Design der Abfragen immer darauf achten, ob NULL auch für FALSE stehen darf, da ja der Browser bei leeren logischen Feldern eigentlich nur NULL (nämlich nichts) übertragt und nicht definiert FALSE.
Wenn man eine sichere Ausscheidung zwischen FALSE und TRUE benötigt, muss man auf Checkboxen verzichten und stattdessen eine Radio-Gruppe einsetzen. Die kann dann auch drei Zustände kennzeichen: JA - NEIN - WEISSNICHT
Und da sind wir an Deiner Frage angekommen:
Wie kann man die übertragenen Daten in eine Abfrage umwandeln?
Man bastelt sich eine Funktion, die je nach JA,NEIN,WEISSSNICHT ein Stückchen WHERE-Klausel zurückliefert.
Wenn man die Radios per Namen geschickt Bindet, kann man diese Funktion dann anschließend in einer Schleife aufrufen und hat für 90 Abfragewerte nur wenige Zeilen Schreibarbeit.
<input type="radio" name="rad[Wert1][JA]" value="1">
<input type="radio" name="rad[Wert1][NEIN]" value="1">
<input type="radio" name="rad[Wert1][EGAL]" value="1">
<input type="radio" name="rad[Wert2][JA]" value="1">
<input type="radio" name="rad[Wert2][NEIN]" value="1">
<input type="radio" name="rad[Wert2][EGAL]" value="1">
wobei Wert1, Wert2, ... für die Spaltennamen der tabelle steht.
Im PHP-Script baut man sich ein Array mit den Namen aller zu berücksichtigenden Spalten, damit man sich nicht irgendwas hässliches von außen einfangen kann:
$_radlist = array("Wert1","Wert2","Wert3",...);
Wenn der Post dann im Script ankommt, kann man das Where-Statement aufbauen:
$where = "" ; # oder was eben schon drinsteht...
$op = "and"; # Der Verknüpfungsoperator
foreach($_radlist as $spalte)
{
if (isset($_POST["rad"][$spalte]["JA"]))
{
$where .= " $op $spalte = true";
}
elseif(isset($_POST["rad"][$spalte]["NEIN"]))
{
$where .= " $op $spalte = false";
}
}
Wenn Du willst, kannst Du auch noch auf Fake prüfen vorher. $_POST["rad"] muss ja genausoviele Werte haben, wie $_radlist und jeder $_POST["rad"][$spalte] darf nur genau ein Element haben und als Value muss immer 1 drinstehen...
Und dann lässt Du Dir mal $where ausgeben zur Kontrolle.
Aus der $_radlist lass sich auch die <input>s per Schleife erzeugen, sodass Bu nur alles einmal und 90Mal scheiben musst.
Habe ich nun alle Klarheiten endgültig beseitigt?
Liebe Grüße aus http://www.braunschweig.de
Tom
Hello,
die berühmten kleinen Fehler. Muss natürlich ein Vergleich sein und keine Zuweisung!
foreach($_radlist as $spalte)
{
if (isset($_POST["rad"][$spalte]["JA"]))
{
$where .= " $op $spalte === true"; # oder was die DB für TRUE nimmt
}
elseif(isset($_POST["rad"][$spalte]["NEIN"]))
{
$where .= " $op $spalte === false"; # oder was die DB für FALSE nimmt
}
}
Liebe Grüße aus http://www.braunschweig.de
Tom
Hello,
und nochmal im Kreis *gg*
Im SQL-Statement ist es ja trotzdem nur ein einfaches "=" ...
$true = "1";
$false = "0";
foreach($_radlist as $spalte)
{
if (isset($_POST["rad"][$spalte]["JA"]))
{
$where .= " $op $spalte = $true"; # oder was die DB für TRUE nimmt
}
elseif(isset($_POST["rad"][$spalte]["NEIN"]))
{
$where .= " $op $spalte = $false"; # oder was die DB für FALSE nimmt
}
}
Liebe Grüße aus http://www.braunschweig.de
Tom