Array in db schreiben ok, aber wie durchsuche ich den per WHERE ?

x3008x

Mitglied
Guten Abend zusammen,
aus Performance-Gründen (da direkt mal eine Frage... was geht mehr auf die leistung, ein langer quellcode oder massenweise tabelleneinträge... nehmen wir zb. an ein user kann 10 sachen ein- und ausstellen... dann würde ich 10 bool-spalten nehmen... ist das von der leistung her besser wenn ich nur eine nehme und dann mit arrays arbeite?) also aus Performance-Gründen möchte ich gerne mehrere Werte (Array) in eine Spalte der db schreiben...
würde ja beispielsweise mit base64_encode(gzcompress(serialize($xxx))) gehen...
Ausgeben mit unserialize(gzuncompress(base64_decode($xxx))) ...
(Das hab ich übrigends auch hier aus dem forum)
So wie arbeite ich jetzt bei WHERE mit arrays?
Folgendes Beispiel:
PHP:
<?php
$array = array("a" => "1", "b" => "2");
$string = base64_encode(gzcompress(serialize($array)));

# ... Schreibe umgewandelten String > eJxLtDKyqi62MrRSSlSyBtOGUDoJShspWdcCAL8nCYI= in Datenbank ...

# Durchsuche in Datenbank den String
$LD_1 = mysql_query("SELECT * FROM user WHERE settings['a'] ='1'");
while($LD1 = mysql_fetch_array($LD_1)) {
$username = $LD1['username'];
echo "$username<br>"; }
?>

WHERE settings['a'] ='1' ist natürlich quatsch... ich hab keine idee wie ich das lösen könnte...
Also ich könnte natürlich auch mit implode und explode arbeiten... zb. werte mit kommata trennen aber auch da wüsste ich nicht wie ich damit die db durchsuchen kann

habe auch mal zum testen folgendes probiert:

PHP:
$test = "test";
$string = base64_encode(gzcompress(serialize($test)));

$o1 = mysql_query("SELECT * FROM user WHERE settings = '$string'");
$o1_ = mysql_fetch_array($o1);
$o1_name = $o1_['name'];
echo $o1_name;

Obwohl da die vergleichenden Werte ja genau gleich sind (habe per echo nachgeguckt und in die tabelle geschaut,bei beiden eJwrtjKxUipJLS5RsgYAFCoDWw==) gibt er nichts zurück...

Ich hoffe jemand hat eine Idee... ansonsten muss ich halt ganz viele Spalten anlegen...
Danke schonmal - Rick
 
Naja...die Sache mit dem Array ist eher suboptimal, denn Mysql bietet nicht das rechte Handwerk dafür, soetwas zu verarbeiten.

Wenn du die 10 oder mehr Spalten nicht willst, gäbe es noch eine Variante, bei der du ein UNSIGNED INT benötigst. Dort gibst du ein Integer ein, worin sich bis zu 32 "Sachen" ein-/ausstellen lassen.

Um bildlich darzustellen, worauf ich hinauswill, hier mal etwas zum Testen:
http://doktormolle.de/temp/javascript_dec2bin.htm

In den weissen Spalten findest du 32 "Berechtigungen" und ihre dezimalen + binären Entsprechungen.

Unten in der schwarzen Fusszeile, die Dezimalzahl, wäre je nach "Sachen" das, was du in der DB speicherst.

Der Zugriff per SQL erfolgt dann über ein bitweises AND.


Willst du bspw. alle User ermitteln, welche die Katze braten dürfen(Berechtigung hat dort Dezimalwert 4096)...dann sähe das Query so aus:
Code:
SELECT username FROM usertabelle WHERE 4096 & berechtigungsspalte

Das bitweise AND prüft in dem Fall, ob das eine Bit, welches in 4096 gesetzt ist, auch in dem Wert in berechtigungsspalte gesetzt ist...wenn ja, darf der User die Katze braten :-)
Es lassen sich auch mehrere Bits gleichzeitig prüfen...halt alle möglichen Kombinationen aus den 32 "Berechtigungen".
Wogegen du prüfen musst, steht immer unten in der Fusszeile.


Datenbank-Puristen würden aber eher die 10 Spalten bevorzugen, glaube ich :suspekt:
Aber wieauchimmer....deine Array-Variante ist performancemässig die denkbar schlechteste der 3 Varianten: komplizierter Zugriff+ meister Speicherverbrauch
 
Zurück