Kann man Arrays in einer MySQL speichern

Der_Jan

Der_Jan

Aktives Mitglied
Thread Starter
Dabei seit
06.01.2004
Beiträge
712
Reaktionspunkte
30
Guten Morgen,
ich wage die ersten Schritte mit "Arrays" und habe eine triviale Frage:
Kann man Arrays als ganzes in ein Feld einer MySQL speichern? Oder muss ich erst alle Daten aus dem Array rausholen und einzeln abspeichern?

Mit der Bitte um Erleuchtung ;)
Der Jan
 
Da stellt sich nat. zunächst mal die Frage womit ;)

grundsätzlich lassen sich in vielen Sprachen Array serialisieren. Das heißt aus einem Array wird einfach ein langer String gemacht, der Inhalt und Struktur des Arrays enthält. Man braucht dann den String nur in einer DB als varchar oder BLOB zu speichern und gut ist's.
Das auslesen erflogt umgekehrt als Zeichenkette, die dann per deserialisierung einem Array bei Initialisierung übergeben wird und man hat wieder ein Array aus der DB gelesen.

Je nach Zahl der Spalten ( und ihrer Bedeutung), mag es aber ggf. auch sinnvoller sein die "Array-Spalten" benannten DB-Spalten zuzuordnen und die Werte jeweils extra abzulegen.
 
wegus schrieb:
Da stellt sich nat. zunächst mal die Frage womit ;)

Oha, ich hätte PHP erwähnen sollen ;)

Was darf ich mir unter "serialisieren" vorstellen?

Ich hatte es mir wie folgt gedacht...

PHP:
<?
include ("inc/connect.inc.php");  
$id='11';
$staedte=array("hamburg","berlin","stuttgart","wien");
mysql_db_query("$db","insert into europa (id,staedte) values ('$id','$staedte')");  

// Nun ist das Array in der Datenbank drinnen
// Und jetzt das Array wieder abfragen

$result=mysql_query("select staedte from europa WHERE id='11'"); 
if($result)
	{
	while ($s=mysql_fetch_array($result))
		{
		$staedte=$s['staedte'];
echo implode("-",$staedte);

// Hier hätte ich nun gerne die Ausgabe "hamburg-berlin-stuttgart-wien", nur klappen will es nicht
}
}
?>

BTW, gibt es eigentlich einen Editor, der php ordentlich einrücken kann?
Gruß
Der Jan
 
Jetzt natürlich auch die Frage, wozu das ganze. Denn vielleicht wäre es auch einfacher, und sinnvoller für die Werte, die in das Array kommen, eine neue Tabelle anzulegen...

Aber "serialize" kannte ich auch noch nicht. Interessant.

PS.: Theoriethis geht das auch mit einem implode und Explode, wobei das Trennzeichen dann so zu wählen ist, dass es in den Strings, die gespeichert werden nicht vorkommt. Und die Indexe gehen verloren

gruß
Lukas
 
koli.bri schrieb:
Jetzt natürlich auch die Frage, wozu das ganze. Denn vielleicht wäre es auch einfacher, und sinnvoller für die Werte, die in das Array kommen, eine neue Tabelle anzulegen...

In dem Array wollte ich die Rubriken abspeichern, die ein User nutzen darf (z.b. $user_rights="redsys","forum","voting"). Entsprechend der Arrayeinträge dann die Navigation ausgeben lassen. Dachte mir, dass ein Array schnell und schlanker arbeitet als eine komplette Tabellenabfrage. Weshalb denkst du, ich sollte lieber eine neue Tabelle anlegen?

Gruß
Der Jan

P.S.: Gibt es eigentlich eine maximale Anzahl an Session-Variablen die man einhalte sollte, um keine Systemprobleme zu bekommen?
 
Zuletzt bearbeitet:
Ach so...
Hm, dafür würd hätt ich mir jetzt irgendwas kompliziertes gebastelt, wie die funktion error_reporting mit ihren Parametern...

