Ergebnis 1 bis 14 von 14

Thema: Filtern nach GET-Liste

  1. #1
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    121
    User beschenken
    Wunschliste

    Standard Filtern nach GET-Liste

    Ich übergebe per GET in order_no eine Liste von Order-Nummern und möchte danach mit eigenem SQL filtern:

    PHP-Code:
    SELECT FROM {{table}} WHERE order_no IN ({{param::get?name=order_no}}) AND published=1 ORDER BY FIELD(order_no,{{param::get?name=order_no}}); 
    Leider werden die Parameter in einfache Anführungszeichen eingehüllt, sodass das nicht geht. Und in der Orderanweisung braüchte ich alles in einzeln in Anführungszeichen:

    PHP-Code:
    SELECT FROM mm_products WHERE order_no IN ('3,4,5,6') AND published=1 ORDER BY FIELD(order_no,'3,4,5,6'); 
    bräuchte:
    PHP-Code:
    SELECT FROM mm_products WHERE order_no IN (3,4,5,6) AND published=1 ORDER BY FIELD(order_no,'3','4','5','6'); 
    Wie kann man das hinbekommen, eventuell auch mit MySQL Funktionen?

  2. #2
    Contao-Fan
    Registriert seit
    16.11.2012.
    Ort
    Freiburg
    Beiträge
    539

    Standard

    hast du schon mit der PHP Funktion
    Code:
    explode
    und
    Code:
    implode
    versucht?

  3. #3
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    121
    User beschenken
    Wunschliste

    Standard

    Es geht um das Feld "Eigene SQL-Abfrage" in den MM Filtereinstellungen. Kann ich da php-Funktionen verwenden? Wenn wie?

  4. #4
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Gehe ich recht in der Annahme, dass du dort kein PHP ausführen kannst? Wenn ja, dann kannst du es so probieren.
    Code:
    SELECT * FROM {{table}}
    WHERE order_no IN ({{file::input-get.html5?key=order_no}})
    AND published=1
    ORDER BY FIELD(order_no,{{param::get?name=order_no}});

    system/templates/input-get.html5

    PHP-Code:
    <?php
    if(\Input::get('key') == 'order_no' && \Input::get('order_no'))
    {
      echo \
    Input::get('order_no');
    }
    Bist du dir sicher, dass du für ORDER BY FIELD die Zahlen als String benötigst? Ich meine nicht.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  5. #5
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    121
    User beschenken
    Wunschliste

    Standard

    super das hat funktioniert. Vielen Dank!

    PHP-Code:
    SELECT FROM {{table}}
    WHERE order_no IN ({{file::input-get.html5?key=order_no}})
    AND 
    published=1
    ORDER BY FIELD
    (order_no,{{file::input-get.html5?key=order_no}}); 
    und input-get.html5 in /templates.

    PHP-Code:
    <?php
    if(\Input::get('key') == 'order_no' && \Input::get('order_no'))
    {
      echo \
    Input::get('order_no');

    else echo 
    0;
    oder unverseller:
    PHP-Code:
     <?php
    $key 
    = \Input::get('key');
    if(\
    Input::get($key))
    {
      echo \
    Input::get($key);

    else echo 
    0;
    Geändert von pout (29.10.2015 um 11:51 Uhr)

  6. #6
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Super.

    ?key=order_no kannst du natürlich weglassen. So hast du aber die Möglichkeit die gleiche Datei nochmal für andere GETs zu benutzen.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  7. #7
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    121
    User beschenken
    Wunschliste

    Standard

    Ja, oder ich übergebe den Key und formuliere die template-Datei allgemeiner, wie in meinem obigen bearbeiteten Post. Dann kann ich mir im Filter die Get-Variable aussuchen/festlegen.

  8. #8
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ja, genau. Es ging ja nur um die Technik. Du kannst die Datei übrigens auch .php anstatt .html5 nennen. .html5 hat nur den Vorteil (oder Nachteil) dass du sie im BE unter den Templates siehst.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  9. #9
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Du baust dir damit aber eine gravierende Sicherheitslücke ein, da du jegliches escapen umgehst.

    Stell dir mal einen Key in der Form "1); UPDATE tl_user SET password='newpasswordhash'; SELECT IRGENDWAS DAMIT DIE DB ABFRAGE VALIDE BLEIBT".

    Wenn dann solltest du die Parameter schützen. Wenn es IDs sind, z.B. folgendermaßen.

    PHP-Code:
     <?php 
    $key    
    = \Input::get('key'); 
    $value =\Input::get($key);

    if(
    $value) { 
        
    $value trimsplit(','$value);
        
    $value array_map('intval'$value);

        echo 
    implode(','$value);
    }  
    else echo 
    0;

  10. #10
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Aber das macht die Methode doch schon. Deswegen benutze ich doch die Input-Klasse. Oder?
    https://github.com/contao/core/blob/...t.php#L73-L117
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  11. #11
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Andreas Beitrag anzeigen
    Aber das macht die Methode doch schon. Deswegen benutze ich doch die Input-Klasse. Oder?
    https://github.com/contao/core/blob/...t.php#L73-L117
    Nein. Geht ja auch garnicht. Es ist ja garnicht klar, dass die Daten aus der Input-Klasse in die DB kommen. Auch weiß man dort garnicht, welche DB verwendet wird. Zwar führt die Input-Klasse eine Filterung durch, aber erfodert dennoch, dass man nicht an anderer Stelle leichtfertig arbeitet.

    Normalerweise übernimmt die Statement-Klasse der Datenbank das Escapen, weshalb man halt §db->prepare('SELECT id FROM tl_table WHERE foo=?')->execute('bar') macht.

  12. #12
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.721
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Andreas Beitrag anzeigen
    Du kannst die Datei übrigens auch .php anstatt .html5 nennen. .html5 hat nur den Vorteil (oder Nachteil) dass du sie im BE unter den Templates siehst.
    .php kann man auch für Ansicht/Bearbeitung "freischalten" indem man die Extension in der "Systemsteuerung" von Contao einträgt

  13. #13
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von webstar Beitrag anzeigen
    Nein. Geht ja auch garnicht.
    Ok, danke für den Hinweis. Also kann man sagen, man soll die GETs daraufhin überprüfen, ob da auch das kommt, was man erwartet. Richtig?
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  14. #14
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Andreas Beitrag anzeigen
    Ok, danke für den Hinweis. Also kann man sagen, man soll die GETs daraufhin überprüfen, ob da auch das kommt, was man erwartet. Richtig?
    Ja, man sollte die ersten drei Grundsätze der (Web-)programmierung beachten:
    1. Never trust user data.
    2. Never trust user data.
    3. Never trust user data.



    http://i.stack.imgur.com/XTknC.png

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
  •