Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ricardoneves93

PDO

Mensagens Recomendadas

ricardoneves93

Boa tarde, estou a fazer um trabalho onde tenho que fazer um website para gerenciamento de facturas. Já tenho a minha base de dados construída. O problema é o seguinte eu quero fazer uma query onde passo dois argumentos na mesma igualdade:

if(isset($_GET['field']) && isset($_GET['value']))
  {
$stmt = $db->query('SELECT * FROM cliente where :field = :value');

 $parameters = array();
 array_push($parameters, $_GET['field']);
 array_push($parameters, $_GET['value']);
 $stmt->execute($parameters);
 $result = $stmt->fetch();

A forma como eu estou a chamar o php penso que é correcta: "read.php?field=customerID&value=1"

Só que isto não está a encontrar nenhuma correspondência. Mas eu sei que elas existem.

Mas se fizer assim já funciona, mas preciso de ter aqueles 2 parâmetros.

$stmt = $db->query('SELECT * FROM cliente where costumerID = :value');

Cumprimentos

Ricardo Neves

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o array de parâmetros necessita de ser um array associativo com os nomes dos parâmetros que pretendes atribuir

$parameters = array("field" => $_GET['field'],
                   "value" => $_GET['value']);
$stmt->execute($parameters);


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
t0ze

Não sei se percebi bem mas, já experimentas-te com o bindValues ?

if(isset($_GET['field']) && isset($_GET['value']))
  {
    $stmt = $db->query('SELECT * FROM cliente where :field = :value');

       $stmt ->bindValue(':field', $_GET['field], PDO::PARAM_STR);
        $stmt ->bindValue(':value', $_GET['value'], PDO::PARAM_INT);
	 $result = $stmt->fetch();

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

Já tentei fazer os dois exemplos e nada. Eu acho que o problema é o seguinte:

Ainda não vi nenhum exemplo onde tivesse a receber as duas variáveis para fazer por exemplo "SELECT * FROM cliente where ? = ?". Eu acho que não se pode fazer isso, deve-se é poder fazer e assim comigo funciona "SELECT * FROM cliente where nome = ?", ou seja o primeiro parâmetro do teste de igualdade como é algo concreto, não deve ser permitido usa-lo como variável. Mas também posso estar enganado! Ou estar a cometer algum erro no meu codigo(mais provável!), mas vou ver se o encontro...

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Já tentei fazer os dois exemplos e nada. Eu acho que o problema é o seguinte:

Ainda não vi nenhum exemplo onde tivesse a receber as duas variáveis para fazer por exemplo "SELECT * FROM cliente where ? = ?". Eu acho que não se pode fazer isso, deve-se é poder fazer e assim comigo funciona "SELECT * FROM cliente where nome = ?", ou seja o primeiro parâmetro do teste de igualdade como é algo concreto, não deve ser permitido usa-lo como variável. Mas também posso estar enganado! Ou estar a cometer algum erro no meu codigo(mais provável!), mas vou ver se o encontro...

já sei qual é o problema, o mesmo apareceu p'rai a um mês aqui no fórum.

pensa no resultado final do usar o código anterior:

// valores exemplo : $_GET['field'] = customerID | $_GET['value'] = 1

$stmt = $db->query('SELECT * FROM cliente where :field = :value');
$parameters = array("field" => $_GET['field'],
                   "value" => $_GET['value']);
$stmt->execute($parameters); // SQL a ser executado : SELECT * FROM cliente where 'customerID' = '1'
//                                                                                A          A
//                                                                                 \        /
//                                                                                   ERRADO

conclusão, não podes fazer isso ...

a tua única solução é usar o PDO::quote com uma certa manha

// fazer "escape" aos caracteres que necessitam
// o problema é que o PDO::quote adiciona apostrofes antes e depois (se não existir)
// por isso é necessário tirar
$field = substr($db->quote($_GET['field']), 1, -1);

$stmt = $db->query('SELECT * FROM cliente where `{$field}` = :value');
$parameters = array("value" => $_GET['value']);
$stmt->execute($parameters); // SQL a ser executado : SELECT * FROM cliente where `customerID` = '1'


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

Okay, já entendi! Para já tenho isto:

if(isset($_GET['field']) && isset($_GET['value']))
  {
 $field = substr($db->quote($_GET['field']), 1, -1);
 $stmt = $db->query('SELECT * FROM cliente where `{$field}` = :value');

 $parameters = array("field" => $_GET['field']);
 $stmt->execute($parameters);
 $result = $stmt->fetch(); ...........
  .................................
..................
......................
}

porém está a dar o seguinte erro "Call to a member function execute() on a non-object". Porque é que não é necessário fazer bindValue() neste caso? O array parameters nao devia ficar como anteriormente?

$parameters = array("field" => $_GET['field'],
				"value" => $_GET['value']);

Obrigados pela ajuda

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o problema deverá ser porque eu escrevi mal o comando de criação do PDOStatement

$stmt = $db->query("SELECT * FROM cliente where `{$field}` = :value"); // com "s


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

o problema deverá ser porque eu escrevi mal o comando de criação do PDOStatement

$stmt = $db->query("SELECT * FROM cliente where `{$field}` = :value"); // com "s

Sim isso já corrigiu, mas ainda tem um problema quando faço

$result = $stmt->fetch();

a variável $result dá nula, também sei que não é problema da base de dados. Alguma sugestão?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

não tens que fazer "prepare" em vez de "query" ?

$stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value"); 
$parameters = array("field" => $_GET['field']);
$stmt->execute($parameters);
$result = $stmt->fetch();

Editado por Devexz

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

é o que dá não pegar no PHP à imenso ... um gajo tem um trabalho noutra linguagem e esquece de tudo ... (estou a falar de mim)

if(isset($_GET['field']) && isset($_GET['value'])) {
 $field = substr($db->quote($_GET['field']), 1, -1);
 $stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value");
//                A
//                |
//        prepare e não query !!
 $parameters = array("field" => $_GET['field']);
 if ($stmt->execute($parameters) == false) {
   // erro
 }
 $result = $stmt->fetch();


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

$parameters = array("field" => $_GET['field']); // QUÊ É ISTO??!!!!

mete

$parameters = array("$field" => $_GET['field']); 

Editado por Devexz

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

mete isto dentro do if

if ($stmt->execute($parameters) == false) {
   // erro
   print_r($stmt->errorInfo());
 }

Qual é o output?


Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93
if(isset($_GET['field']) && isset($_GET['value']) && isset($_GET['op']))
  {
 $field = substr($db->quote($_GET['field']), 1, -1);

 $stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value");


   $parameters = array("$field" => $_GET['field']);

    if($stmt->execute($parameters) == false)
 {
  print_r($stmt->errorInfo());
 }

    $result = $stmt->fetch();
 $costumers = array();

   while($result != null)
 {
  $newCostumer['customerID'] = $result['customerID'];
  $newCostumer['customerTaxID'] = $result['customerTaxID'];
  $newCostumer['companyName'] = $result['companyName'];
  $newCostumer['eMail'] = $result['eMail'];
  $newCostumer['adressDetail'] = $result['adressDetail'];
  $newCostumer['city'] = $result['city'];
  $newCostumer['postalCode'] = $result['postalCode'];
  $newCostumer['country'] = $result['country'];
  array_push($costumers, $newCostumer);
  $result = $stmt->fetch();

 }
 echo json_encode($costumers);
  }

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Também já tenho obrigação de reparar nisso... Porém agora está a dar erro no execute ou seja está a entrar no if. Isto já se está a tornar penoso xD

pois ... também tinhas obrigação de ver esta:

if(isset($_GET['field']) && isset($_GET['value'])) {
 $field = substr($db->quote($_GET['field']), 1, -1);
 $stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value");
//                                                                  A
//                                                                  |
//                                                           nome do parametro
 $parameters = array("field" => $_GET['field']);
//                       A               A
//                       |               |
//                       nome do parametro
 if ($stmt->execute($parameters) == false) {
   // erro
 }
 $result = $stmt->fetch();

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz
//aqui no get não será value em do field?
$parameters = array("$field" => $_GET['value']);

Editado por Devexz
  • Voto 1

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

tenta de novo mas sem esta linha de código

//
 $field = substr($db->quote($_GET['field']), 1, -1);

Se isso não funcionar vai à bd e faz a query directamente com os valores do get que estás a definir para ver se query está a funcionar correctamente.

SELECT * FROM cliente where `teucampo` = 'teuvalor'


Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

sem essa linha de código não corre porque dessa forma esta linha de código torna-se inutil e oexecute dá erro:

$stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value");

Já fui à base de dados como está na imagem e devolve o valor que eu esperava e na URL do php mando isto "read.php?field=customerID&value=1".

Não estou a entender o problema...

a7IwnRD.png

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu já te demonstrei onde está o erro !!!!

pois ... também tinhas obrigação de ver esta:

if(isset($_GET['field']) && isset($_GET['value'])) {
 $field = substr($db->quote($_GET['field']), 1, -1);
 $stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value");
//                                                                  A
//                                                                  |
//                                                           nome do parametro
 $parameters = array("field" => $_GET['field']);
//                       A               A
//                       |               |
//                       nome do parametro
 if ($stmt->execute($parameters) == false) {
   // erro
 }
 $result = $stmt->fetch();


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

epa ... responde a estas duas questões :

$stmt = $db->prepare("SELECT * FROM cliente where `{$field}` = :value");
//                                                                A
//                                                                |
//                                                         o que é isto ?

 $parameters = array("field" => $_GET['field']);
//                       A
//                       |
//                  o que é isto ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.