Ne, Spatz beiseite, ich weiß jetzt zwar nicht, was Du für ein Projekt hast, aber vielleicht ist folgendes auch eine Überlegung wert:

Eine Extra-Rechtetabelle. Dort wird die ID des Rechteprofils gespeichert (ist ja klar), und die verschiedenen Möglichkeiten, die man machen kann als BOOL-Werte

Beispiel:
ID -> ID des Profils:
passwort_aendern -> 1 = Darf Passwort ändern / 0 = Darf Passwort nicht ändern
Beitraege_schreiben -> 1 = Darf Beiträge schreiben / 0 = Darf keine Beiträge schreiben
Admin_bereich -> 1 = Darf in den Admin-Bereich / 0 = Darf nicht in den Atminbereich

Im PHP-Script wird dann vor den entsprechenden Funktionen abgefragt, ob der Benutzer die entsprechenden Rechte hat.
Das hätte doch den Vorteil, dass man die Rechte recht einfach verwalten kann (Anhand von Profilen), man kann schnell Profile hinzufügen, ohne jetzt bei allen Usern das gespeicherte Array neu einzulesen.
Falls den Usern was verboten/erlaubt werden soll, muss man nicht alles gespeicherten Arrays auslesen und wieder wegspeichern...
Falls neue "Berechtigungsarten" hinzukommen, kann man die Tabelle einfach erweitern
(Wie zum Beispeil eine neu hinzukommende Galerie, für die nicht alle eine Berechtigung bekommen)

Dafür dann einmal eine Funktion geschrieben, die eine Array mit den REchten zurückgibt, und das wars...

Von der Performance, keine Ahnung. SQL ist recht schnell, auch wennich gerade von MySQL gehört habe, dass es nicht so flott ist. Aber es gibt eh nur eine wahre alternative zu SQL: RPG-Zyklusprogramme!!! (sagt zumindest der Chef ^^)

Aber dash ab ich mir jetzt auch innerhalb von fünf Minuten ausgedacht, wird wohl noch bessere Möglichkeiten dafür geben...


Aber da wird wohl jeder seine eigene Idee haben, falsch ist die Idee nicht. und blöd auch nicht.

gruß
Lukas
 
Ach so, zu den Sessions: Das kommt auf den Server an. in irgendeinem Tutorial hab ich da, glaube ich, mal Richtwerte gelesen. Die hab ich aber wieder vergessen, weil sie unwichtig wahren, ich würde mir da keine Sorgen machen, wenn du cnith gerade versucht ein Forum wie dieses hier privat auf einem kleinem Rechner zu hosten...
 
Der_Jan schrieb:
Okay, aber wie bringt man das Programm zum laufen? Muss da noch kompiliert werden?

Weiß jetzt nicht, was Du da heruntergeladen hast... Aber das, was ich zuerst geboten bekommen habe, war PHP selbst.
Das Programm gibt es irgendwo anders auf der Seite, ich meine bei "Produkte" und dann "Zend Suite" oder so ähnlich.
Aber guck dir vorher die Preise an...
Als Privatmensch lohnt sich das kaum...
 
also das das mit dem array so wie du das gemacht hast nicht funktioniert ist klar.
denn du schreibst nicht den array sondern die referenz(pointer) auf den array in die db.
und holst diesen dann wieder raus.

ohne ne funktion die dir die arrays splittet gehts nicht.
 
Der_Jan schrieb:
BTW, gibt es eigentlich einen Editor, der php ordentlich einrücken kann?
Gruß
Der Jan
Für Windows benutze ich Weaverslave, das ist in meinen Augen einer der besten Editoren überhaupt.
Auf dem Mac hab ich z.Zt. Smultron, weiss aber so richtig begeistert bin ich noch nicht davon. SubEthaEdit wird hier auch öfter genannt, ist gar nicht schlecht.

Gruss
-theHobbit-
 
Ich mag Textwrangler gern, da kann man sogar die ShortCut-Hilfe von ADC auf die PHP-Seiten umlenken. FTP-Client ist ebenfalls integriert. Das ersetzt zwar noch keine ganze IDE wie ZEND STudio, ist aber schon sehr brauchbar!
 
