Ergebnis 1 bis 9 von 9

Thema: Contao-Dateiverwaltung - Bilder im eigenen Modul benutzen und einfügen

  1. #1
    Contao-Nutzer
    Registriert seit
    15.01.2016.
    Beiträge
    20

    Standard Contao-Dateiverwaltung - Bilder im eigenen Modul benutzen und einfügen

    Moin,

    ich habe eine Erweiterung programmiert, in der es eine integrierte Bildergalerie gibt, die automatisch befüllt werden kann (ordnerbasiert) - Bisher habe ich immer einfach den Pfad in der Tabelle gespeichert:

    PHP-Code:
    $sql "INSERT INTO `tl_bstv_images` (`title`, `pid`, `image`, `tstamp`) VALUES ('$title', '".$month_id."', '$file', ".time().");";
    $result $this->Database->prepare($sql)->execute(); 
    Aber in der neuen Contaoversion gibt es ja immer nur IDs in den Datenbanken, die auf Dateien verweisen. Ich habe mir nun aus andern Foreneinträgen das hier zusammengesucht:
    PHP-Code:
    $objFile = \FilesModel::findByPath($file); 
    $uuid=$objFile->uuid;
    $sql "UPDATE `tl_bstv_images` SET `image`='".$file."', `file_image` = `".$uuid."`' WHERE `pid`= '".$month_id."' AND `image` = '".$file."';";
    $result $this->Database->prepare($sql)->execute(); 
    ich kriege allerdings diesen Fehler:
    Fatal error: Uncaught exception Exception with message Query error: Invalid utf8 character string: '\x06\x8C\xEC\x02\xA5\x99\x11\xE6\xBA2\xDA!\x15\x0 8\xE5h' (UPDATE `tl_bstv_images` SET `image`='files/bildergalerie/2002/12/bstv0212-1.jpg', `file_image` = `?????2?!?h`' WHERE `pid`= '80' AND `image` = 'files/bildergalerie/2002/12/bstv0212-1.jpg';) thrown in system/modules/core/library/Contao/Database/Statement.php on line 295
    Was fehlt mir noch?

    MfG, Daniel
    Geändert von kizuzi (04.03.2017 um 20:42 Uhr)

  2. #2
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.949

    Standard

    Das Feld uuid ist (z.B.) in tl_files ein binary(16). Wie ist denn Deinen file_image definiert?

    Unabhängig von Deinem Problem: Anstelle von
    Zitat Zitat von kizuzi Beitrag anzeigen
    PHP-Code:
    $sql "INSERT INTO `tl_bstv_images` (`title`, `pid`, `image`, `tstamp`) VALUES ('$title', '".$month_id."', '$file', ".time().");";
    $result $this->Database->prepare($sql)->execute(); 
    solltest Du

    PHP-Code:
    $sql "INSERT INTO `tl_bstv_images` (`title`, `pid`, `image`, `tstamp`) VALUES (?,?,?,?)";
    $result $this->Database->prepare($sql)->execute($title$month_id$filetime()); 
    verwenden.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Contao-Nutzer
    Registriert seit
    15.01.2016.
    Beiträge
    20

    Standard

    Hallo fiedsch,

    habe BLOB und nach deinem Hinweis auch binary(16) ausprobiert:
    PHP-Code:
    'sql'                     => "BLOB NOT NULL"

    'sql'                     
    => "binary(16) NOT NULL" 
    Ändert nichts an der Fehlermeldung. Wahrscheinlich muss ich beim Einfügen von binären Daten eine andere Syntax verwenden? Habe aber nichts gefunden, was funktioniert.

    Was ist der Vorteil an deiner Methode mit den Fragezeichen als Platzhalter gegenüber der klassischen SQL-Update-Methode, die ich in meinem Code verwende?

    MfG, Daniel

  4. #4
    Contao-Fan Avatar von Fachinger
    Registriert seit
    24.04.2016.
    Ort
    Limburg
    Beiträge
    308

    Standard

    Hast Du das "UPDATE ..." mit Copy und Paste eingesetzt? Das sieht irgendwie nach Schmierzeichen in der Fehlermeldung aus...

    Gesendet von meinem LG-H815 mit Tapatalk

  5. #5
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.949

    Standard

    Zitat Zitat von kizuzi Beitrag anzeigen
    Was ist der Vorteil an deiner Methode mit den Fragezeichen als Platzhalter gegenüber der klassischen SQL-Update-Methode, die ich in meinem Code verwende?
    Sicherheit! Woher stammen denn die Wert, die Du in Deinem durch Aneinanderhängen von Strings erzeugtem Statement verwendest? Sind es Z.B. Eingaben von Usern aus Formularen, daß kannst Du bestenfalls hoffen, daß sie auch so sind wie Du glaubst. Schau Dir mal https://de.wikipedia.org/wiki/SQL-Injection an.

    Edit: und der Code wird m.E. auch besser lesbar.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  6. #6
    Contao-Fan Avatar von PaddySD
    Registriert seit
    26.10.2016.
    Ort
    Andechs
    Beiträge
    656

    Standard

    Ich stimme Fiedsch durchaus zu, man sollte die o.g. Schreibweise schon verwenden. Übersichtlichkeit und korrekte "Umformatierung" von Werten sind wichtig.

    Mit der Sicherheit hat die Schreibweise aber eher weniger zu tun. Sehr wichtig ist die Benutzung der Input-Klasse für alle Nutzereingaben:
    PHP-Code:
    \Input::post('meinTollesFormularfeld')
    \
    Input::get('meinTollesFormularfeld'
    Das hat was mit Sicherheit zu tun, die man keinesfalls auslassen sollte. Wozu haben wir denn so einen guten Unterbau wie Contao?!

  7. #7
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.949

    Standard

    Die Filterung von \Input ist wichtig, aber ein anderes Thema. Nimm z.B. folgenden Query:

    PHP-Code:
    $sql "UPDATE sometable set somevalue=".\Input::get('someparameter');
    $this->Database->prepare($sql)->execute(); 
    Wenn ich als someparameter anstelle einer erwarteten numerischen ID etwas wie "42;delete from sometable;" übermittle ist das für \Input wahrscheinlich erst mal nichts Unerlaubtes. Dazu wird es erst im Kontext des SQL Statements.

    Mit

    PHP-Code:
    $sql "UPDATE sometable set somevalue=?";
    $this->Database->prepare($sql)->execute(\Input::get('someparameter')); 
    bist Du sicherer.

    Daß das execute Parameter haben kann wurde nicht zum Spaß erfunden.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  8. #8
    Contao-Nutzer
    Registriert seit
    15.01.2016.
    Beiträge
    20

    Standard

    Hallo fiedsch,

    Ja. das Input-Filtern ist mir klar. Das mache ich auch immer, wenn ich Benutzereingaben verarbeite. In diesem Fall werden allerdings nur die Ordner mit ihren Dateien aus dem Dateisystem eingelesen und verarbeitet.

    Ich habe nun mal die Variante mit den Fragezeichen ausprobiert:
    PHP-Code:
    $sql "INSERT INTO `tl_bstv_images` (`title`, `pid`, `image`, `tstamp`) VALUES (?,?,?,?)";
    $result $this->Database->prepare($sql)->execute($title$month_id$filetime()); 
    Das funktioniert. Aber warum? Was macht Contao anders?

    MfG, Daniel

  9. #9
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.949

    Standard

    Wahrscheinlich das hier: https://github.com/contao/core/blob/...nt.php#L49-L52

    Aber unabhängig davon: wenn es einen "richtigen Weg" gibt Sachen zu machen, frage ich mich nicht, warum der "falsche Weg" nicht funktioniert ;-)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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
  •