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%'
4 Réponses :
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>
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"];
}
?>
Pas d'injection sûre (bien que ma réponse ne soit pas non plus).
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.
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 /…
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.
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?