2
votes

Pour chaque résultat de sélection de mysql

Je veux créer un champ de recherche comme si je recherche "Spinach, Watermelon", il explosera l'entrée par "," et exécutera la base de données de recherche MySQL. Cela signifie que le SQL fonctionnera en tant que

<php>
$keywords = trim($_REQUEST['keyword']);
$keyword = explode(",", $keywords);
foreach($keyword as $keys=>$select)
{
   $sql = "SELECT * FROM table WHERE vegetable LIKE '%keyword %' OR fruits LIKE '%keyword %'";
   $result = mysqli_query($conn, $sql);
   while ($rs = mysqli_fetch_array($result))
   {    
       $vege = $rs["vegetable"];
       $fruits = $rs["fruits"];
   }
}

<html>
<form method=post>
    <input type="text" class="form-control" placeholder="SEARCH..." value="<?=$keywords?>">
</form>
</html>

Les données de ma table de base de données ressemblent à ceci:

id  Vegetable  fruits
----------------------
1   Spinach    Apple
2   Cucumber   Orange
3   Spinach    Watermelon

Seul le résultat de chaque identifiant peut venir une fois.

SELECT * FROM table
  WHERE vegetable LIKE '%Spinach%' OR fruits LIKE '%Spinach%'

SELECT * FROM table
  WHERE vegetable LIKE '%Watermelon%' OR fruits LIKE '%Watermelon%'


2 commentaires

Votre table a des légumes et des fruits liés à la même pièce d'identité?


Qu'essayez-vous de réaliser exactement et quel est le problème auquel vous faites face?


4 Réponses :


0
votes

Essayez ceci, il imprimera vos enregistrements doivent.

<php>
$keywords = trim($_REQUEST['keyword']);
$keyword = explode(",", $keywords);
for($i=0; $i<count($keyword); $i++)
{
   $sql = "SELECT * FROM table WHERE vegetable LIKE '%" . $keyword[$i] . "%' OR fruits LIKE '%" . " . $keyword[$i] . " . "%'";
   $result = mysqli_query($conn, $sql);
   $rs = mysqli_fetch_array($result); 
   echo "<pre>"; print_r($rs); exit; 
}

?>
<html>
<form method=post>
    <input type="text" class="form-control" placeholder="SEARCH..." value="<?=$keywords?>">
</form>
</html>


0 commentaires

1
votes

Accéder à la base de données dans la boucle for n'est pas une bonne approche, vous pouvez créer votre requête comme ceci:

<?php
$keywords = trim($_REQUEST['keyword']);
$keyword = explode(",", $keywords);
$sqlWhere = '';
foreach($keyword as $keys=>$select)
{
   $sqlWhere .= "LIKE '%$select%' OR";
}
$sqlWhere = rtrim($sqlWhere, "OR");

$sql = "SELECT * FROM table " . $sqlWhere;
$result = mysqli_query($conn, $sql);
while ($rs = mysqli_fetch_array($result))
{    
       $vege = $rs["vegetable"];
       $fruits = $rs["fruits"];
}    
?>


1 commentaires

Pas d'injection sûre (bien que ma réponse ne soit pas non plus).



2
votes

Si vous êtes prêt à utiliser REGEXP avec une alternative au lieu de LIKE , alors voici une approche simple:

SELECT *
FROM table
WHERE
    vegetable REGEXP '[[:<:]](Spinach|Watermelon)[[:>:]]' OR
    fruits REGEXP '[[:<:]](Spinach|Watermelon)[[:>:]]';

En supposant vous avez passé la chaîne de recherche de mots-clés "Spinach, Watermelon" , le script ci-dessus générerait cette requête:

$keywords = trim($_REQUEST['keyword']);
$keywords = preg_replace("/,\s*/", "|", $keywords);
$where = "[[:<:]](" . $keywords . ")[[:>:]]";

$sql = "SELECT * FROM table ";
$sql .= "WHERE vegetable REGEXP '" . $where . "' OR fruits REGEXP '" . $where . "'";
$result = mysqli_query($conn, $sql);
while ($rs = mysqli_fetch_array($result)) {
    $vege = $rs["vegetable"];
    $fruits = $rs["fruits"];
}

Honnêtement, la meilleure approche ici serait pour utiliser LIKE ou REGEXP avec une instruction préparée. Si vous choisissez d'utiliser mon approche, vous devez absolument stériliser la chaîne CSV entrante pour vous assurer qu'elle ne contient que des caractères alphanumériques, des virgules et des espaces.


3 commentaires

Que diriez-vous si est ET condition?


Vous utiliseriez REGEXP '[[: <:]] Épinards [[:>:]]' ET REGEXP '[[: <:]] Pastèque [[:>:]]' ... mais vous voudrez peut-être ouvrir une nouvelle question, car celle-ci a déjà reçu une réponse.


Ok, j'avais ouvert une nouvelle question à stackoverflow .com / questions / 54762616 /…



0
votes

Je pense que votre problème est "* Le résultat de chaque identifiant ne peut sortir qu'une seule fois.".

Il vaut donc mieux faire une seule requête:

$keywords = trim($_REQUEST['keyword']);
$keyword = explode(",", $keywords);
$where = [];
foreach($keyword as $keys)
{
   $where[] = "vegetable LIKE '%".$keys." %' OR fruits LIKE '%".$keys." %'";
}
$sql = "SELECT * FROM table ".(empty($where) ? '' : implode(' OR ', $where));

pour avoir une requête pour un ensemble de résultats.

N'oubliez pas d'échapper vos mots-clés.


0 commentaires