Mehrere Tags bzw. Array in einer Zelle in DB speichern

  • Hallöchen,

    ich habe jetzt einige Zeit auf das Suchen einer Lösung über Google verwendet, komme allerdings irgendwie nicht richtig weiter.

    Ich würde gerne in einer mySQL Datenbank mehrere Werte in einer Zelle speichern (Primärschlüssel in einer anderen Tabelle), z.B.

    Name: Mustermann
    Vorname: Max
    Tags: 1,2,3,4

    Da in der Spalte "Tags" über 100 verschiedene Werte in Frage kommen (eingetragen werden allerdings max. 10 verschiedene), würde eine extra Zuordnungstabelle sicher den Rahmen sprengen. Auch habe ich mir die Funktion serialize() mal angeschaut, finde diese jedoch für meine Zwecke auch etwas komplex (es wird hinterher eine Tabelle mit ca. 100 Einträgen ausgegeben; bei jedem Datensatz wird geprüft, ob zu diesem Eintrag in der dazugehörigen Tabelle in der Spalte "Tags" ein bestimmter Wert X vorkommt). Der Feldtyp "SET" kommt leider auch nicht in Frage, da er zu wenige verschiedene Einträge zulässt.

    Meine Frage ist daher, ob es eine "einfache" Möglichkeit gibt, Werte innerhalb einer Spalte mit einem Sonderzeichen zu trennen (z.B. 1,2,3) und bei der Ausgabe gezielt nach einem Wert in dieser Spalte zu suchen (Wenn Wert "2" vorhanden, dann...)?

    Ich wäre euch für jede Hilfe dankbar :)

    LG
    Max

  • Wenn maximal 10 Werte eingetragen werden, dann benutze 10 Tabellenspalten. Diese Werte in eine Spalte zu stoppen wird immer wieder Probleme machen.

  • Hi Bandit,

    danke für die schnelle Hilfe. An die Lösung habe ich auch schon gedacht. Aber müsste ich dann nicht in jeder Abfrage nach einem Wert in jedem der 10 Felder suchen? "If Feld1 ==1 OR Feld2 ==1 OR Feld3 =1,..."? Oder gibt es da eine andere Methode?

  • Baue eine Funktion, die dir die Abfrage zusammenbaut, sind doch nur ein paar Zeilen.

  • So etwas habe ich noch nie versucht. Kannst du mir ein kurzes Beispiel geben? Problem ist, dass ich auch 2 AND Bedingungen habe, die neben dem Vorkommen eines Wertes in einem Datensatz erfüllt sein müssen.

    z.B. Bedigung1=blau AND Bedingung2=Montag
    und zudem die OR Bedingungen für das vorkommen der Tags.


  • Ausgabe

    Zitat

    (tag1=5 OR tag2=5 OR tag3=5 OR tag4=5 OR tag5=5 OR tag6=5 OR tag7=5 OR tag8=5 OR tag9=5 OR tag10=5)

  • Vielen Dank! Kannst du mir bitte noch verraten, wie ich die Funktion mit der DB Abfrage verbinde?

    Folgender Versuch von mir gibt mir leider einen Fehler aus

    PHP
    $load = mysql_query("SELECT * FROM test WHERE $result");

    Fehlermeldung:

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource...

    sowie

    Fatal error: Cannot redeclare createsubcondition() (previously declared...

  • Da du nicht verräts, was in $result steht, kann man nicht viel dazu sagen.

    Richtig debuggen

    1.Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2.Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL);
    3.Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4.Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5.An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysql_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6.Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7.Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8.Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9.Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.


    Die Fehlermeldung deutet darauf hin, dass du die Funktion in eine Schleife geschrieben hast oder in einer Datei, die mehrfach per include bzw. require eingebunden wird.

  • Das Error_reporting zeigt lediglich die oben beschriebenen Fehlermeldungen. Die $result verweist auf dein Code Beispiel von oben

    PHP
    $result = array();

    Fehler 1 bezieht sich auf die DB Abfrage, Fehler 2 auf die erste Zeile der Funktion.


    PHP
    <?php        error_reporting(E_ALL);   function createSubCondition($prefix, $start, $count, $value)   {      $result = array();      while($count--)         $result[] = $prefix . $start++ . "=" . $value;      return ("(" . implode (" OR ", $result) . ")");   }   echo createSubCondition("tag", 1, 5, $tag['tagnr']);?>         <?php          $load = mysql_query("SELECT * FROM tags WHERE $result'");          $rows = mysql_num_rows($load);
  • Meine Empfehlung: Lerne die Grundlagen!!! Die Funktion liefert einen String zurück, und dieser wird per echo ausgegeben. In $result beim mysql_query steht also nix drin, da keine Zuweisung existiert.