Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal
Tenho uma tabala no banco de dados chamada frases onde contém várias frases cadastradas.
E fiz um sistema de busca simples para buscar frases que contenham certa palavra. Porém gostaria que ele fizesse a busca por palavra exata.
Porém quando eu faço uma busca por frases que contenham a palavra casa e lista frases que contém palavras como casamento, casal etc. como faço para ele buscar a palavra exata. Segue abaixo o código que estou usando.
<?php
$pesquisar = $_POST['pesquisar'];
$result_frases = "SELECT * FROM frases WHERE frase LIKE '%$pesquisar%' LIMIT 100";
$resultado_frases = mysqli_query($conn, $result_frases);
while($rows_frases = mysqli_fetch_array($resultado_frases)){
echo $rows_frases['frase']."<br>";
}
?>Atualmente, o código está utilizando o operador LIKE com % no início e no final do termo pesquisado, o que permite encontrar resultados que contenham a palavra em qualquer parte da frase. Para buscar apenas a palavra exata, você precisa remover esses % e utilizar o operador = para a comparação. Então para realizar uma busca da palavra exata em vez de uma busca parcial use
$pesquisar = $_POST['pesquisar'];
$result_frases = "SELECT * FROM frases WHERE frase = '$pesquisar' LIMIT 100";
$resultado_frases = mysqli_query($conn, $result_frases);
while($rows_frases = mysqli_fetch_array($resultado_frases)){
echo $rows_frases['frase']."<br>";
}
Com essa alteração, a busca será feita apenas por frases que contenham exatamente a palavra pesquisada adicione LIMIT 100 que e oo que limita o resultado a 100 registros so alterar ou remove>
15 minutos atrás, Marcos_imasters disse:
Atualmente, o código está utilizando o operador LIKE com % no início e no final do termo pesquisado, o que permite encontrar resultados que contenham a palavra em qualquer parte da frase. Para buscar apenas a palavra exata, você precisa remover esses % e utilizar o operador = para a comparação. Então para realizar uma busca da palavra exata em vez de uma busca parcial use
$pesquisar = $_POST['pesquisar'];
$result_frases = "SELECT * FROM frases WHERE frase = '$pesquisar' LIMIT 100";
$resultado_frases = mysqli_query($conn, $result_frases);
while($rows_frases = mysqli_fetch_array($resultado_frases)){
echo $rows_frases['frase']."<br>";
}
Com essa alteração, a busca será feita apenas por frases que contenham exatamente a palavra pesquisada adicione LIMIT 100 que e oo que limita o resultado a 100 registros so alterar ou remove
Esse código pede para que a frase seja exatamente igual à palavra (o que buscamos é uma frase que CONTENHA uma palavra exata).
Eu também tentei resolver, mas não consegui:
<?php$conn=new mysqli("localhost","root","","laravel");
$palavra="Casa";
$sql="select * from frases where frase regexp '(^|[[:space:]])$palavra([[:space:]]|$)'";
$query=mysqli_query($conn,$sql);fala desse modo? SQL Fiddle :
CREATE TABLE IF NOT EXISTS `frases` (
`id` INT(11) UNSIGNED AUTO_INCREMENT,
`frase` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `frases` (`id`, `frase`) VALUES
('1', 'O céu é azul.'),
('2', 'Eu amo programar em PHP.'),
('3', 'Aprender é uma jornada contínua.');
SELECT * FROM frases WHERE frase REGEXP '[[:<:]]($palavras_para_buscar)[[:>:]]' LIMIT 100;>
12 minutos atrás, Marcos_imasters disse:
fala desse modo? SQL Fiddle :
CREATE TABLE IF NOT EXISTS `frases` (
`id` INT(11) UNSIGNED AUTO_INCREMENT,
`frase` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `frases` (`id`, `frase`) VALUES
('1', 'O céu é azul.'),
('2', 'Eu amo programar em PHP.'),
('3', 'Aprender é uma jornada contínua.');
SELECT * FROM frases WHERE frase REGEXP '[[:<:]]($palavras_para_buscar)[[:>:]]' LIMIT 100;
Error Code: 3685. Illegal argument to a regular expression. Qual é a versão do seu MySQL, o meu é 8.0.31rodei no 5.6 o link ai funcionando
Eu testei o MySQL 5.6 no endereço SQL Fiddle, incluindo Azul. Na hora de testar, ele retornou tanto maiúsculo como minúsculo.
Creio que frase REGEXP '[[:<:]]($palavras_para_buscar)[[:>:]]' funciona na MySQL 5.6 do mesmo modo que
frase regexp '(^|[[:space:]])$palavra([[:space:]]|$)' na versão MySQL 8.0.31
Ah sim isso é fácil só usar utf8_bin no COLLATE que garante que a comparação seja realizada de forma binária, tornando a pesquisa case-sensitive ou seja uma pesquisa sensível
SELECT * FROM frases WHERE frase COLLATE utf8_bin REGEXP '[[:<:]](azul)[[:>:]]' LIMIT 100;
tente colocando espaços antes e depois da variável, assim:
... WHERE frase LIKE '% $pesquisar %'
OR frase LIKE '$pesquisar %'
OR frase LIKE '% $pesquisar' ...