J'ai essayé de comprendre comment faire une requête avec MySQL qui vérifie si la valeur (chaîne $haystack
) d'une certaine colonne contient certaines données (chaîne $needle
), comme ceci:
mysql_query("
SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')
");
En PHP, la fonction s'appelle substr($haystack, $needle)
, alors peut-être:
WHERE substr(`column`, '{$needle}')=1
Assez simple en fait:
mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");
Le %
est un caractère générique pour tout caractère. Notez que cela peut être lent sur de très grands ensembles de données. Par conséquent, si votre base de données s'agrandit, vous devrez utiliser des index en texte intégral.
WHERE `column` LIKE '%$needle%'
Le mien utilise LOCATE
dans mysql:
LOCATE (substr, str), LOCATE (substr, str, pos)
Cette fonction est multi-octets sécurisée et est sensible à la casse uniquement si au moins un argument est une chaîne binaire.
Dans ton cas:
mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}','column') > 0
");
En plus de la réponse de @WoLpH.
Lorsque vous utilisez le mot clé LIKE
, vous avez également la possibilité de limiter la direction dans laquelle la chaîne correspond. Par exemple:
Si vous cherchiez une chaîne commençant par votre $needle
:
... WHERE column LIKE '{$needle}%'
Si vous cherchez une chaîne qui se termine par le $needle
:
... WHERE column LIKE '%{$needle}'
sachez que c'est dangereux:
WHERE `column` LIKE '%{$needle}%'
faire en premier:
$needle = mysql_real_escape_string($needle);
cela empêchera les attaques éventuelles.
Vous recherchez probablement find_in_set
fonction:
_Where find_in_set($needle,'column') > 0
_
Cette fonction agit comme in_array
fonction en PHP