Ergebnis 1 bis 10 von 10

Thema: [GELÖST] BLOB Wert in die Datenbank eintragen

  1. #1
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Frage [GELÖST] BLOB Wert in die Datenbank eintragen

    Hallo zusammen

    Bei einer Contao Installation habe ich einige hundert Dateien, welche in der Meta-Information bei "Titel" einen <span> enthalten. Dieser Tag wird verwendet, um die Dokument-Nr. zu umschliessen, damit diese im Frontend entsprechend formatiert werden können.
    Im Meta-Feld "Titel" steht z.B. sowas: <span>101</span> Dokument XY

    Nun sollen diese <span>-Tags ersetzt werden. Ich wollte das kurz und schnell via ein kleines PHP Script lösen: mit str_replace <span> ersetzen und dann wieder in die DB zurückspeichern. Das klappt eigentlich auch aber Contao erkennt dann die Werte nicht mehr (Feld "Titel" ist leer). Ich habe auch schon von Hand einen Eintrag per SQL in die DB gemacht, welcher korrekt ausgeführt wurde. Contao erkennt danach jedoch den Wert auch nicht. Im Frontend wird der angepasste Titel aber korrekt mit der Änderung ausgegeben.

    Wieso erkennt Contao den Wert anschliessend nicht mehr? Wie speichert man einen BLOB Wert korrekt in die DB zurück?

    Vielen Dank und Gruss
    Marco
    Geändert von marcos (07.01.2016 um 12:42 Uhr)

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Was genau machst du nun in deinem Script? In diesem blob fehlt steht einfach ein serialisiertes Array.

  3. #3
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Ja eben, ich mach eigentlich auch nichts anderes als ein serialisiertes Array zurück in die DB speichern:

    Code:
    UPDATE tl_files SET meta = 'a:1:{s:2:"de";a:3:{s:5:"title";s:55:"(11-21)Inhaltsverzeichnis zur Kirchenordnung";s:4:"link";s:0:"";s:7:"caption";s:0:"";}}' WHERE id=37
    Ich wundere mich daher auch, wieso Contao im BE dann nichts mehr anzeigt...

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Deine Anweisung stimmt nicht, das ist kein korrekt serialisiertes Array. bspw. steht da
    Code:
    s:55:"(11-21)Inhaltsverzeichnis zur Kirchenordnung"
    sollte aber
    Code:
    s:44:"(11-21)Inhaltsverzeichnis zur Kirchenordnung"
    heißen. Daher auch meine Frage: was genau macht dein Script?

  5. #5
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    HTML

    Ach na klar! Die Länge muss natürlich stimmen!
    Ich hatte str_replace direkt auf das serialisierte Array ausgeführt! *Kopfschüttel*

    Jetzt hat's geklappt mit deserialize und dann wieder serialize!
    Die set-Methode von Database konnte ich jedoch nicht verwenden. Die hat mir die Werte rausgefiltert. Wahrscheinlich wegen den geschweiften Klammern usw.

    VIELEN DANK FÜR DEN TIPP! Ich werden den Fehler sicher nicht wieder machen ^^

    Gruss
    Marco

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Ich würde das über Models machen.
    PHP-Code:
    $objFiles = \FilesModel::findBy…;

    while( 
    $objFiles->next() )
    {
        
    $arrMeta deserialize$objFiles->meta );
        
    $arrMeta['title'] = str_replace();
        
    $objFiles->meta serialize$arrMeta );
        
    $objFiles->save();


  7. #7
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Ich musste aber alle Meta-Felder haben, die nicht NULL sind. Ich hab's desshalb mit SQL gelöst

    PHP-Code:
    $objSql $this->Database->prepare('SELECT id, meta FROM tl_files WHERE meta IS NOT NULL')->execute();

    while(
    $objSql->next()){

        
    $arrMeta deserialize($objSql->meta);
        
    $arrMeta['de']['title'] = str_replace(array('<span>''</span>'), array('('')'), $arrMeta['de']['title']);
        
    $meta serialize($arrMeta);
        
        
    $this->Database->prepare("UPDATE tl_files SET meta = '".$meta."'  WHERE id=?")->execute($objSql->id); //$meta eben direkt drin damit nichts entfernt wird



  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Eigentlich sollte da nichts entfernt werden, wenn du Prepared Statements verwendest - da wird einfach nur alles wichtige escaped. Wie hattest du das mit Prepared Statement geschrieben?


    Zitat Zitat von marcos Beitrag anzeigen
    Ich musste aber alle Meta-Felder haben, die nicht NULL sind. Ich hab's desshalb mit SQL gelöst
    »
    PHP-Code:
    $objFiles = \FilesModel::findBy( array('meta IS NULL'), array() ); 

  9. #9
    Contao-Fan Avatar von marcos
    Registriert seit
    09.02.2011.
    Ort
    Schweiz
    Beiträge
    575
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Eigentlich sollte da nichts entfernt werden, wenn du Prepared Statements verwendest - da wird einfach nur alles wichtige escaped. Wie hattest du das mit Prepared Statement geschrieben?
    Ich hatte es in die set-Methode gepackt. Ich hab's anschliessend aber auch nicht mehr explizit getestet. Das Script benötigten wir nur einmalig, damit wir nicht hunderte Einträge von Hand hätten bearbeiten müssen

    PHP-Code:
    //...
    $set = array('meta' => "'".$meta."'");
    $this->Database->prepare("UPDATE tl_files %s WHERE id=?")->set($set)->execute($objSql->id); 


    Zitat Zitat von Spooky Beitrag anzeigen
    PHP-Code:
    $objFiles = \FilesModel::findBy( array('meta IS NULL'), array() ); 
    Ah, wieder was gelernt! VIELEN DANK!

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Du musst die Hochkomma entfernen.
    PHP-Code:
    $set = array('meta' => $meta); 
    Dann hätte auch set funktioniert. Ansonsten hättest du auch noch
    PHP-Code:
    \Database::getInstance()->prepare("UPDATE tl_files SET meta = ?  WHERE id = ?")->execute( array($meta,$objSql->id) ); 
    verwenden können.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •