Мой sql запрос на поиск товара не работает - PullRequest
0 голосов
/ 27 февраля 2020

Я строю веб-сайт ресторана, и я должен искать продукты в соответствии с тем, что пользователь вводит в строке поиска. Я должен отсортировать результаты по наиболее релевантному

ОБНОВЛЕНО:

if (isset($_POST['searchValue']))
{
function test_input($data) {
 $data = trim($data); //whitespacess
 $data = stripslashes($data); //removes backslashes n clean data from 
   database or form
   $data = htmlspecialchars($data); //converts predefined characters to html 
  entities, encoding user input so that they cannot manipulate html codes
  return $data;
  }



    $inpText=$_POST['searchValue'];

    $searchData=test_input($inpText);

    $starString= strtolower('{$searchData}');
    $searchData = $conn->quote($starString);
    $searchDataStartMatch = $conn->quote("%".$starString);
    $searchDataEndMatch = $conn->quote($starString."%");
    $searchDataBothMatch = $conn->quote("%".$starString."%");


    $sql="SELECT * FROM food WHERE Food_Name like {$searchDataBothMatch} OR 
         Food_Description LIKE {$searchDataBothMatch}
          ORDER BY CASE WHEN Food_Name={$searchData} or Food_Description = 
                    {$searchData} THEN 0
                        WHEN Food_Name like {$searchDataEndMatch} or 
                        Food_Description LIKE {$searchDataEndMatch} THEN 1
                        WHEN Food_Name like {$searchDataBothMatch} or 
                        Food_Description LIKE {$searchDataBothMatch} THEN 2
                        WHEN Food_Name like {$searchDataStartMatch} or 
               Food_Description LIKE {$searchDataStartMatch} THEN 3
                 ELSE 4
          END";

    $res=$conn->query($sql);



    if ($res->rowCount()>0)
    {
        while($row=$res->fetch(PDO::FETCH_ASSOC))
        {
            ?>

            <div class="col-lg-3 mx-0">
            //the code continues here 

Я переформатировал последний оператор sql и выполнил запрос, но он все равно не дает мне любой желаемый вывод .. Теперь, как мне действовать?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

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

Также, если я правильно понял, вам нужна функция "LOWER" для строки, которую вы ищете, верно? в этом случае используйте функцию PHP "strtolower" один раз и присвойте эту переменную SQL выражение

$searchData= strtolower("{Some_text_to_search}");
$searchDataStartMatch = "%".$searchData;
$searchDataEndMatch = $searchData."%";
$searchDataBothMatch = "%".$searchData."%";
$sql="SELECT * FROM food WHERE Food_Name like ? OR Food_Description LIKE ?
      ORDER BY CASE WHEN Food_Name=? or Food_Description = ? THEN 0
                    WHEN Food_Name like ? or Food_Description LIKE ? THEN 1
                    WHEN Food_Name like ? or Food_Description LIKE ? THEN 2
                    WHEN Food_Name like ? or Food_Description LIKE ? THEN 3
             ELSE 4
      END";
$statement=$conn->prepare($sql);
$statement->execute([
    $searchDataBothMatch,$searchDataBothMatch
    $searchData,$searchData,
    $searchDataEndMatch,$searchDataEndMatch,
    $searchDataBothMatch,$searchDataBothMatch,
    $searchDataStartMatch,$searchDataStartMatch
]);
$results = $statement->fetchAll();

отредактировано

, если вы хотите l oop сверх результатов замените

$ results = $ Statement-> fetchAll ();

на:

$result = [];
while($row = $statement->fetch()){
    // your logic here
    $result[] = $row;
}

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

$starString= strtolower("{Some_text_to_search}");
$searchData = $conn->quote($starString);
$searchDataStartMatch = $conn->quote("%".$starString);
$searchDataEndMatch = $conn->quote($starString."%");
$searchDataBothMatch = $conn->quote("%".$starString."%");
$sql="SELECT * FROM food WHERE Food_Name like {$searchDataBothMatch} OR Food_Description LIKE {$searchDataBothMatch}
      ORDER BY CASE WHEN Food_Name={$searchData} or Food_Description = {$searchData} THEN 0
                    WHEN Food_Name like {$searchDataEndMatch} or Food_Description LIKE {$searchDataEndMatch} THEN 1
                    WHEN Food_Name like {$searchDataBothMatch} or Food_Description LIKE {$searchDataBothMatch} THEN 2
                    WHEN Food_Name like {$searchDataStartMatch} or Food_Description LIKE {$searchDataStartMatch} THEN 3
             ELSE 4
      END";
$statement=$conn->query($sql);

$result = [];
while($row = $statement->fetch()){
    // your logic here
    $result[] = $row;
}
0 голосов
/ 27 февраля 2020
 $sql="SELECT * FROM food WHERE LOWER(Food_Name) LIKE '%".$searchData."%'
          ORDER BY CASE WHEN LOWER(Food_Name)='".$searchData."' THEN 0
                        WHEN LOWER(Food_Name)='".$searchData."%' THEN 1
                        WHEN LOWER(Food_Name)='%".$searchData."%' THEN 2
                        WHEN LOWER(Food_Name)='%".$searchData."' THEN 3
                        ELSE 4

$ searchData - это переменная, которая должна быть встроена в $ sql с точкой (.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...