Requete SQL dans fonction Externe

Petit nouveau ! | 5 Messages

07 nov. 2013, 11:35

Bonjour à tous,
je suis actuellement apprenti et reprend le code entier d'un ancien apprenti (pas indenter et pas commenté...) bref il a créée des fonctions avec des requêtes SQL mais lors de l'appel à une de ces fonctions cela ne renvoie rien. J'essaye sur phpmyadmin et la rien non plus.
Voici la requête: "SELECT id_pays FROM pays WHERE code_devise = ? "
Bon sur phpmyadmin le '?' est = a 'EUR'. Bon je trouve le problème mais je ne le comprend pas il faut remplacer '=' par "like '%EUR%' ".

Enfin bon ma question déja est la suivante: comment faire pour remplacer le = par le like dans la fonction j'ai essayer pas mal de chose et jamais de résultat.

Voici un bout de la fonction:

<?php
class monnaie{
public function __construct($db)
{
$this->getMonnaieByCode = $db->prepare("SELECT id_pays FROM pays WHERE code_devise = ? ");
}

public function getMonnaieByCode($devise)
{
$this->getMonnaieByCode->execute(array($devise));
return $this->getMonnaieByCode->fetch();
}
}

L'appel a cet fonction qui ce trouve dans un autre fichier php:

$codeDev=$maDevise->getMonnaieByCode($devise);


à savoir: la requête retourne plusieurs ligne


Merci d'avance, je ne sais pas si c'est très clair.

Mammouth du PHP | 571 Messages

07 nov. 2013, 12:22

Bonjour,
le point d'interrogation est un marqueur qui sera remplacé par un tableau de valeur(en l'occurrence la valeur EUR) lors de l'exécution de la requête.Ta requête avec LIKE devient:
<?php
class monnaie{
public function __construct($db)
{
$this->getMonnaieByCode = $db->prepare("SELECT id_pays FROM pays WHERE code_devise LIKE '%?%' ");
}

public function getMonnaieByCode($devise)
{
$this->getMonnaieByCode->execute(array($devise));
return $this->getMonnaieByCode->fetch();
}
}
avec phpmyadmin:

Code : Tout sélectionner

SELECT id_pays FROM pays WHERE code_devise LIKE '%EURO%';

Petit nouveau ! | 5 Messages

07 nov. 2013, 12:32

Merci pour ta réponse si rapide :D
j'avais déjà essayé et cela ne fonctionne pas? Peut être ma façon d'afficher, pour le test je fait un echo
<?php $codeDev=$maDevise->getMonnaieByCode($devise); ?>
<td><?php echo $devise,$codeDev[0],",",$codeDev ,"," ?></td>
donc devise m'affiche bien 'EUR' et les deux autres ne m'affiche rien :s

Mammouth du PHP | 571 Messages

07 nov. 2013, 12:51

ceci n'est pas bon car tu as un tableau et pour le parcourir t'as besoin d'une boucle
 <td><?php echo $devise,$codeDev[0],",",$codeDev ,"," ?></td>
------------------------------
que donne ceci:
<?php $codeDev=$maDevise->getMonnaieByCode($devise); ?>
var_dump($codeDev);

Petit nouveau ! | 5 Messages

07 nov. 2013, 14:24

ceci donne boolean false

ViPHP
xTG
ViPHP | 7331 Messages

07 nov. 2013, 14:46

C'est donc que la requête a échoué.
Actives la gestion des erreurs de PDO : http://us3.php.net/manual/fr/pdo.error-handling.php

Petit nouveau ! | 5 Messages

07 nov. 2013, 15:04

Merci cela m'a corrigé quelques erreur mais sinon après avoir corrigé j'ai plus aucun message et toujours boolean false. J'ai tenté de mettre directement '%EUR%' dans la requête PHP et cela fonctionne donc je pense que cela vient de la façon d’écrire '%?%'
Mais je ne voit pas du tout comment le faire j'ai essayé toutes les cotes et guillemet possible et inimaginable :?

ViPHP
xTG
ViPHP | 7331 Messages

07 nov. 2013, 16:21

Dans ce cas que vaux $devise ?
Car si plus d'erreur c'est simplement que la requête ne renvoie aucun résultat.

Mammouth du PHP | 571 Messages

07 nov. 2013, 16:22

d'accord je vois on place les % dans la méthode execute et active la gestion d'erreurs

<?php
class monnaie{
private $_db;//type PDO

public function __construct($db)
{
$this->getMonnaieByCode = $db->prepare("SELECT id_pays FROM pays WHERE code_devise LIKE ?");
$this->_db =$db; //

public function getMonnaieByCode($devise)
{
try
   {
   $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
   $this->getMonnaieByCode->execute(array('%'.$devise.'%'));
   return $this->getMonnaieByCode->fetch();
  }catch(PDOException $err)
  {
 echo "erreur sql:" ,$err->getMessage();
 
 exit();
 }
}//end getMonnaieByCode
}//end monnaie
 
l'appel à la classe reste inchangé

Petit nouveau ! | 5 Messages

07 nov. 2013, 16:36

AHHHHHH MERCIIIIII !!!!!! :D cela fonctionne. J’espère réussir à résoudre les autres problèmes par moi même. Sinon je reviendrais vers vous Merci ;)