web-dev-qa-db-fr.com

SQL recherche plusieurs valeurs dans le même champ

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

17
Nir Tzezana

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.

35
Glitch Desire

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 ;
4
codingbiz

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.

0
Volfegan