Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

novatonew

PDO - O campo da tabela é uma variável - não funciona.

Recommended Posts

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

 

$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

 

$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

tentou usar um OR?

 

 

CLIENTES WHERE casa > 1 OR apto > 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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

$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

 

$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

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

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

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

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, 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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.