web-dev-qa-db-fra.com

Comment créer une requête paramétrée PDO avec une instruction LIKE?

Voici ma tentative:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}
99
Andrew G. Johnson

Je l'ai compris juste après avoir posté:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}
121
Andrew G. Johnson

Pour utiliser Like avec% partial matching, vous pouvez également procéder de la manière suivante: column like concat('%', :dangerousstring, '%') avec le paramètre nommé :dangerousstring. En d’autres termes, vous devez utiliser des signes% explicitement non échappés dans votre propre requête, qui sont séparés et qui ne correspondent certainement pas à la saisie de l’utilisateur.

Edit: Une syntaxe alternative de concaténation que j'ai trouvée consiste à utiliser l'opérateur de concaténation: ||, de sorte qu'il deviendra simplement: where column like '%' || :dangerousstring || '%' etc

@bobince mentionne ici que:

La difficulté vient quand vous voulez autoriser un _ littéral % ou _ caractère dans la chaîne de recherche, sans que cela agisse comme un caractère générique.

C'est donc quelque chose d'autre à surveiller lors de la combinaison du type et du paramétrage.

74
Kzqai
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}
17
Blazer

Vous pouvez aussi essayer celui-ci. Je fais face à un problème similaire, mais j'ai obtenu des résultats après des recherches.

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);
10
Vijaysinh Parmar

Cela marche:

search `table` where `column` like concat('%', :column, '%')
4
kjdion84

Je l'ai eu de délires php

$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

Et cela fonctionne pour moi, très simple. Comme il le dit, vous devez "préparer notre littéral complet en premier" avant de l'envoyer à la requête

1
gavin

AOP échappe à "%" (peut entraîner une injection sql): L'utilisation du code précédent donnera les résultats souhaités pour rechercher des chaînes partielles MAIS Si un visiteur tape le caractère "%", vous obtiendrez toujours des résultats même si rien n'est stocké dans la base de données (cela peut entraîner des injections SQL)

J'ai essayé beaucoup de variations, toutes avec le même résultat. PDO échappe à "%" menant aux résultats de recherche non désirés/non excités.

Je pensais que ça valait la peine de partager si quelqu'un a trouvé un mot autour de lui, merci de le partager

0
Ozkar R

Si vous voulez le faire avec php et non dans la requête

$string = 'this is a string';
$len = strlen($string);
$first = substr_replace($string, '%', 0,0); // insert % before the first character
$string = substr_replace($first, '%', $len+1,0); // insert % after the last one

Le $string aura la valeur '%this is a string%'

J'en ai fait une fonction et je l'ai utilisée pour mes déclarations similaires

0
Samuel Gfeller