How to use more than one LIKE in PDO bindValue

Asked

Viewed 101 times

1

I’m having a hard time making an appointment SQL with the bindValue from PDO. I need to pass more than one value in the clause query like :cc plus the value returned is 0. If I use only one value the return is right.

if($dptoUser == "ADMINISTRACAO")
 {
  $centroDeCusto = "500";
 }
if($dptoUser == "VENDAS")
 {
  $centroDeCusto  = "100 OR bem.CENTRO_CUSTO LIKE 500 ";
 }

$var2 = $rev_teste;
$sql = "SELECT count(bem.bem) as conte FROM AFX_BEM bem 
  LEFT JOIN AFX_BAIXA baixa
ON bem.BEM = baixa.BEM and bem.REVENDA = baixa.REVENDA and bem.AGREGADO = 
   baixa.AGREGADO
  LEFT JOIN AFX_TRANSFERENCIA tr
on bem.BEM = tr.BEM and bem.REVENDA = tr.REVENDA and bem.AGREGADO = tr.AGREGADO
WHERE bem.revenda LIKE :contador AND bem.CENTRO_CUSTO LIKE :cc 
AND baixa.BEM is null and baixa.REVENDA is null and baixa.AGREGADO is null and tr.BEM is null and tr.AGREGADO is null and tr.REVENDA is null    "; 
$result = $pdo->prepare($sql); 
$result->bindValue(':contador', '%' . $var2 . '%', PDO::PARAM_STR);
$result->bindValue(':cc', '%' . $centroDeCusto . '%', PDO::PARAM_STR);
$result->execute(); 
$number_of_rows = $result->fetchColumn();

how can I make this consultation work?

  • 1

    vc can only bind values try to add a chunk of sql as value will not work, a value for each placeholders.

  • sorry my ignorance but could give me an idea of how I can do it?

2 answers

2

/*
Boa Noite!
eu não conheço muito de php, mas vc pode seguinte maneira.
1 - criar um array que receba todos os seus campos.
2 - criar uma variavel com inicio de seu sql.
3 - cria uma variavel que fecha seu sql. 
4 - criar uma variavel do tipo texto na qual será alimentado com o sql. 

abaixo como ficaria em c#

*/
string sSql = "select tab.campo_nome from tbl_pessoas tab where tab.campo_uf_nasc = 'sp' ";
string sSql_complementar = "";
string sSql_final = " order by tab.campo_cidades";
string[] lista= { "POMPEIA", "SAO PAULO", "", "OSASCO" };

foreach (var item in lista)
{
    if (item.Replace(" ","") != "")
    {
        if (sSql_complementar == "")
        {
            sSql_complementar = " tab.campo_lidade like '%" + item + "%' ";
        }
        else
        {
            sSql_complementar = sSql_complementar + " and tab.campo_cidade like '%" + item + "%' ";
        }

    }
}

sSql = sSql + sSql_complementar + sSql_final;

1

This is not the most appropriate possibility, but I believe it could make it possible to carry out the consultation.

As described in the rray comment, bindValue may not accept sql chunk, so you should create a value for each.

In this code example, the variable was created $clause which is concatenated with the query sql according to the $dptoUser and depending on this will have one or more Bindvalues.

$clausula = "";
if ($dptoUser == "ADMINISTRACAO") {
    $centroDeCusto = "500";
    $clausula = " AND bem.CENTRO_CUSTO LIKE :cc";
}
if ($dptoUser == "VENDAS") {
    $centroDeCusto = "100";
    $centroDeCusto2 = "500";
    $clausula = " AND (bem.CENTRO_CUSTO LIKE :cc OR bem.CENTRO_CUSTO LIKE :cc2)";
}

$var2 = $rev_teste;
$sql = "SELECT count(bem.bem) as conte FROM AFX_BEM bem
LEFT JOIN AFX_BAIXA baixa ON bem.BEM = baixa.BEM and bem.REVENDA = baixa.REVENDA and bem.AGREGADO = baixa.AGREGADO
LEFT JOIN AFX_TRANSFERENCIA tr ON bem.BEM = tr.BEM and bem.REVENDA = tr.REVENDA and bem.AGREGADO = tr.AGREGADO
WHERE bem.revenda LIKE :contador {$clausula} 
AND baixa.BEM is null 
AND baixa.REVENDA is null 
AND baixa.AGREGADO is null 
AND tr.BEM is null 
AND tr.AGREGADO is null 
AND tr.REVENDA is null ";

$result = $db->prepare($sql);
$result->bindValue(':contador', '%' . $var2 . '%', PDO::PARAM_STR);

if (!empty($clausula)) {
    $result->bindValue(':cc', '%' . $centroDeCusto . '%', PDO::PARAM_STR);

    if (!empty($centroDeCusto2)) {
        $result->bindValue(':cc2', '%' . $centroDeCusto2 . '%', PDO::PARAM_STR);
    }
}

$result->execute();
$number_of_rows = $result->fetchColumn();
echo $number_of_rows;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.