SQL с несколькими терминами с разнесением / развертыванием и PHP PDO - PullRequest
2 голосов
/ 31 января 2012

У меня есть поисковая форма, в которой пользователи должны искать по нескольким терминам.В настоящее время я использую PHP PDO и все еще учусь ... Мне было интересно, кто-нибудь может сказать мне, что я делаю здесь неправильно.

    $varSearch = @$_GET['dms']; 
    $varTerm = explode(" ", $varSearch);
    $termArray = array();
    foreach($varTerm as $term){
        $term = trim($term);
        if(!empty($term)){
            $termArray[] = "name LIKE '%".$term."%' OR tags LIKE '%".$term."%'";
        }
    }
    $implode = implode(' OR ', $termArray);
    $sql = $dbh->prepare("SELECT * FROM table WHERE ?");
    $sql->execute(array($implode));

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Рассматривали ли вы что-то вроде этого, вместо этого:

$varSearch = @$_GET['dms'];
$varTerm = explode(" ", $varSearch);
$termsStringArray = array();
$termsArray = array();
foreach($varTerm as $term){
    $term = trim($term);
    if(!empty($term)) {
        array_push($termsStringArray, "name LIKE ? OR tags LIKE ? ");
        array_push($termsArray, $term);
        array_push($termsArray, $term);  // note, you can do this part differently, if you'd like
    }
}
$implodedTermsString = implode('OR ', $termsStringArray);
$sql = $dbh->prepare("SELECT * FROM biz WHERE " . $implodedTermsString);
$sql->execute(array($termsArray));

Вывод:

// prepare statement
SELECT * FROM biz WHERE name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ? OR name LIKE ? OR tags LIKE ?

// $termsArray (for execute)
Array
(
    [0] => this
    [1] => this
    [2] => is
    [3] => is
    [4] => the
    [5] => the
    [6] => string
    [7] => string
)

В основном, пытаясь отделить данные массива от исходного запроса SQL prepare строка,Дайте мне знать, если это работает для вас!

Тем не менее, вы все равно захотите провести какую-то проверку (или очистку) данных, которые вы получаете из переменной $_GET.Эта переменная $_GET может содержать что угодно ... и может быть плохой для SQL-инъекций или других нежелательных проблем.

И, LIKE не обязательно будетНаиболее эффективный способ сделать этот тип поиска в базе данных.Но если вы используете его (а я использовал его для поиска вещей в прошлом), попробуйте проверить: http://use -the-index-luke.com / sql / where-clause / search-for-range /как-настройка производительности .

1 голос
/ 12 января 2015

Remake

$my_explode = explode(" ",$search);
$query = array();
foreach($my_explode as $string)
{
$query[] ="name LIKE '%".$string."%' OR email LIKE '%".$string."%'";
}
$implode = implode(' OR ', $query);
foreach ($db->query("SELECT * FROM _table WHERE ".$implode."") as $info)
{
    echo $info['name']."<br />";
}

Безопасно для инъекций, с php восстанавливает только буквенно-цифровые символы

$search = preg_replace("/[^a-zA-Z0-9]+/", "-", $_GET["text"]);
1 голос
/ 31 января 2012

Если кому-то еще нужен этот ответ ...

$varSearch = @$_GET['dms']; 
$varTerm = explode(" ", $varSearch);
$termArray = array();
foreach($varTerm as $term){
    $term = trim($term);
    if(!empty($term)){
        $termArray[] = "name LIKE :term OR tags LIKE :term";
    }
}
$implode = implode(' OR ', $termArray);
$sql = $dbh->prepare("SELECT * FROM table WHERE ".$implode."");
$sql->execute(array(":term"=>"%".$term."%"));
...