koli.bri schrieb:
Jetzt natürlich auch die Frage, wozu das ganze. Denn vielleicht wäre es auch einfacher, und sinnvoller für die Werte, die in das Array kommen, eine neue Tabelle anzulegen...

Aber "serialize" kannte ich auch noch nicht. Interessant.

PS.: Theoriethis geht das auch mit einem implode und Explode, wobei das Trennzeichen dann so zu wählen ist, dass es in den Strings, die gespeichert werden nicht vorkommt. Und die Indexe gehen verloren

gruß
Lukas


ich habe mal für eines meiner kleineren Projekte Arrays mittels serialize in meiner DB abgelegt. ich muss allerdings gestehen, dass ich das bei höherem Traffic nicht machen würde, da es mehr Aufwand ist, die Daten auszulesen. Ich glaube zumindest, dass die Seitengenerierung deshalb in hochfrequentierten Zeiten darunter gelitten hat, oder aber an meinem Server (shared webserver) oder an einem unsauberen Code.
Ich würde dazu raten die Daten in verschiedenen Spalten abzulegen.
 
Dommy schrieb:
Ich glaube zumindest, dass die Seitengenerierung deshalb in hochfrequentierten Zeiten darunter gelitten hat, oder aber an meinem Server (shared webserver) oder an einem unsauberen Code.

Arrays sind in PHP nicht sehr Performant realisiert. Bei Zugriffen mit hohem Traffic sollte man damit sparsam sein, das stimmt schon!
 
Okay, ich habe die Idee noch einmal durchdacht. Wie schon erwähnt, ich will eine Art Zugriffskontrolle programmieren, und das ganze wie folgt

Schritt 1: Ich lege eine MySQL-Tabelle user_rights an, in der für jeden User die Nutzungsrechte geregelt sind (z.B. 1=darf zugreifen, 0=kein Zugriff).

Schritt 2: Beim Userlogin wird die entsprechende Datensatz aus der Tabelle ausgelesen und in einen Array gespeichert.

Hier kommt mir die Frage: Kann ich einen Array als Session-Variable speichern, so dass der User bis zum Logout die Nutzungsrechte mit sich trägt?

Schritt 3: Immer, wenn die Frage nach Nutzungsrechten gefragt werden muss (z.B. Zugang zum RedSys), wird im Array nachgeschaut (mittels in_array), ob entsprechender Wert auf 1 gesetzt ist.

Frage an die Experten: Ist das eine machbarer (=sinnvoller) Ansatz oder gibt es einen noch einfacheren Weg?

Danke!!! ;)
Der Jan
 
ist machbar! Als alter Bit-Zähler würd ich aber sogar nur einzelne Bits nehmen:

1-->Zugang Gruppe 1
2-->Zugang Gruppe 2
4-->Zugang Gruppe 3
.
.
.

wer eine ZugangsID von 13 hat, darf somit in Gruppe 4,3 und 1 mitspielen, daß läßt sich einfach per

if ($_SESSION['ZugangsID'] & $GRUPPE4) abfragen ;)


Session-Variable verbleiben auf dem Server, bis die Session beendet wird, der USer schleppt dabei immer seine ID mit! Also kein Problem einer solchen Realisierung!
 
???

hab hier mal interessehalber mitgelesen, wegus, was tust du da? :eek:
ist das aehnlich gedacht wie access permission von 0-7 auf unixen? (hab ich nie kapiert.)
 
talla schrieb:
???

hab hier mal interessehalber mitgelesen, wegus, was tust du da? :eek:
ist das aehnlich gedacht wie access permission von 0-7 auf unixen? (hab ich nie kapiert.)


Ja talla, wir PC-Dinosaurier zählen noch Bits ;)
Wenn ich n ur 8-16 Rollen spezifizieren muß, reicht das ja auch noch locker!
 
Zurück
Oben Unten