Seite 1 von 2
mySQL/PHP: Suchoptionen abspeichern
Verfasst: 24.04.2012 11:02
von Wuppi
Hi
ich bastel gerade an einer Seite wo man mehrere Suchoptionen hat (mehrere Radio-Buttons, Checkboxen (mit bis zu 12 möglichen haken), ein Eingabefeld, Dropdown-Menus.). Jetzt möchte ich natürlich ungern das der User mit jedem Aufruf dieses neu eintragen muss. Wie speichert man sowas am idealsten? (in DB)
Die Radiobuttons stell ich mir noch einfach vor:
Tabelle: Sucheinstellung
UserID
RadioGeschlecht
=> ich speichere dann einfach das was ausgewählt wurde, so in die DB. Bei erneutem Aufruf frag ich einfach ab ob in der "Sucheinstellung"-DB schon eine Suche gespeichert ist. Ja => ich übernehme den kram. Aber ich weiß nicht wie man mit Checkboxen umgeht - da hab ich dann halt u.u. 12 Einträge in dem Tabellenfeld.
Gruß
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 24.04.2012 15:39
von gn#36
Du könntest z.B. ein Bitfeld nehmen. Hierfür würdest du lediglich eine Zahl in der Datenbank speichern. Aus dieser Zahl kannst du einzelne Bits abfragen um herauszufinden, ob das jeweilige Feld gesetzt ist oder nicht.
Z.B:
Code: Alles auswählen
define('B_REVERSE_RESULTS', 1);
define('B_SEARCH_FOR_AUTHORS', 2);
define('B_LAST_TEN_DAYS_ONLY', 4);
define('B_ENABLE_FORUM', 8);
define('B_ENABLE_KB', 16);
define('B_ENABLE_WEBSITE', 32);
//... usw. in Zweierpotenzen
//...
//... Später dann:
$sql = 'SELECT options FROM tabelle';
//...
if($row['options'] & B_REVERSE_RESULTS != 0)
{
// REVERSE_RESULTS ist gesetzt
}
if($row['options'] & B_LAST_TEN_DAYS_ONLY == 0)
{
//LAST_TEN_DAYS_ONLY ist nicht gesetzt
}
//...
// beim Schreiben dann:
// Hinzufügen einer Option:
$row['options'] = $row['options'] | B_REVERSE_RESULTS;
// Entfernen einer Option:
$row['options'] = $row['options'] & ~B_REVERSE_RESULTS;
// Toggle einer option:
$row['options'] = $row['options'] ^ B_REVERSE_RESULTS;
Siehe auch
http://php.net/manual/en/language.operators.bitwise.php
Wenn du nur einzelne Teile aus der Datenbank abfragen musst kannst du die Bitweisen Operationen theoretisch auch direkt in der SQL Abfrage durchführen:
http://dev.mysql.com/doc/refman/5.0/en/ ... tions.html
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 24.04.2012 23:43
von Wuppi
uff ... ich wusste das dieses Thema das kompliziertere wird
Code: Alles auswählen
a:18:{s:9:"packageID";i:48;s:5:"query";s:4:"test";s:6:"result";a:3:{i:0;a:2: .......................
so sieht nen abgespeicherte suche aus ... doll ... böhmische Dörfer

Ist das sowas was du meinst? phpbb3 speichert ja auch sowas kryptisches ab.
In der Tabelle hab ich somit eine Spalte "UserID" und "Optionen"
In Optionen hau ich halt das gedöns rein ... aber wie erstell ich das? Rall das System leider net so wirklich.
define('geschlecht', 1); // kann m, w, b haben (radio; nur eines möglich)
define('altervon', 2); // 16-70 als Wert (dropdown; nur eines möglich)
define('haarfarbe', 4); // braun, blond, rot .... (checkboxen - also mehreres möglich)
..... ?

Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 25.04.2012 00:30
von Pyramide
Wuppi hat geschrieben:Code: Alles auswählen
a:18:{s:9:"packageID";i:48;s:5:"query";s:4:"test";s:6:"result";a:3:{i:0;a:2: .......................
so sieht nen abgespeicherte suche aus ... doll ... böhmische Dörfer

Das ist [php:serialize]
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 25.04.2012 15:31
von gn#36
Wenn du das alles etwas platzsparender ablegen willst musst du dich wohl oder übel mit Binäroperationen beschäftigen. Serialize ist natürlich auch eine sehr einfache Option wenn du die Daten die du so speicherst nicht per SQL durchsuchen musst und der Speicherbedarf nicht so wichtig ist (weil z.B. nur wenige Datensätze gespeichert werden müssen). Dann kannst du die Daten einfach in ein großes Array legen und dieses per serialize in einen String verwandeln den du in der DB ablegst. Per SQL zwar fast unmöglich zu durchsuchen, aber wenn du die Daten eh nur ausliest, wenn du die Optionen für den User benötigst ist das vermutlich so ziemlich die einfachste Option.
Ansonsten zu meinem ursprünglichen Vorschlag:
Wuppi hat geschrieben:
define('geschlecht', 1); // kann m, w, b haben (radio; nur eines möglich)
define('altervon', 2); // 16-70 als Wert (dropdown; nur eines möglich)
define('haarfarbe', 4); // braun, blond, rot .... (checkboxen - also mehreres möglich)
Ich hatte übersehen, dass du nicht nur Checkboxen hast sondern auch Optionen mit mehr Möglichkeiten. Für jede Checkbox brauchst du genau ein Bit, also brauchst du genau ein define pro Checkbox. Für Optionen mit mehr Auswahl brauchst du ein paar mehr Bits: 1 Bit für 2 Optionen, 2 Bit für bis zu vier, 3 Bit für bis zu 8, vier Bit für bis zu 16 usw. Hier entspricht dann der genaue Zustand der Bits der jeweiligen Option d.h. das funktioniert dann etwas anders. Wenn wir zum Beispiel nur eine Option mit vier Auswahlmöglichkeiten haben (sofern "nichts Ausgewählt" auch noch möglich ist ist das eine zusätzliche Option die mitgezählt werden muss!) dann könntest du das so realisieren:
Code: Alles auswählen
define('OPTION_1', 0); //Bitweise: 00
define('OPTION_2', 1); // 01
define('OPTION_3', 2); // 10
define('OPTION_4', 3); // 11
define('OPTION_ALLE_BITS_GESETZT', 3); //das würde auch bei nur 3 optionen auf 3 stehen
//Die Option ist in der Variable $option gespeichert
if($option & OPTION_1 == $option & OPTION_ALLE_BITS_GESETZT)
{
//Option 1 ist ausgewählt
}
if($option & OPTION_4 == $option & OPTION_ALLE_BITS_GESETZT)
{
//Option 4 gesetzt
}
//Zum auswählen
//Erst die Bits auf 0 setzen (& ~OPTION_ALLE...)
//Dann die gewünschte Option setzen ( | OPTION_1
$option = ($option & ~OPTION_ALLE_BITS_GESETZT) | OPTION_1;
Du kannst beide Vorschläge parallel bei den gleichen Variablen verwenden, solange du die verwendeten Bits nicht durcheinander wirfst. Wenn du also z.B. wie oben die beiden niederwertigsten Bits mit einer Optionsliste belegt hast kann die nächste Checkbox logischerweise erst das dritte Bit nutzen und liegt dann eben bei 4 (=100) und nicht mehr bei 1 (=001), da 0-3 (=000-011) durch die Optionen belegt sind.
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 25.04.2012 18:51
von Wuppi

Ich rall das nett
Wie sieht es mit ner Quick&Dirty-Lösung aus?
Ich erstelle eine weitere Tabelle: UserID, Option1, Option2, Option3 .. Option14. Für jeden Punkt im Formular eine spalte.
Wenn ich jetzt das Formular ausgefühlt habe, wird in die DB
UserID=123
Option1=braun;blond;rot
Option2=ja
Option3=nein
...
geschrieben.
Wenn ich das Formular aufrufe => wird diese Tabelle abgefragt ... UserId gesucht, Option1..14 ausgelesen, verarbeitet. Die Boxen etc. entsprechend markiert (checked/selected), das Suchergebniss ausgeworfen.
Hört sich nur sehr performancefressend an?
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 25.04.2012 21:32
von gn#36
Quick & Dirty ist [php:serialize]. Alles in ein Datenbankfeld vom Typ Text o.ä.
Du speicherst alles in ein array und übergibst es an serialize. Das Ergebnis ist ein string den du in die DB speicherst. Wenn du die Daten brauchst dann holst du den String wieder raus und schickst ihn durch unseralize woraufhin du wieder ein Array mit allen Daten hast. Sehr simpel und schnell. Solange du nicht nach diesen Daten in der DB suchen musst auch eine sehr gute Lösung, es sei denn du musst auf den Speicherplatz achten.
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 25.04.2012 22:23
von Pyramide
Was spricht eigentlich dagegen, die Daten ganz normal in eine Datenbankspalte pro Wert zu speichern?
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 28.04.2012 15:20
von Wuppi
@gn: oh das ist serialize .. muss mich also gar nicht damit auseinandersetzen wie der kram in der DB ausschaut ... Array -> serialize -> kryptischen kram in eine Spalte schieben -> wieder raus aus der db -> unserialize -> array normal auslesen. Gefällt mir. Gesucht werden muss in der Tabelle nix - von daher ist das wurscht.
@pyramide: mhh war das nicht das was ich als quick&dirty beschrieben habe? 14 Tabellenspalten - für jeden Formularpunkt eine. Mit abspeichern werden die 14 Spalten mit den aktuellen Settings gefüllt.
Welche der beiden Varianten wäre den Resourcenschonender?
Noch eine Frage:
Ich möchte verhindern das Leute sich den Spass machen einfach mal 10x auf "Absenden" zu drücken OHNE das am Formular was geändert wurde.
Also aktuell läuft es so:
1. User ruft Seite auf
2. es wird geprüft ob eine Sucheintrag existiert
2a. nein: es erfolgt eine Ausgabe mit paar Standardwerten (Formular Vorbelegung und Ausgabe des Suchergebnisses)
2b. ja: der Sucheintrag wird ausgelesen und die Suche losgetreten (Formular Vorbelegung und Ausgabe des Suchergebnisses)
3. der User kann jetzt von Seite 1 bis x navigieren (noch nicht implementiert)
4. drückt er jetzt ohne etwas zu ändern auf Absenden - soll NIX passieren. (noch nicht implementiert)
4. würde ja bedeuten das 10x nen SELECT ausgeführt wird um mir den DB-Inhalt anzuzeigen, aber auch 10x nen REPLACE um die Einstellungen zu sichern. Diesen Missbrauch/Fehlbedienung möchte ich halt vermeiden. Da ich hier jetzt nichts böses unterstellen will

würde es ja eigentlich reichen wenn ich per JavaScript den "Absende"-Button nur einblende wenn irgendwas am Formular geändert wurde? Mein aktuelle Idee: ich gebe den Leuten die Befriedigung die Datenbank unnötigerweise zu penetrieren - es passiert aber einfach nichts.
Gruß
Re: mySQL/PHP: Suchoptionen abspeichern
Verfasst: 28.04.2012 20:38
von gn#36
Wenn ich dich richtig verstanden habe, dann würde ich das so machen:
Wenn die Seite geladen wird, auf der erst nach Änderungen was passiern soll, dann deaktivierst du per Javascript den Button zum Starten. (Direkt deaktiviert im HTML würde ich nicht machen, da dann bei deaktiviertem Skript die Seite unbenutzbar ist.)
Anschließend aktivierst du bei jeder Änderung am Formular den Button (onChange der Steuerelemente z.B.).
Schließlich deaktivierst du nach einem Klick auf den Button selbgen ebenfalls wieder.