Seite 1 von 1

sql_build_array mit LIKE

Verfasst: 28.11.2009 22:42
von Unimatrix_0
Hi,

ich bastel gerade an der Neuschreibung meiner phpBB-Erweiterung und wollte gerade mit sql_build_array ein Datenbankquery erstellen, habe aber folgendes Problem:

Wenn $_POST["ex_..."] gesetzt ist, soll der exate Terminus gesucht werden, wenn nicht das ganze mit LIKE aus mein MySQL-Datenbank gesucht werden und dafür verwende ich folgenden Code:

Code: Alles auswählen

    if ((isset ($_POST["ex_nick"])) AND ($search_name <> ''))
    $data['username'] = $db->sql_escape($search_name);

    if ((!isset ($_POST["ex_nick"])) AND ($search_name <> ''))
    $data['username'] = $db->sql_like_expression($db->sql_escape($search_name));

//noch mehr solcher Konstukte
    $data['del'] = 'false';

    $sql = 'SELECT *
    FROM ' . KB_TABLE . '
    WHERE ' . $db->sql_build_array('SELECT', $data);
 
nur leider sieht die Anweisung dann zB wie folgt aus:

Code: Alles auswählen

SELECT *
    FROM phpbb_kb
    WHERE username = 'LIKE \Name\'' AND del = 'false' 
gibt es eine Möglichkeit das ganze richtig über sql_build_array laufen zu lassen und auch ein funktionierende Abfrage zu erhalten oder muss ich die Datenbankanweisung wie auf http://phpbbmodders.net/articles/3.0/dbal/ gezeigt mit sql_like_expression "händisch" zusammenbauen?

LG & Dank im vorraus Un1

Re: sql_build_array mit LIKE

Verfasst: 28.11.2009 23:07
von tas2580
Wenn du $db->sql_build_array verwendest brauchst du kein $db->sql_escape.

Gruß Tobi

Re: sql_build_array mit LIKE

Verfasst: 28.11.2009 23:22
von Unimatrix_0
Danke für den Hinweis, werd ich mir zu Herzen nehmen :grin:

damit das ganze klappt habe ich erstmal ein Notkonstruct gewählt:

Code: Alles auswählen

    //Datenbankabfragenvarriablen initiieren
    $data = array();
    $sql1 = '';
    $sql2 = '';
    $sql3 = '';
    
    
    if ((isset ($_POST["ex_nick"])) AND ($search_name <> ''))
    $data['username'] = $search_name;

    if ((!isset ($_POST["ex_nick"])) AND ($search_name <> ''))
    $sql1 = ' AND username LIKE "%'.$db->sql_escape($search_name).'%"';
    
    if ((isset ($_POST["ex_ally"])) AND ($search_ally <> ''))
    $data['userally'] = $search_ally;
    
    if ((!isset ($_POST["ex_ally"])) AND ($search_ally <> ''))
    $sql2 = ' AND userally LIKE "%'.$db->sql_escape($search_ally).'%"';

    if ((isset ($_POST["ex_titel"])) AND ($search_titel <> ''))
    $data['titel'] = $search_titel;
    
    if ((!isset ($_POST["ex_titel"])) AND ($search_titel <> ''))
    $sql3 = ' AND titel  LIKE "%'.$db->sql_escape($search_titel).'%"';
    
    $data['del'] = 'false';
    
    if (isset ($_POST["public"]))
    $data['password'] = '';
    
    $sql = 'SELECT *
    FROM ' . KB_TABLE . '
    WHERE ' . $db->sql_build_array('SELECT', $data) . $sql1 . $sql2 . $sql3; 
Falls es (besonders für den Teil mit dem LIKE) da eine geschicketere Lösung gibt, ich bin offen für Veränderungen :)

LG Un1

Re: sql_build_array mit LIKE

Verfasst: 28.11.2009 23:42
von nickvergessen
$db->sql_like_expression() wäre die Lösung ;)

Hier gibt's so ne kleine Übersicht: http://phpbbmodders.net/articles/3.0/dbal/
Wenn man das dann genauer wissen will, hilft manchmal ein Blick in die includes/db/dbal.php und includes/db/*deine-datenbank*.php

Re: sql_build_array mit LIKE

Verfasst: 29.11.2009 08:17
von Unimatrix_0
Hallo nv,

danke für den Hinweis, jedoch komm ich mit $db->sql_like_expression() leider nicht zum Ziel, da ich es im Ursprung versucht habe mit $db->sql_build_array zu komibineren (und es immernoch gern würde, falls möglich), den

Code: Alles auswählen

    //Datenbankabfragenvarriablen initiieren
    $data = array();    $sql1 = '';
    $sql2 = '';
    $sql3 = '';
    
    
    if ((isset ($_POST["ex_nick"])) AND ($search_name <> ''))
    $data['username'] = $search_name;

    if ((!isset ($_POST["ex_nick"])) AND ($search_name <> ''))
    $sql1 = ' AND username ' . $db->sql_like_expression($db->any_char . $search_name . $db->any_char);
    
// fast der selbe Spaß, nur andere Varriablen
    
    $data['del'] = 'false';
    
    if (isset ($_POST["public"]))
    $data['password'] = '';
    
    $sql = 'SELECT *
    FROM ' . KB_TABLE . '
    WHERE ' . $db->sql_build_array('SELECT', $data) . $sql1 . $sql2 . $sql3; 
ist immernoch "umständich und nicht schön"

LG Un1