Рассматривали ли вы что-то вроде этого, вместо этого:
$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 /как-настройка производительности .