Jump to content
Sign in to follow this  
ricardoneves93

PDO

Recommended Posts

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

Edited by ricardoneves93

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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();

Share this post


Link to post
Share on other 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...

Edited by ricardoneves93

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by ricardoneves93

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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();

Edited by Devexz

Contador de calorias: caloriaspordia.com

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Devexz

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

mete

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

Edited by Devexz

Contador de calorias: caloriaspordia.com

Share this post


Link to post
Share on other 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);
  }

Edited by ricardoneves93

Share this post


Link to post
Share on other 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();

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
Devexz
//aqui no get não será value em do field?
$parameters = array("$field" => $_GET['value']);

Edited by Devexz
  • Vote 1

Contador de calorias: caloriaspordia.com

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.