Contao-Camp 2024
Ergebnis 1 bis 4 von 4

Thema: SQL Abfrage und execute dynamisch aufbauen

  1. #1
    Alter Contao-Hase
    Registriert seit
    28.09.2010.
    Beiträge
    1.368

    Standard SQL Abfrage und execute dynamisch aufbauen

    Hallo,

    ich versuche gerade eine SQL Abfrage dynamisch aufzubauen, unter der Verwendung der DB Klasse von Contao.
    Der Code ist nur zum Testen, um es grundsätzlich zu verstehen ... eine feste Abfrage hat ohne Probleme funktionert.

    PHP-Code:

    $searchItems 
    explode(" "strip_tags(trim($_GET['keywords'])) );

            for(
    $i=0;$i<count($searchItems);$i++)
            {
                if(
    $searchFields != "") { $searchFields .= " OR "; }
                if(
    $searchVars != "") { $searchVars .= "', '"; }

                
    $searchFields .= "tl_calendar_events.title LIKE ? OR tl_calendar_events.teaser LIKE ? OR tl_calendar_events.treffpunkt LIKE ? OR tl_content.headline LIKE ? OR tl_content.text LIKE ?";
                
    $searchVars .= $searchItems[$i]."', '".$searchItems[$i]."', '".$searchItems[$i]."', '".$searchItems[$i]."', '".$searchItems[$i];
            }

            
    // $searchVars = implode(",", $searchVars);

            
    $result $this->Database->prepare("SELECT *, tl_calendar_events.id AS eventId, tl_calendar_events.alias AS eventAlias, tl_calendar_events.title AS eventTitle , tl_calendar_events.teaser AS eventTeaser FROM tl_calendar_events 

                LEFT JOIN tl_content ON (tl_calendar_events.id = tl_content.pid)

                WHERE (
    $searchFields)

                AND tl_content.ptable = 'tl_calendar_events' AND tl_calendar_events.categories LIKE ? GROUP BY tl_calendar_events.title"
    )->execute$searchVars$searchCategories ); 

    Ich bekomme aber hier immer den Fehler, dass die Anzahl der Argumente falsch ist.

    Dann wollte ich die $searchVars als Array "sammeln" und im execute folgendermaßen übergeben:

    implode("', '", $searchVars)

    was aber zum gleichen Fehler führt.

    Warum kann man nicht wie gewohnt im Execute ein Array übergeben bzw. wie bekomme ich
    die dynamsiche Abfrage dann zusammen?

    Wie gesagt, wenn ich im execute die zu ersetzenden ? durch Variablen hart eintrage, dann klappt das auch, aber
    das ist nicht Sinn der Sache.


    Danke für Hinweise.


    Mark

  2. #2
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Hallo Mark,

    ich habe etwas gebraucht, bis ich verstanden habe, was Du da versuchst. Bin auch nicht sicher, ob ich es richtig durchschaue. Zunächst solltest Du statt $_GET['keywords'] aus Sicherheitsgründen \Contao\Input::get('keywords') verwenden.

    Dann musst für jedes Fragezeichen eine Variable angeben. Durch Deine Liste in $searchFields sind sehr viele Fragezeichen in Deiner Abfrage. Du lieferst aber mit $searchVars und $searchCategories nur zwei Strings. Mit dem gesamten Inhalt von $searchVars wird also das erste Fragezeichen "gefüllt" und mit dem Inhalt von $searchCategories das zweite. Alle weiteren bleiden leer.

    Vielleicht sollst Du versuchen die Abfrage mit IN aufzubauen, dass könnte etwas übersichtlicher sein. Z.B. so:

    PHP-Code:
    $searchItems str_replace(" "", "strip_tags(trim(\Contao\Input::get('keywords'))));
    $query .= "WHERE feld1 IN ($searchItems)"
    Dass musst Du natürlich für alle Felder machen. Ich hoffe, ich konnte Dir etwas weiterhelfen.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

  3. #3
    Alter Contao-Hase
    Registriert seit
    28.09.2010.
    Beiträge
    1.368

    Standard

    Ich hab es lösen können, wenn man im excecute() nur ein komplettes Array verwendet, was alle zu ersetzenden ? im Query enthält, dann
    funktioniert es.

    Den Hinweis auf \Contao\Input::get('keywords') nehme ich gerne an .... aber ist das hier in dem Fall so "wichtig", weil doch durch prepare->execute() der Wert ohnehin
    von Contao "berarbeitet" wird, oder?


    Danke

    Mark

  4. #4
    Contao-Fan Avatar von eS_IT
    Registriert seit
    21.07.2010.
    Ort
    Werne a. d. Lippe
    Beiträge
    585
    Partner-ID
    6161
    User beschenken
    Wunschliste

    Standard

    Hallo Mark,

    in diesem Fall ist es vermutlich nicht ganz so wichtig, kann aber auch nicht schaden. Mit Input bekommst Du aber auf jeden Fall einen Wert (auch wenn es null sein kann). Mit Deiner Version bekommst Du evtl. einen Fehler, wenn das Feld keywords in $_GET nicht vorhanden ist.

    Viele Grüße,
    eS_IT
    Viele Grüße,
    eS_IT
    --
    e@sy Solutions IT - Ihr Partner für professionelle Softwareentwicklung
    Website - Contao Codebook - Partnerprofil - GitHub

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
  •