The biggest difficulty is to prepare the "LIKE" clause appropriately , since the user can type "%" or other characters with special meaning in your search.
function like($string, $e)
{
return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $string);
}
function like_clauses($campo, $termos)
{
$clauses = array();
foreach ($termos as $termo)
{
$clause =
'(' . $campo
. ' LIKE "%'
. mysqli_real_escape_string(like($termo, '='))
. '%" ESCAPE "=")';
$clauses[] = $clause;
}
return $clauses;
}
We can use the like_clauses
function above, giving the name of the search field and a list of words (terms), to get their appropriately formatted LIKE clauses.
function minha_busca($busca)
{
$termos = array();
foreach (explode(' ', $busca) as $palavra)
{
$termo = trim($palavra);
if (!empty($termo))
{
$termos[] = $termo;
}
}
$termos = array_unique($termos);
if (empty($termos))
{
return array();
}
// até aqui apenas limpamos a entrada
// garantindo a existência de pelo menos um termo de busca
$sql = sprintf(
'SELECT item_brand_id FROM marcas WHERE %s',
implode(' OR ', like_clauses('item_brand_name', $termos))
);
// com este primeiro SELECT, obtemos as MARCAS
$brand_ids = array();
/* rodar SQL, fazer loop nos resultados, incluir os item_brand_ids em $brand_ids */
$sql = sprintf(
'SELECT * FROM produto WHERE %s AND (%s)',
empty($brand_ids) ? 'TRUE' : 'item_brand_id IN (' . implode(', ', $brand_ids) . ')',
implode(' OR ', like_clauses('item_name', $termos))
);
// com este segundo SELECT, obtemos os produtos, restringidos (ou não) pelas marcas
$produtos = array();
/* rodar SQL, fazer loop nos resultados, incluir os registros em $produtos */
return $produtos;
}
To use the minha_busca
function above, and check the results:
$busca = $_POST['busca'];
$resultado = minha_busca($busca);
print_r($resultado);
Remarks :
-
The use of mysqli_real_escape_string
assumes that the mysqli
extension is in use, with an active connection.
-
In the minha_busca
function you still have to fill in the code that executes SQL and makes the loops in the results.