manière PHP pour exécuter SQL correspondant sans une requête COMME base de données?
-
05-09-2019 - |
Question
Je veux correspondre à une chaîne d'entrée à ma page PHP de la même façon un match par la commande LIKE dans SQL (MySQL) pour la cohérence des autres recherches. Depuis (je l'ai vu, mais ne comprennent pas) une partie de la syntaxe PHP inclut des commandes SQL Je me demande si cela est possible?
La raison est que je suis maintenant une recherche de mise en œuvre d'un mot clé par rapport à des champs dans la base de données qui sont stockées dans un tableau sérialisé, que je dois unserialize en PHP et la recherche en fonction de la structure du tableau. Je ne peux pas interroger sur la table, juste besoin de la capacité d'adaptation de la requête. Sinon, je dois trouver une routine d'appariement alternatif, qui ne sera pas cohérente. Je ne peux pas revenir en arrière et structure la DB depuis cela n'a pas été prévu wayyy retour dans les spécifications. Oui, je besoin d'un bidouille horrible, mais je cherche le plus élégant.
S'il est impossible que je pourrais utiliser toute recommandation de l'utilisateur correspondant du texte tapé un mot clé contre le texte stocké.
EDIT (pour des précisions): mon principal problème est que je n'ai pas une connaissance approfondie sur la façon dont les travaux de commande comme (simplement copier le code) et que le mot-clé implique un certain degré d'imprécision, je voudrais que l'imprécision conservée si Je passe à une expression régulière. Je suis mieux avec regex tout simplement pas si bon avec comme. Ma requête est "LIKE '% matchme'"
La solution
Mise à jour
D'après le commentaire de Tomalak et brillante idée de OIS utiliser preg_grep, cela pourrait être quelque chose de plus le long des lignes d'une solution finale pour vous.
<?php
function convertLikeToRegex( $command )
{
return "/^" . str_replace( '%', '(.*?)', preg_quote( $command ) ) . "$/s";
}
function selectLikeMatches( $haystack, $needle )
{
return preg_grep( convertLikeToRegex( $needle ), $haystack );
}
$likeClauses = array(
'%foo'
,'foo%'
,'%foo%'
);
$testInput = array(
'foobar'
,'barfoo'
,'barfoobaz'
);
foreach ( $likeClauses as $clause )
{
echo "Testing $clause:";
echo '<pre>';
print_r( selectLikeMatches( $testInput, $clause ) );
echo '</pre>';
}
Original Post ci-dessous
Est-ce le long des lignes de ce que vous êtes après?
<?php
function convertLikeToRegex( $command )
{
return "/^" . str_replace( '%', '(.*?)', $command ) . "$/s";
}
$likeClauses = array(
'%foo'
,'foo%'
,'%foo%'
);
$testInput = array(
'foobar'
,'barfoo'
,'barfoobaz'
);
foreach ( $testInput as $test )
{
foreach ( $likeClauses as $clause )
{
echo "Testing '$test' against like('$clause'): ";
if ( preg_match( convertLikeToRegex( $clause ), $test ) )
{
echo 'Matched!';
} else {
echo 'Not Matched!';
}
echo '<br>';
}
echo '<hr>';
}
Autres conseils
Qu'est-ce que vous avez besoin est preg_grep fait.
$arr = array("tstet", "duh", "str");
$res = preg_grep("#st#i", $arr); //i for case insensitive
var_dump($res);
résultats dans
array(2) {
[0]=>
string(5) "tstet"
[2]=>
string(3) "str"
}
edit:
l'utilisateur fournit le texte, ajouter la wildcards dans les coulisses. Je ne l'utilise un %. LIKE 'texte%'
Voici comment vous spécifiez dans regex
"#st#i" regex is the same as in sql "%st%"
"#^st#i" regex is the same as in sql "st%"
"#st$#i" regex is the same as in sql "%st"
De plus, pensez à utiliser preg_quote sur tout texte vous obtenez d'un tiers. $ Regex = "#". preg_quote (texte de $). "#je"; $ Res = preg_grep ($ regex $ arr);
Je pense que vous auriez besoin preg_match mais ce n'est pas exactement le même comportement que LIKE .
<?php // The "i" after the pattern delimiter indicates a case-insensitive search
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found."; }
?>
Voulez-vous dire que vous voulez être en mesure de vérifier si la chaîne d'entrée est comme var%?
Vous pouvez utiliser strpos (botte de foin, aiguille) pour correspondre%% var.
if( strpos($source, "var") == 0 ) echo "matches var%";
if( strlen($source) - (strpos($source, "var")) == strlen("var") ) echo "matches %var";
C'est assez laid. Et en fait probablement pas le plus élégant.