Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankabfrage mit serialisierten Daten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankabfrage mit serialisierten Daten

    Ich habe folgendes:
    PHP-Code:
    <?php
    $this
    ->Database->prepare("SELECT COUNT(*) AS total FROM member WHERE login=1 AND groups=?")->execute('a:1:{i:0;s:1:"2";}');    
    ?>
    wobei in den Datensätzen bei groups nie a:1:{i:0;s:1:"2";} steht, sondern immer irgendwie etwas anderes aber häufig etwas mit dem Wert "2". Im Datenbankfeld groups steht immer etwas serialisiertes. Jetzt möchte ich abfragen, ob der Wert 2 in den groups-Feldern enthalten ist oder nicht. Wie kann ich das machen? Ich hoffe ihr könnt mir helfen!

  • #2
    Ich weiß zwar nicht was du da für seltsame Dinger veranstaltest aber du könntest mit:
    WHERE spalte LIKE '%2%'
    nach einer 2 suchen.

    Vlt. solltest du aber auch dein DB Design überdenken.

    Kommentar


    • #3
      Vielleicht habe ich mich nicht so gut ausgedrückt. Beispiel was ich möchte:

      Machen wirs schwieriger und sagen, es soll unserialize('a:2:{i:0;s:1:"4";i:1;s:1:"2";}') drin vorkommen.

      Datensätze:
      1. id | login=1 | groups=a:2:{i:0;s:1:"4";i:1;s:1:"1";} // würde nicht gezählt
      2. id | login=1 | groups=a:2:{i:0;s:1:"4";i:1;s:1:"2";} // würde gezählt
      3. id | login=1 | groups=a:1:{i:0;s:1:"2";} // würde nicht gezählt
      4. id | login=1 | groups=a:3:{i:0;s:1:"4";i:1;s:1:"1";i:2;s:1:"2";} // würde gezählt

      D.h. bei:
      PHP-Code:
      <?php
      $total 
      $this->Database->prepare("SELECT COUNT(*) AS total FROM member WHERE login=1 AND groups=?")->execute(X);    
      ?>
      echo $total->total; würde 2 ergeben.

      Wie kann ich das machen bzw. abfragen?

      Kommentar


      • #4
        Von der Logik her sollte es wie bei PHP: array_intersect - Manual aggieren.

        !empty(array_intersect($array1, $array2)); => würde gezählt werden
        empty(array_intersect($array1, $array2)); => würde nicht gezählt werden

        Dies möchte ich aber nun in der Datenbankabfrage machen.

        Kommentar


        • #5
          Handelt es sich bei der Datenbank um MySQL ?

          Vermutlich möchtest Du ein PHP-Objekt (Multi-Dim-Array) in der Datenbank abspeichern. Dazu brauchst Du auch eine Datenbank, die Objekte speichern kann.

          Mit dem Serialize() macht du aus dem PHP-Array einen String und so steht er dann auch in der Tabellenspalte. Mir ist nicht bekannt, dass MySQL irgendwie ein Unserialize() kann. Bliebe eigentlich nur ein Stored Procedure, der sowas nachbildet (was nicht trivial sein wird).

          Eventuell könntest Du das PHP-Multi-Dim-array mit json_encode() umwandelt anstatt mit serialize() und das Ganze mit sowas wie CouchDB oder MongoDB speichern. Diese Datenbanken können mit Dokumenten / JSON umgehen.

          Die dritte Idee dazu das PHP-Array nach XML umzuwandeln, das kann PHP und soweit ich weiß auch MySQL ganz gut.

          Grüße
          Thomas

          Kommentar


          • #6
            Ja, MySQL. Schade, dass es nicht einfach funktioniert. Ich möchte eigentlich nichts abspeichern, sondern 2 serialisierte Strings irgendwie miteinander vergleichen.

            Kommentar


            • #7
              Ein reiner Stringvergleich geht ja mit folgenden SQL-Möglichkeiten, hast Du das schon probiert?

              - ..AND groups LIKE
              - ..AND INSTR ..
              - ..AND REGEXP ...

              Grüße
              Thomas

              Kommentar


              • #8
                Sorry, nein es sind nicht genau 2 Strings. Das Datenbankfeld ist ein blob NULL. Kann man nicht irgendwie
                .. AND !empty(array_intersect(unserialize(groups), unserialize('a:2:{i:0;s:1:"4";i:1;s:1:"2";}'))) ... machen? Genau so hätte ich es gerne. Kann man nicht das Datenbankfeld groups während der Datenbankabfrage verändern?

                Kommentar


                • #9
                  Dafür sind relationale Datenbanken einfach nicht gedacht ... Du solltest dir lieber überlegen die Daten anders in der DB abzulegen damit sie durchsuchbar bleiben.

                  Kommentar


                  • #10
                    Klar, und schon spricht SQL plötzlich PHP! Ein bissel Nachdenken sollte klarmachen, dass die Idee Dummfug ist.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar

                    Lädt...
                    X