Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou 'tentando' mexer com o PDO substituindo a conexão antiga que eu tinha (mysql - php).
Estou com problema com isso:
$stmt->bindValue(1, $value);
Quero colocar isso nos meus "?" da query. Porém, a query é construída em uma outra função.
Função 1:
$connection = new PDO('mysql:host=localhost;dbname=base', 'root', 'root');
$query = 'select * from tabela where ' . getWhere();
$stmt = $connection->prepare($query);
Função 2 (getWhere):
$retorno = "";
if(isset($_POST['nome'])){
$retorno .= "nome = '?' ";
//quero colocar aqui o "$stmt->bindValue(1, $value);"
}
if(isset($_POST['idade'])){
$retorno .= "and idade= '?' ";
//quero colocar aqui o "$stmt->bindValue(2, $value);"
}
Mas preciso passar alguma coisa por parâmetro pra getWhere. Não sei se é a conexão, ou outra coisa.
Obrigado !
Obrigado pela resposta. Nesse caso foram 2 verificações apenas, mas tenho uma tela onde são 18. 18 verificações (isset, depois se é != de "", depois o strlen). 54 condições dentro da DAO fica meio ruim.
Se são tantas tente recorrer aos recursos que a linguagem te oferece. Então não seja por isso, o empty() faz a função do isset() e ainda verifica se vazio, já que são tantas verificações use a função array_map():
$where = array();
$values = array();
//nome dos campos
$fields = array('nome', 'idade');
array_map(function($f) use(&$values, &$where) {
if (!empty($_POST[$f])) {
$where[] = $f . " = ?";
$values[] = $_POST[$f];
}
}, $fields);
if (!empty($where)) {
$sql = " where " . implode(" and ", $where);
}
//...
E assim você vai adaptando oras..a lógica é a mesma, a quantidade de verificações também, só diminuiu a quantidade de código vísivel
Obrigado pela resposta. Dei uma olhada nesse código, ele realmente é menos poluído do que o jeito que eu faço, mas vi uma coisa nele que achei estranha. Se puder me ajudar.
Isso resolve se o nome do parâmetro for idêntico ao nome da coluna, correto ? E se a meu select tiver um alias ?
select usu.nome from usuario as usu where usu.idade = 41O post vem como "nome", mas no select é "usu.nome", aqui $where[] = $f . " = ?";não daria certo né ?Você está com a faca, o queijo e por cima ainda está cortado e mastigado. Concatene o alias ué, se entre esses vários campos tiver alias aleatoriamente com a função array_map() você pode cuidar disso e mapear vários arrays ao mesmo tempo:
$fields = array('nome', 'idade');
$aliases = array('table1', 'table2'); //alias respectivamente aos campos acima
array_map(function($f, $alias) use(&$values, &$where) {
if (!empty($_POST[$f])) {
$where[] = $alias . "." . $f . " = ?";
$values[] = $_POST[$f];
}
}, $fields, $aliases);
//...
Cara uma dica pra esse caso aí, ranca essa função! Ficar passando parâmetro assim é inútil. Faça tipo:
//campos que vc quer adicionar
if (!empty($where)) {
//só adicionar os valores na bagaça