novatonew 0 Denunciar post Postado Maio 3, 2013 Estou tentando executar a seguinte função, porém não esta retornando nenhum valor: public retornaNome($imv){ if($imv == "1") $imv = "CASA"; if($imv == "2") $imv = "APTO"; try { $statement = $this->conn->prepare('SELECT C.NOME FROM CLIENTES WHERE :imv >1'); $statement->bindValue(':imv', $imv, PDO::PARAM_STR); $statement->execute(); } catch (PDOException $erro) { echo $erro->getMessage(); } while ($row = $statement->fetch()) { $tipos[] = array( 'nome' => $row['NOME'] ); } return $tipos; } a tabela possui a seguinte estrutura: TABELA CLIENTES NOME VARCHAR(30) ENDERECO VARCHAR(30) CASA INT /* Quero saber quantas casas o cliente tem */ APTO INT /*Quero saber quantos apartamentos o cliente tem */ Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Maio 3, 2013 $statement = $this->conn->prepare('SELECT C.NOME, FROM CLIENTES WHERE :imv >1'); antes do FROM tem uma virgula sobrando remova-a. acho q sua consulta deveria ser assim: SELECT campos FROM tabela WHERE campos1 = :valor Compartilhar este post Link para o post Compartilhar em outros sites
novatonew 0 Denunciar post Postado Maio 3, 2013 $statement = $this->conn->prepare('SELECT C.NOME, FROM CLIENTES WHERE :imv >1'); antes do FROM tem uma virgula sobrando remova-a. acho q sua consulta deveria ser assim: SELECT campos FROM tabela WHERE campos1 = :valor Desculpe, a virgula foi removida, mas não funciona, O Select vai me informar todos os clientes que possuem mais que uma casa ou apto, dependendo do parâmetro. a variável esta no lugar correto, a tabela possui a seguinte estrutura: TABELA CLIENTES NOME VARCHAR(30) ENDERECO VARCHAR(30) CASA INT /* Quero saber quantas casas o cliente tem */ APTO INT /*Quero saber quantos apartamentos o cliente tem */ Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Maio 3, 2013 tentou usar um OR? CLIENTES WHERE casa > 1 OR apto > 1 Compartilhar este post Link para o post Compartilhar em outros sites
novatonew 0 Denunciar post Postado Maio 3, 2013 tentou usar um OR? CLIENTES WHERE casa > 1 OR apto > 1 Com o or funciona, porém estou estudando PDO e gostaria de implementar um select com os campos da tabela sendo dinâmicas. Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Maio 3, 2013 $query = "SELECT C.NOME FROM CLIENTES WHERE %s > 1;" PHP 5.4 (coisa linda!) $stmt = $pdo->prepare(sprintf($query, ['casa', 'apto'][$imv - 1])); Others $campos = array('casa', 'apto'); $stmt = $pdo->prepare(sprintf($query, $campos[$imv - 1])); Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Maio 3, 2013 $stmt = $pdo->prepare(sprintf($query, ['casa', 'apto'][$imv - 1])); Agora eu concordo com você. Compartilhar este post Link para o post Compartilhar em outros sites
novatonew 0 Denunciar post Postado Maio 4, 2013 $stmt = $pdo->prepare(sprintf($query, ['casa', 'apto'][$imv - 1])); Agora eu concordo com você. $query = "SELECT C.NOME FROM CLIENTES WHERE %s > 1;" PHP 5.4 (coisa linda!) $stmt = $pdo->prepare(sprintf($query, ['casa', 'apto'][$imv - 1])); Others $campos = array('casa', 'apto'); $stmt = $pdo->prepare(sprintf($query, $campos[$imv - 1])); Entendo que dessa maneira funciona, inclusive, uma solução linda, mas ainda não consegui entender porque o PDO não consegue escrever uma variável no select que não seja uma variável no SGBD, será que ele coloca aspas (' '), por isso o SGBD não interpreta e ai da erro de sql? Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Maio 4, 2013 eu acho bem estranho vc usar bindValue para uma coluna, o metodo mais adequado seria bindColumn http://php.net/manual/en/pdostatement.bindcolumn.phphttp://phpmaster.com/avoid-the-original-mysql-extension-2/ Compartilhar este post Link para o post Compartilhar em outros sites
novatonew 0 Denunciar post Postado Maio 5, 2013 eu acho bem estranho vc usar bindValue para uma coluna, o metodo mais adequado seria bindColumn http://php.net/manual/en/pdostatement.bindcolumn.php http://phpmaster.com/avoid-the-original-mysql-extension-2/ substitui o bindValue por bindCollumn desta maneira: public retornaNome($imv){ if($imv == "1") $imv = "CASA"; if($imv == "2") $imv = "APTO"; try { $statement = $this->conn->prepare('SELECT C.NOME FROM CLIENTES WHERE imv >1'); $statement->execute(); $statement->bindColumn('imv', $imv); while ($row = $statement->fetch()) { $tipos[] = array( 'nome' => $row['NOME'] ); } } catch (PDOException $erro) { echo $erro->getMessage(); } return $tipos; } O erro retornado foi: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'imv' in 'field list' Me parece que ele não esta substituindo a variável. Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Maio 5, 2013 Não, amigo, aprenda a tratar os erros, veja a mensagem, nela diz o que te falta: Unknown column 'imv' in 'field list' Traduza, e verá o que é. Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Maio 5, 2013 segundo o cara desse topico o negocio é vc o $imv na consulta. http://stackoverflow.com/questions/8314043/how-to-dynamically-build-queries-with-pdo $statement = $this->conn->prepare('SELECT C.NOME FROM CLIENTES WHERE $imv >1'); o bindColumn ser para associar variaveis aos nomes de colunas. $sql = "select nome, casa from clientes where casa > 1"; $stmt = $db->prepare($sql); $stmt->execute(); $stmt->bindColumn(1, $nome_estranho); $stmt->bindColumn(2, $outro_nome); $result = $stmt->fetch(); while($result = $stmt->fetch()){ echo $nome_estranho ." - ". $outro_nome ." <br>"; } Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Maio 6, 2013 eu acho bem estranho vc usar bindValue para uma coluna, o metodo mais adequado seria bindColumn http://php.net/manual/en/pdostatement.bindcolumn.php http://phpmaster.com/avoid-the-original-mysql-extension-2/ @shini, o bindColumn não serve para alterar consultas. Este método opera nos resultados Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Maio 6, 2013 @shini, o bindColumn não serve para alterar consultas. Este método opera nos resultados eu percebi depois. mesmo assim valeu. Compartilhar este post Link para o post Compartilhar em outros sites
novatonew 0 Denunciar post Postado Maio 6, 2013 Não, amigo, aprenda a tratar os erros, veja a mensagem, nela diz o que te falta: Traduza, e verá o que é. Desculpe, mas preciso te dizer uma coisa, se for pra responder post's desta forma, nem responda, pois como já diz o ditado, "Se não for pra ajudar, não atrapalha", Eu sabia o que estava escrito la em cima, obviamente eu sei que a coluna imv não existe. Até por isso disse que achava que o PDO não estava substituindo a variável imv, pois o erro correto, se tudo estivesse correndo bem, era informar que o valor de imv, que no caso era "APTO" ou "CASA", era desconhecido. Sem mais delongas é isso. Me desculpe por falar desta forma, mas o que é certo é certo. segundo o cara desse topico o negocio é vc o $imv na consulta. http://stackoverflow.com/questions/8314043/how-to-dynamically-build-queries-with-pdo $statement = $this->conn->prepare('SELECT C.NOME FROM CLIENTES WHERE $imv >1'); o bindColumn ser para associar variaveis aos nomes de colunas. $sql = "select nome, casa from clientes where casa > 1"; $stmt = $db->prepare($sql); $stmt->execute(); $stmt->bindColumn(1, $nome_estranho); $stmt->bindColumn(2, $outro_nome); $result = $stmt->fetch(); while($result = $stmt->fetch()){ echo $nome_estranho ." - ". $outro_nome ." <br>"; } Obrigado, acredito que seja isto mesmo, com o PDO não é possível colocar parâmetros nos nomes das colunas, a dúvida do amigo do stackOverflow é exatamente a minha. Ainda bem que são pessoas como você e o Evandro Oliveira que tentam realmente ajudar, que fazem desse fórum a POTÊNCIA que ele é. Parabéns shini e o Evandro Oliveira. Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Maio 6, 2013 Nem o rei agradou a todos, imagine eu. Minha observação foi feita, ainda que pequena, tirar proveito dela ou não é problema seu, apenas fiz uma observação de que a mensagem de erro mostra o problema, na maioria das vezes. FIM DE PAPO. Compartilhar este post Link para o post Compartilhar em outros sites