2015-09-25 2 views
1

У меня есть скрипт PHP, который я пытаюсь использовать для генерации результатов поиска из базы данных, с несколькими вводами текста поиска и отправкой. Три входа - это термин, ключевое слово и местоположение. Я достиг поиска, но логика проверки я нахожу немного сложнее. Я разбил запрос на три части, так что, когда один из входов пуст, он освобождает часть запроса, добавляемую к полному запросу. Но из-за оператора OR, когда первый вход пуст, остальное терпит неудачу.PHP форма поиска с несколькими входами

Второй глаз будет полезен здесь. Пожалуйста, не отмечайте этот вопрос как слишком общий, просто посмотрите на запрос, и вы увидите проблему.

$term = mysqli_real_escape_string ($con , $_GET['term']); 
$location = mysqli_real_escape_string ($con , $_GET['location']); 
$keyword = mysqli_real_escape_string ($con , $_GET['keyword']); 

if(empty($term)) { 
$term1 = ""; 
}else{$term1 = "job_title LIKE '%".$term."%'";} 

if(empty($location)) { 
$loc1 = ""; 
}else{$loc1 = "location LIKE '%".$location."%'";} 

if(empty($keyword)) { 
$key1 = ""; 
}else{$key1 = "OR description LIKE '%".$keyword."%'";} 


$sql = "SELECT * FROM jobs WHERE ".$term1." ".$loc1." ".$key1." "; 
$r_query = mysqli_query($con,$sql); 


while ($joblist = mysqli_fetch_array($r_query)){ 
$now = date('Y-m-d',time()); 
+0

Возможно, эта тема была бы полезна вам, OP никогда не отправлял назад, если бы это сработало, но я думаю, что это должно (возможно, вы могли бы отправить сообщение, если это сработает?). http://stackoverflow.com/questions/32685881/filter-mysql-query-with-form-options/32686418#32686418 – chris85

+0

@ chris85 Спасибо, Крис, к сожалению, его логика немного отличается от моей, поскольку он не использует OR и LIKE операторов, которые тормозят мою логику :( –

ответ

1

Вы пропускаете OR после первого, как заявление, здесь -

if(empty($location)) { 
$loc1 = ""; 
}else{$loc1 = "location LIKE '%".$location."%'";} 

Вы, вероятно, хотите разместить OR прямо перед location like, так -

"OR location LIKE '%".$location."%'" 
+0

Спасибо @ lincolndidon1 У меня был OR там раньше и вывел его перед моим сообщением. Это не сработает, потому что: 'SELECT * FROM jobs WHERE job_title LIKE '%". $ Term. "% «OR location LIKE»% ». $ Location.«% »ИЛИ описание LIKE«% ». $ Keyword.«% ''Это потому, что после первого условия job_title LIKE'%". $ Term. "% 'Пуст, тогда запрос становится 'SELECT * FROM jobs WHERE OR location LIKE '%". $ location. "%' ИЛИ ​​description LIKE '%". $ keyword. "%'' Что не работает из-за 'WHERE OR' seqence –

1

Вот модифицированный подход. Попробуйте, если это работает или не понравится.

if (!empty($_GET['term'])) { 
    $where[] = " job_title like ? "; 
    $params[] = '%' . $_GET['term'] . '%'; 
} 
if (!empty($_GET['location'])) { 
    $where[] = " location like ? "; 
    $params[] = '%' . $_GET['location'] . '%'; 
} 
if (!empty($_GET['keyword'])) { 
    $where[] = " description like ? "; 
    $params[] = '%' . $_GET['keyword'] . '%'; 
} 
$sql_where = !empty($where) ? ' where ' . implode(' or ', $where) : ''; 
$query = "SELECT * FROM jobs $sql_where"; 
if (!($tot = mysqli_prepare($con, $query))) { 
    echo "Prepare failed: (" . mysqli_errno($con) . ") " . mysqli_error($con); 
} else { 
    if(!empty($params)) { 
    $params = array_merge(array($tot), 
     array(str_repeat('s', count($params))), 
     $params); 
    call_user_func_array('mysqli_stmt_bind_param', $params); 
    // adapated from http://stackoverflow.com/questions/793471/use-one-bind-param-with-variable-number-of-input-vars and http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli may need to be altered 
    } 
    mysqli_execute($tot); 
} 
+0

Я пробовал запрос, но он кажется параметрами и там, где werent хорошо работает для меня, поэтому я обнаружил и сделал некоторые изменения, основанные на ваших, и вот результат, который сработал. –

+0

@GeraldGray Какая ошибка вы получили; или как это не сработало? – chris85

+0

Можете ли вы вывести '$ query'? – chris85

0

Это похоже на работу на основе @ Chris85-х suggestion.I я не совсем уверен, как $ PARAMS [] играет роль. Любые объяснения будут хорошими.

+0

Мой подход реализует параметризованные запросы, которые предотвращают инъекции SQL. Это вводит пользовательский ввод непосредственно в ваш запрос, который открывает вам SQL-инъекции. Что случилось с моим ответом? 1. https://en.wikipedia.org/wiki/SQL_injection 2. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – chris85

+0

'params' отделяет пользовательские данные от запрос. Они не нужны в вашем нынешнем коде, поэтому вы можете просто удалить их. Вы не должны использовать этот код, как указано в предыдущем комментарии. – chris85

+0

@ chris85 Я получаю следующее при запуске подхода, который вы мне дали. 'Предупреждение: параметр 3 в mysqli_stmt_bind_param() должен быть ссылкой, значение задано' 'Warning: mysqli_execute() ожидает, что параметр 1 будет mysqli_stmt, boolean given' –

Смежные вопросы