Je construis un simple search algorithme et je veux casser ma chaîne avec des espaces , et chercher ma base de données dessus, comme ceci:
$search = "Sony TV with FullHD support";
$search = explode( ' ', $search );
SELECT name FROM Products WHERE name LIKE %$search[1]% AND name LIKE %$search[2]% LIMIT 6
Est-ce possible?
Merci d'avance
Oui, vous pouvez utiliser l'opérateur SQL IN
pour rechercher plusieurs valeurs absolues:
SELECT name FROM products WHERE name IN ( 'Value1', 'Value2', ... );
Si vous voulez utiliser LIKE
, vous devrez utiliser OR
à la place:
SELECT name FROM products WHERE name LIKE '%Value1' OR name LIKE '%Value2';
L'utilisation de AND
(comme vous l'avez essayé) requiert que TOUTES les conditions soient vraies. L'utilisation de OR
nécessite qu'au moins une soit vraie.
Essaye ça
Utiliser UNION
$sql = '';
$count = 0;
foreach($search as $text)
{
if($count > 0)
$sql = $sql."UNION Select name From myTable WHERE Name LIKE '%$text%'";
else
$sql = $sql."Select name From myTable WHERE Name LIKE '%$text%'";
$count++;
}
Utiliser WHERE IN
$comma_separated = "('" . implode("','", $search) . "')"; // ('1','2','3')
$sql = "Select name From myTable WHERE name IN ".$comma_separated ;
Ceci a été partiellement résolu ici: MySQL Comme plusieurs valeurs
Je déconseille
$ search = explode ('', $ search);
et entrez-les directement dans la requête SQL car cela rend sujet à l'injection SQL via la barre de recherche. Vous devrez d'abord échapper aux caractères au cas où ils essaient quelque chose d'amusant comme: "-; DROP TABLE name;
$ search = str_replace ('' ',' '' ", search);
Mais même cela n’est pas complètement sûr. Vous devez essayer d'utiliser des instructions SQL préparées pour plus de sécurité. Il est beaucoup plus facile d’utiliser une expression régulière pour créer une fonction permettant de préparer et de créer ce que vous voulez.
function makeSQL_search_pattern($search) {
search_pattern = false;
//escape the special regex chars
$search = str_replace('"', "''", $search);
$search = str_replace('^', "\\^", $search);
$search = str_replace('$', "\\$", $search);
$search = str_replace('.', "\\.", $search);
$search = str_replace('[', "\\[", $search);
$search = str_replace(']', "\\]", $search);
$search = str_replace('|', "\\|", $search);
$search = str_replace('*', "\\*", $search);
$search = str_replace('+', "\\+", $search);
$search = str_replace('{', "\\{", $search);
$search = str_replace('}', "\\}", $search);
$search = explode(" ", $search);
for ($i = 0; $i < count($search); $i++) {
if ($i > 0 && $i < count($search) ) {
$search_pattern .= "|";
}
$search_pattern .= $search[$i];
}
return search_pattern;
}
$search_pattern = makeSQL_search_pattern($search);
$sql_query = "SELECT name FROM Products WHERE name REGEXP :search LIMIT 6"
$stmt = pdo->prepare($sql_query);
$stmt->bindParam(":search", $search_pattern, PDO::PARAM_STR);
$stmt->execute();
Je n'ai pas testé ce code, mais c'est ce que je ferais dans votre cas… .. J'espère que cela vous aidera.