Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1516 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Tester execution d'une requete SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tester execution d'une requete SQL

n°2199998
tompouss
Petit chat
Posté le 12-08-2013 à 19:13:29  profilanswer
 

Bonjour,
 
j'essaie de trouver un moyen de tester le code de retour d'une PDOException
 
le but est simplement d'afficher un message si la requete a bien été executée ou pas
 

Code :
  1. public function admin_sitename_edit()
  2. {
  3.   if(($this->request->is('put')) || ($this->request->is('post')))
  4.   {
  5.    $param_to_save=$this->request->data['Parameter'];
  6.    if (isset($param_to_save['site_name'])
  7.    && (!empty($param_to_save['site_name'])))
  8.    {
  9.     //$model=Inflector::singularize($this->controller);
  10.     $field_name="site_name";
  11.     $new_site_name=$param_to_save['site_name'];
  12.     if($this->Parameter->updateDB($field_name, $new_site_name))
  13.     {
  14.      $this->Session->setFlash("Ce paramètre a bien été modifié", "notify" );
  15.       $this->redirect(array('action'=>'index'));
  16.     }
  17.     else
  18.     {
  19.      $this->Session->setFlash("Erreur lors de la sauvegarde de ce paramètre, veuillez vérifier", "notify" );
  20.       $this->redirect(array('action'=>'index'));
  21.     }
  22.    }
  23.   }
  24. }


Code :
  1. public function updateDB($field_name, $new_value)
  2. {
  3. try
  4. {
  5.  $this->query("UPDATE parameters SET $field_name = '$new_value' " );
  6. }
  7. catch (PDOException $state)
  8. {
  9.  $error_code=$state->errorCode();
  10.  if($error_code == '0')
  11.  return true;
  12.  else return false;
  13. }
  14. }


 
 
Problème: pour l'instant la fonction me renvoie tjs false
 
Merci pour votre aide


Message édité par tompouss le 12-08-2013 à 19:15:14

---------------
collectionneur de pâtes thermiques
mood
Publicité
Posté le 12-08-2013 à 19:13:29  profilanswer
 

n°2200010
sltpaulo
Posté le 13-08-2013 à 09:47:50  profilanswer
 

Bonjour

 

Est-ce possible d'avoir les variables de ta classe ainsi que le constructeur?


Message édité par sltpaulo le 13-08-2013 à 09:48:08
n°2200011
Volkhen
Posté le 13-08-2013 à 10:04:45  profilanswer
 

Lorsque tout se passe bien, la méthode updateDB ne retourne rien ce qui est considéré comme un false dans le test qui l'utilise.
 
PS: pas besoin de faire un isset avant un empty en passant.


---------------
Main/Alt1/Alt2/Alt3
n°2200027
tompouss
Petit chat
Posté le 13-08-2013 à 12:56:23  profilanswer
 

Purée ca a fonctionné une fois -_-'
 
Difficile de faire un test 100 % fiable sur cette méthode
 
 
a fonctionné une fois
 

Code :
  1. public function updateDB($field_name, $new_value)
  2.   {
  3.    try
  4.    {
  5.     $this->query("UPDATE parameters SET $field_name = '$new_value' " );
  6.    }
  7.    catch (PDOException $state)
  8.    {
  9.     if($state->errorCode() == 01)
  10.      return true;
  11.     if(($state->errorCode() == NULL )|| ($state->errorCode() != 01))
  12.      return false;
  13.     else
  14.      return false;
  15.    }
  16.   }


 
 
Nouvelle version :

Code :
  1. public function updateDB($field_name, $new_value)
  2.   {
  3.    try
  4.    {
  5.     $this->query("UPDATE parameters SET $field_name = '$new_value' " );
  6.    }
  7.    catch (PDOException $state)
  8.    {
  9.     if((!(isset($state)) || $state->errorCode() == 01))
  10.      return true;
  11.     if(($state->errorCode() == NULL )|| ($state->errorCode() != 01))
  12.      return false;
  13.    }
  14.   }


 
 
Quelque chose m'échappe ? Problème de logique ?
 
Et point de vue sécurité, dois je faire une requete préparée pour éviter les risques d'injection SQL ?
 
 
 

Message cité 1 fois
Message édité par tompouss le 13-08-2013 à 13:14:51

---------------
collectionneur de pâtes thermiques
n°2200030
sltpaulo
Posté le 13-08-2013 à 13:47:12  profilanswer
 

pour éviter les injections, soit tu prépares soit tu fais ça :

Code :
  1. $val = $this->quote($new_value);
  2. $this->query("UPDATE parameters SET $field_name = '$val' " );
 

