2016-03-29 3 views
1
<?$search=$_POST['search']; 
$query = $pdo->prepare("select * from tag where tag1 LIKE '%$search%' OR tag2 LIKE '%$search%' LIMIT 0 , 10"); 
$query->bindValue(1, "%$search%", PDO::PARAM_STR); 
$query->execute(); 
// Display search result 
     if (!$query->rowCount() == 0) { 
       echo "Search found :<br/>"; 

      while ($results = $query->fetch()) { 

       echo "$".$results['name']; 
       echo "</td></tr>";    
      } 
       echo "</table>";   
     } else { 
      echo 'Nothing found'; 
     } 
?> 
<form action="" method="post"> 
Search: <input type="text" name="search" placeholder=" Search here ... "/> 
<input type="submit" value="Submit" /> 
</form> 

Я знаю, что есть много подобных вопросов об этом, но я до сих пор не могу понять это. Если у кого есть время, объясните мне, как добавить explode в мой поиск, чтобы я мог использовать более 1 слова для поиска? Большое спасибо за ваше время. Этот скрипт выполняет поиск, если я ввожу 1 слово, в свой тег case. Но если я введу 2 слова, он вернется в 0 результатов.PHP многопользовательский поиск MYSQL

+0

взрываются поиск строки разделителем – RomanPerekhrest

+1

Высококвалифицированные риска для SQL инъекций: '$ поиска = '%' $ поиск '%';.. $ query = $ pdo-> prepare ("select * from tag where tag1 LIKE: строки ИЛИ tag2 LIKE: строки LIMIT 0, 10"); $ query-> bindParam (': strings', $ search, PDO :: PARAM_STR); ' – aldanux

+0

Так же, как FYI, вы *** не *** безопасны от SQL Injection. Встраивая вход пользователя здесь: '% $ search%', вы разрешаете прямое манипулирование пользователем вашего оператора SQL. Неправильное использование 'bindValue'. Рассмотрите возможность изменения вашего оператора следующим образом: '$ query = $ pdo-> prepare (« select * from tag, где tag1 LIKE »%: search1% 'ИЛИ tag2 LIKE'%: search2% 'LIMIT 0, 10"); $ query-> bindValue (": search1", $ search, PDO :: PARAM_STR); $ query-> bindValue (": search2", $ search, PDO :: PARAM_STR); ' – War10ck

ответ

2

Обратите внимание, что документация по bindValue говорит о первом аргументе:

идентификатор параметра.

Для подготовленного оператора с использованием именованных заполнителей это будет имя параметра формы :name. Для подготовленного заявления с использованием заполнителей вопросительных знаков это будет 1-индексированная позиция параметра.

У вас нет ни ? заполнителей, ни двоеточия с префиксом имени заполнителя в вашей строке SQL. Вместо этого вы фактически вводите введенный пользователем вход непосредственно в ваш SQL и становитесь уязвимыми для SQL-инъекции. Итак, вы должны начать использовать заполнители, как описано в документации.

Если вы хотите, чтобы какое-либо отдельное слово было найдено, вам нужно будет динамически продлить ваш WHERE , добавив OR-условия для соответствия каждому слову. В таком динамически генерируемом SQL будет проще использовать ? заполнители .

Кроме того, так как ваши аргументы являются строками, вы можете использовать дополнительный параметр execute передать массив аргументов:

input_parameters

Массив значений с таким количеством элементов, как там являются связанными параметрами в выполняемом операторе SQL. Все значения обрабатываются как PDO::PARAM_STR.

Вот некоторые предлагаемые код:

// Explode to words and filter for words which are not the empty string: 
$words = array_filter(explode(" ", $_POST['search']), 'strlen'); 
// Wrap each of the words in '%' 
$words = array_map(function ($search) { return "%$search%"; }, $words); 
// Add a condition for each of the words in the WHERE clause, and repeat for tag2 
$sql = "select * 
     from tag 
     where " . 
     implode(" OR ", array_fill(0, count($words), "tag1 LIKE ?")) . 
     " OR " . 
     implode(" OR ", array_fill(0, count($words), "tag2 LIKE ?")) . 
     " LIMIT 0, 10";  
$query = $pdo->prepare($sql); 
// Pass the values as string twice: once for tag1 and once for tag2 
$query->execute(array_merge($words, $words)); 
Смежные вопросы