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

  • beta02
    hat ein Thema erstellt Datenbankabfrage mit serialisierten Daten.

    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!

  • nikosch
    antwortet
    Klar, und schon spricht SQL plötzlich PHP! Ein bissel Nachdenken sollte klarmachen, dass die Idee Dummfug ist.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • beta02
    antwortet
    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?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • beta02
    antwortet
    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.

    Einen Kommentar schreiben:


  • beta02
    antwortet
    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?

    Einen Kommentar schreiben:


  • Flor1an
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X