par exemple

 

EDIT : Aussi une requête d'update sans condition, c'est pas top-top surtout si ton code (et utilisation de la table) viennent à évoluer

 

EDIT : va faire un tour ici pour plus d'info : http://www.php.net/pdo


Message édité par sltpaulo le 13-08-2013 à 13:58:49
n°2200033
Volkhen
Posté le 13-08-2013 à 14:20:10  profilanswer
 

tompouss a écrit :

Purée ca a fonctionné une fois -_-'
 
Difficile de faire un test 100 % fiable sur cette méthode
 
 
a fonctionné une fois
 

Code :
  1. public function updateDB($field_name, $new_value)
  2.   {
  3.    try
  4.    {
  5.     $this->query("UPDATE parameters SET $field_name = '$new_value' " );
  6.    }
  7.    catch (PDOException $state)
  8.    {
  9.     if($state->errorCode() == 01)
  10.      return true;
  11.     if(($state->errorCode() == NULL )|| ($state->errorCode() != 01))
  12.      return false;
  13.     else
  14.      return false;
  15.    }
  16.   }


 
 
Nouvelle version :

Code :
  1. public function updateDB($field_name, $new_value)
  2.   {
  3.    try
  4.    {
  5.     $this->query("UPDATE parameters SET $field_name = '$new_value' " );
  6.    }
  7.    catch (PDOException $state)
  8.    {
  9.     if((!(isset($state)) || $state->errorCode() == 01))
  10.      return true;
  11.     if(($state->errorCode() == NULL )|| ($state->errorCode() != 01))
  12.      return false;
  13.    }
  14.   }


 
 
Quelque chose m'échappe ? Problème de logique ?
 
Et point de vue sécurité, dois je faire une requete préparée pour éviter les risques d'injection SQL ?
 
 
 


Problème de logique.
Si la requête se passe bien, il n'y a pas d'exception levée. Donc l'interpréteur ne passe pas dans le bloc "catch", donc la fonction ne retourne rien, donc tout test fait sur son retour donnera "false".
Essaye avec ça :

Code :
  1. public function updateDB($field_name, $new_value)
  2.   {
  3.    try
  4.    {
  5.     $this->query("UPDATE parameters SET $field_name = '$new_value' " );
  6.    }
  7.    catch (PDOException $state)
  8.    {
  9.     if((!(isset($state)) || $state->errorCode() == 01))
  10.      return true;
  11.     if(($state->errorCode() == NULL )|| ($state->errorCode() != 01))
  12.      return false;
  13.    }
  14.                                 return true; // Tout s'est bien passé youpi
  15.   }


 


---------------
Main/Alt1/Alt2/Alt3
n°2200040
tompouss
Petit chat
Posté le 13-08-2013 à 15:15:10  profilanswer
 

Ok moi je pensais qu'une exception était générée d'office
 
Du coup est-ce que tous mes tests dans le Catch sont nécessaires?


Message édité par tompouss le 13-08-2013 à 15:17:11

---------------
collectionneur de pâtes thermiques
n°2200050
tompouss
Petit chat
Posté le 13-08-2013 à 15:48:51  profilanswer
 

J'ai essayé ca pour les injections SQL
mais ca ne marche pas
 

Code :
  1. public function updateDB($field_name, $new_value)
  2. {
  3.  try
  4.  {
  5.   $this->prepare('UPDATE `parameters` SET' .$field_name.' = :value');
  6.   // on prépare la requete contre les injections
  7.   $this->execute(array(':value'=> $new_value));
  8.  }
  9.  catch (PDOException $state)
  10.  {
  11.   if(isset($state))
  12.         return false;
  13.  }
  14.  return true;
  15. }


Message édité par tompouss le 13-08-2013 à 16:17:31

---------------
collectionneur de pâtes thermiques
n°2200057
sltpaulo
Posté le 13-08-2013 à 16:26:37  profilanswer
 

Normal  
mets un espace entre le SET et le "'"
 
sinon, moi je ferai plus un return $this->execute...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Tester execution d'une requete SQL

 

Sujets relatifs
[ACCESS] Fusion de 2 requêtes SQLSQL 3 tables récupérer des informations en fonction d'une variable
Access plante à l'exécution d'un module code VBAROWTYPE en PL/SQL impossible à créer sous SqlDeveloper
[Résolu][PHP / SQL] Automatique +++ AffichageAu secours, requête SQL, sous requête, AVG and co
[SQL/ACCESS] Requête Jointure + imbrication?Extraction d'instructions SQL
Plus de sujets relatifs à : Tester execution d'une requete SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR