Member 13379054 Ответов: 2

Php SQL извлечение данных из цикла foreach в неправильном порядке


Я написал код для извлечения данных базы данных в соответствии с несколькими словами, введенными в поисковый ввод. Он работает, но полученные данные возвращаются не в том порядке, в каком они были введены в цикл поиска input/foreach. есть предложения?

спасибо

Что я уже пробовал:

$word=$_POST['word']; 
$word3 = $_POST['word']; 
$word = explode(";", $word);
$noOfWords = count($word);
$word2 = $word3;

if($noOfWords == 1){
    $searchString = " word_eng LIKE '".$word3."%'";
    
}
else { 

$searchString = $whereClause = "";
foreach($word as $word){
  $searchString .= " OR word_eng LIKE '".$word."'";
  
  echo $word;
}

}

$whereClause = ($searchString != "") ? " WHERE ".preg_replace('/OR/', '', $searchString, 1) : $whereClause;

$sql = "SELECT word_eng FROM words ".$whereClause ." LIMIT 17 ";

2 Ответов

Рейтинг:
1

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]


Рейтинг:
0

Jochen Arndt

Вы должны использовать лучшие имена переменных, чтобы сделать его понятным, что происходит, и не должны использовать одно и то же имя для разных типов в вашем foreach петля:

$word_string = $_POST['word']; 
$word_array = explode(";", $word_string);
$noOfWords = count($word_array);

if ($noOfWords == 1) {
    $searchString = " word_eng LIKE '".$word_string."%'";
}
else {
    foreach ($word_array as $word) {
      $searchString .= " OR word_eng LIKE '".$word."'";
      echo $word;
    }
}
Я не знаю, решит ли это вашу проблему, но с моей точки зрения это гораздо более занижено.

Вместо того чтобы удалять предыдущее "или" несколькими словами, Я бы сделал это следующим образом:
if ($noOfWords == 1) {
    $searchString = " WHERE word_eng LIKE '".$word_string."%'";
}
else {
    $searchString = " WHERE word_eng LIKE '".$word_array[0]."'";
    for ($i = 1; $i < $noOfWords; $i++) {
       $searchString .= " OR word_eng LIKE '".$word_array[$i]."'";
    }
}

Цитата:
полученные данные возвращаются не в том порядке, в котором они были введены в поисковый ввод
Это ожидаемо, потому что данные предоставляются базой данных, которая обычно возвращает совпадения в том порядке, в котором они появляются. Если вы хотите, чтобы они были упорядочены по поисковым словам, вы должны запросить каждое отдельное слово.