PHP maneira de executar SQL como correspondência sem uma consulta de banco de dados?
-
05-09-2019 - |
Pergunta
Eu quero corresponder uma cadeia de entrada à minha página PHP da mesma forma um jogo feito pelo comando LIKE em SQL (MySQL) para a consistência de outras pesquisas. Uma vez que (eu já vi, mas não compreendem) alguns da sintaxe PHP inclui comandos SQL Eu estou querendo saber se isso é possível?
A razão para isso é que eu estou agora a implementar uma pesquisa de uma palavra-chave contra campos no banco de dados que são armazenados em uma matriz serializada, que eu tenho que unserialize em PHP e procurar dependendo da estrutura da matriz. Eu não posso consulta a tabela, só precisa a capacidade de correspondência da consulta. Caso contrário, eu preciso encontrar uma rotina correspondente alternativa, que não será consistente. Eu não posso voltar e re-estrutura do DB uma vez que este não foi antecipado wayyy volta na spec. Sim, eu preciso de um corte feio, mas estou procurando o mais elegante.
Se não for possível, eu poderia usar qualquer recomendação de usuário correspondente texto digitado como uma palavra-chave contra o texto armazenado.
Editar (para esclarecimento): o meu principal problema é que eu não tenho uma compreensão profunda sobre como funciona o comando como (apenas copiar o código) e como a palavra-chave implica algum grau de imprecisão, gostaria que indefinição preservada se eu mudar para uma expressão regular. Eu sou melhor com regex não é apenas tão bom com gosto. Minha pergunta é "como 'matchme%'"
Solução
Atualização
Com base no comentário de Tomalak e brilhante idéia de OIS para uso preg_grep, isso pode ser algo mais ao longo das linhas de uma solução definitiva para você.
<?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 abaixo
É este ao longo das linhas de que você está depois?
<?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>';
}
Outras dicas
O que você precisa é preg_grep na verdade.
$arr = array("tstet", "duh", "str");
$res = preg_grep("#st#i", $arr); //i for case insensitive
var_dump($res);
resultado em
array(2) {
[0]=>
string(5) "tstet"
[2]=>
string(3) "str"
}
edit:
o usuário fornece o texto, eu adicionar o curingas nos bastidores. Eu faço uso 1 %. 'Text%' COMO
aqui é como você especificá-lo no 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"
Além disso, lembre-se de usar preg_quote em qualquer texto você começa a partir de um terceiro. $ Regex = "#". preg_quote ($ text). "#Eu"; $ Res = preg_grep ($ regex, $ arr);
Eu acho que você precisa preg_match mas isso não é exatamente o mesmo comportamento como um COMO .
<?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."; }
?>
Você quer dizer que você quer ser capaz de verificar se a cadeia de entrada é como var%?
Você pode usar strpos (palheiro, agulha) para corresponder% var%.
if( strpos($source, "var") == 0 ) echo "matches var%";
if( strlen($source) - (strpos($source, "var")) == strlen("var") ) echo "matches %var";
Isso é muito feio. E na verdade, provavelmente não é o mais elegante.