Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utiliser une classe pour se connecter

5 juin 2014 à 2:04:28

Bjr à tous,

Je m'essaie à la classe connexion, quelqu'un pourrait-il me dire ce qui cloche.

Voici la classe :

<?php
// Connection au serveur

$PARAM_hote='localhost'; 
$PARAM_nom_bd='****'; 
$PARAM_utilisateur='*****';
$PARAM_mot_passe='****'; 
try
{
$connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}

catch(Exception $e)
{
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
}
?>

Elle doit permettre l'alimentation d'un zone de liste ici :

"<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

require_once'connexion.php';

$requete = $connexion->query("SELECT ville_id, ville FROM eg_villes") or die("Pb avec la requette".$connexion->errorInfo());
?>
<tr>
<td class="auto-style1" colspan="2">Commune *:</td>
<td colspan="2" style="width: 460px"><select name="ville_id" style="width: 224px">

<option selected="selected">Lieu de résidence</option>

"<?php
while ($valeur = $connexion->fetch($requete))
{
echo "<option value=\"". $valeur['ville_id'] ."\" cli_name=\"". $valeur['ville'] ."\">". $valeur['ville'] ."</option>";
}
?>"
</select>
"

Merci bcp.


-
Edité par mungano 5 juin 2014 à 2:06:08

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 4:56:09

Tes guillemets en ligne 15 et 20, il y a pas lieu d'en placer là.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
5 juin 2014 à 6:53:43

mungano a écrit:

Voici la classe :

Où?

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 8:33:02

Jesuiscodeur a écrit:

mungano a écrit:

Voici la classe :

Où?


Même interrogation de ma part...
  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 8:42:42

mungano a écrit:

Bjr à tous,

Je m'essaie à la classe connexion, quelqu'un pourrait-il me dire ce qui cloche.


Oui, mais sans savoir ce que produit ton code, c'est difficile (des messages d'erreurs?).

Quand tu parles de classe connexion je suppose que tu veux parler de l'utilisation de PDO?

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 17:07:47

Bonjour à tous,

Seriez-vous en train d'essayer de me faire comprendre que connexion.php (1er insert) n'est pas une classe ?

Dans l'affirmative, malgré tout, je suppose que vous avez saisi mon problème, non ?

-
Edité par mungano 5 juin 2014 à 17:10:07

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 17:15:10


@ bxdfr

PAs de message d'erreur...
  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 17:30:37

Tu as une page complètement blanche? Tu as ta liste qui est vide à part lieu de résidence? Qu'as-tu exactement qui te dit que ça cloche?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
5 juin 2014 à 17:55:43

Une classe c'est par exemple :

class MaClasse{


}



  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 18:16:17

Casperaxxx a écrit:

Tu as une page complètement blanche? Tu as ta liste qui est vide à part lieu de résidence? Qu'as-tu exactement qui te dit que ça cloche?

 

Ben, Ma liste de ville reste vide... selon mes test

Et d'autres fois c'est  la page qui  est entièrement blanche..

Parce que j'ai testé  mille et une solutions qui ne donnent rien

Avec la méthode traditionnelle tout fonctionne :

"<?php
$db='****';
$cnx=mysql_connect('localhost', '****', '****') or die("Pb connexion serveur ".mysql_error());
$db_sel=mysql_select_db($db) or die("Erreur de selection ".mysql_error());
$requete = mysql_query("SELECT ville_id, ville FROM eg_villes") or die("Pb avec la requette ".mysql_error());
?>"

// Ce script de connexion  alimente cette zone de liste qui fonctionne à merveille :

"<select name="ville_id" style="width: 224px">

<option selected="selected">Lieu de résidence</option>

<?php
while ($valeur = mysql_fetch_array($requete)){
echo "<option value=\"". $valeur['ville_id'] ."\" cli_name=\"". $valeur['ville'] ."\">". $valeur['ville'] ."</option>n";
}
?>
</select>"

mais j'en ai un peu assez de recopier tout le code de connexion à chaque page.
J'ai donc voulu me mettre au poo, mais que diable allais-je faire dans cette galère ?

-
Edité par mungano 5 juin 2014 à 18:36:27

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 18:22:58

Je ne vois pas pourquoi tu fais une connexion dans ta boucle while. Tu as déjà les infos voulues dans ta variable requete.
  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 18:34:33

Casperaxxx a écrit:

Je ne vois pas pourquoi tu fais une connexion dans ta boucle while. Tu as déjà les infos voulues dans ta variable requete.


Euuh..! Moi non plus !

Je bidouille et cherche une voie pour m'en sortir.

J'ai déjà les infos, mais rien ne s'affiche malgré tout, j'ai déjà testé 1001 solutions.... sans while, avec....

Quelqu'un saurait-il d'où cela peut bien venir, ou encore
auriez-vous un modèle que je pourrais adapter ?

-
Edité par mungano 5 juin 2014 à 18:35:18

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 18:44:03

$requete->setFetchMode(PDO::FETCH_OBJ);
while( $valeur = $requete->fetch() )

Met ceci à la place de ton while.


  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 19:25:58

Une classe de connexion aurait pour but de te fournir l'objet symbolisant la connexion, et de lever une exception en cas d'échec. Là pour le coup, pas besoin de lancer l'exception soi-même, PDO le fait pour nous, donc notre classe a juste à construire un objet PDO :

class MaConnexion {
   protected static $host = 'localhost',
      $db =  'dbname',
      $charset = 'utf8',
      $user = 'root',
      $passwd = '';
   protected static $options = array();
   protected static $link = null;

   protected static function init() {
      if(is_null(self::$link)) {
         self::$options = array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
         );
         $dsn = sprintf(
            'mysql:host=%s;dbname=%s;charset=%s',
            self::$host,
            self::$db,
            self::$charset
         );
         self::$link = new PDO(
            $dsn, 
            self::$user, 
            self::$passwd,
            self::$options
        );
      }
   }

   public static function getConnexion() {
      self::init();
      return self::$link;
   }
}

Et pour l'utiliser à tout moment :

try {
   $bdd = MyConnexion::getConnexion();

   // requêtes utilisant $bdd à placer ici



}
catch(PDOException $ex) {
   // $ex contient le message d'erreur
}

Bien sûr, ceci est un exemple trivial. Je ne ferais pas une classe de connexion de cette manière pour plusieurs raisons, notamment le manque de flexibilité dû fait que les identifiants sont inscrits en dur dans la classe. Mieux vaut faire un fichier de configuration ailleurs. Ceci étant, si déjà cette classe simple te parait compréhensible (même si besoin de plus d'une lecture au début) c'est déjà que tu commences à cerner ce qui se cache derrière "classe de connexion". ;)

Pour mysql_*(), il faudra adapter pas mal de choses dont le lancer manuel d'exceptions en cas d'erreur.


Edit : un petit exemple fait à l'arrache de classe pouvant servir avec les vieilles fonction mysql_*(). Très incomplète vu qu'il faut quand même gérer soi-même l'échappement et compagnie. Et en bas, comment l'utiliser.

<?php
class MaConnexion {
    protected static $instance = null;
    protected $link;

    protected function __construct($host, $user, $passwd, $charset = null, $dbname = null) {
        $link = mysql_connect($host, $user, $passwd);
        if($link === false) throw new RuntimeException(mysql_error(), mysql_errno());
        if(!is_null($charset) and !mysql_set_charset($charset, $this->link))
            throw new RuntimeException(mysql_error($this->link), mysql_errno($this->link));
        if(!is_null($dbname) and !mysql_select_db($dbname, $this->link))
            throw new RuntimeException(mysql_error($this->link), mysql_errno($this->link));
    }

    public static function getConnexion() {
        if(is_null(self::$instance))
            self::$instance = new self('localhost', 'root', '', 'utf8', 'dbname');
        return self::$instance;
    }

    public function query($query) {
        $result = mysql_query($query, $this->link);
        if($result === false) throw new RuntimeException(mysql_error($this->link), mysql_errno($this->link));
        return $result;
    }

    public function fetch($result) {
        return mysql_fetch_assoc($result);
    }
}

try {
$cnx = MaConnexion::getConnexion();

// Requêtes l'utilisant
$result = $cnx->query('SELECT ville_id, ville FROM eg_villes;'); ?>
<select name="ville_id" style="width: 224px">
    <option selected="selected">Lieu de résidence</option>
    <?php while($valeur = $cnx->fetch($result)): ?>
    <option value="<?php echo $valeur['ville_id']; ?>" cli_name="<?php echo $valeur['ville']; ?>"><?php echo $valeur['ville']; ?></option>
    <?php endwhile; ?>
</select>
<?php
}
catch(RuntimeException $ex) {
?>
<p>Une erreur est survenue pendant le traitement en base de données.<br />
<?php echo $ex->getMessage(); ?><br />
Veuillez contacter l'administrateur.</p>
<?php
}
?>



-
Edité par Darth Killer 5 juin 2014 à 19:43:35

  • Partager sur Facebook
  • Partager sur Twitter
5 juin 2014 à 20:29:47

Merci à Casperaxxx

et à Darth Killer

Bon ben voilà un exemple concret ! MErci je m'y mets de suite et vous dirai ce que ça donne.

Mille mercis.



  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2014 à 19:34:39

Bon, ben me rev

oilà !

@ Darth Killer,
Voilà le 1er code adapté à mon cas, le l'ai mis dans une page PhP nue, sans en-tête rien, tel quel :

<?php 
class MaConnexion {
   protected static $host = 'localhost',
      $db =  '****',
      $charset = 'utf8',
      $user = '****',
      $passwd = '****';
   protected static $options = array();
   protected static $link = null;
 
   protected static function init() {
      if(is_null(self::$link)) {
         self::$options = array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
         );
         $dsn = sprintf(
            'mysql:host=%s;dbname=%s;charset=%s',
            self::$host,
            self::$db,
            self::$charset
         );
         self::$link = new PDO(
            $dsn,
            self::$user,
            self::$passwd,
            self::$options
        );
      }
   }
 
   public static function getConnexion() {
      self::init();
      return self::$link;
   }
}
?>

Arrivé dans la page où doit s'afficher la zone de lise, je fais choix gras !

J'ai tenté d'adapté ton 2d code, mais rien n'y fait.

<?php
try {
$bdd = connexion.php::getConnexion();
// Requêtes l'utilisant
$result = $cnx->query('SELECT ville_id, ville FROM eg_villes;');
?> $result = $cnx->query('SELECT ville_id, ville FROM eg_villes;'); ?> <select name="ville_id" style="width: 224px"> <option selected="selected">Lieu de résidence</option> <?php while($valeur = $cnx->fetch($result)): ?> <option value="<?php echo $valeur['ville_id']; ?>" cli_name="<?php echo $valeur['ville']; ?>"><?php echo $valeur['ville']; ?></option> <?php endwhile; ?> </select> <?php } catch(RuntimeException $ex) { ?> <p>Une erreur est survenue pendant le traitement en base de données.<br /> <?php echo $ex->getMessage(); ?><br /> Veuillez contacter l'administrateur.</p> <?php } ?> <?php } catch(PDOException $ex) { // $ex contient le message d'erreur }?> <tr> <td class="auto-style1" colspan="2">Commune *:</td> <td colspan="2" style="width: 460px"><select name="ville_id" style="width: 224px"> <option selected="selected">Lieu de résidence</option> <?php while ($valeur = mysql_fetch_array($requete)){ echo "<option value=\"". $valeur['ville_id'] ."\" cli_name=\"". $valeur['ville'] ."\">". $valeur['ville'] ."</option>n"; } ?> </select>

-
Edité par mungano 8 juin 2014 à 19:41:05

  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2014 à 19:41:24

Bon c la cata, la page ne s'affiche même plus !
  • Partager sur Facebook
  • Partager sur Twitter
8 juin 2014 à 20:15:02

dans PDO, la méthode fetch appartient à l'objet PDOStatement (ici stocké dans ta variable $result) et non à l'objet PDO (ici stocké dans $cnx).
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2014 à 6:15:51

Plouf ! Je coule !

Les éléments de connexion étant sur la page "connexion.php" est-ce elle que je dois mette ici ?

try {
   $bdd = MaConnexion::getConnexion();

LA page s'affiche de nouveau , mais la zone n'est toujours pas alimentée.

Ou est-ce que à coince ?

<?php 
try {
$cnx = MaConnexion::getConnexion();
 
   // requêtes utilisant $bdd à placer ici
 $result = $cnx->query('SELECT ville_id, ville FROM eg_villes;');
 }
catch(PDOException $ex) {
   // $ex contient le message d'erreur
}	
?>
  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2014 à 14:00:30

Voici le code complet.

Je commence par renvoyer vers la page qui contient le script de connexion  :

<?php 
try {
$cnx = koneksyon.php::getConnexion();
 
   // requêtes utilisant $bdd à placer ici
 $result = $cnx->query('SELECT ville_id, ville FROM eg_villes;');
 }
catch(PDOException $ex) {
   // $ex contient le message d'erreur
}	
?>

	<tr>
		<td class="auto-style1">Commune *:</td>
		<td>
<select name="ville_id" style="width: 224px">
    <option selected="selected">Lieu de résidence</option>
    <?php while($valeur = $cnx->fetch($result)): ?>
    <option value="<?php echo $valeur['ville_id']; ?>" cli_name="<?php echo $valeur['ville']; ?>"><?php echo $valeur['ville']; ?></option>
    <?php endwhile; ?>
</select>

-
Edité par mungano 9 juin 2014 à 14:01:45

  • Partager sur Facebook
  • Partager sur Twitter
9 juin 2014 à 16:06:09

Tu fetch à l'extérieur du try. Donc, que la connexion ait réussi ou pas, et que la requête ait planté ou pas, tu fetche...

En plus, comme je t'ai dit, c'est l'objet PDOStatement qui possède une méthode fetch(), pas l'objet PDO. Quelle variable contient qui ?

  • Partager sur Facebook
  • Partager sur Twitter
10 juin 2014 à 2:54:45

@ Darth Killer

Je te remercie grandement pour ta collaboration, mais je m'en vais me retourner à la méthode "traditionnelle".
C trop "compliqué" pour moi d'apprendre le chinois...
  • Partager sur Facebook
  • Partager sur Twitter
10 juin 2014 à 5:25:41

Niveau communication avec la bdd, faire beaucoup d'entrainement, tu dois.:ninja:

Tu as dit textuellement que tu coules. Dans ce cas, faut revenir un peu vers le bord et ne plus t'attarder sur tes bases qui partent dans tout les sens. Ainsi, tu te refais tes bonnes bases biens ancrés dans la tête.

Qui n'a jamais fait marche arrière en php pour pouvoir mieux avancer? J'ai déjà bu la tasse plusieurs fois et je la boirai encore, tu peux me croire, mais quand ça m'arrive en guise d'alerte d'aller trop vite, je reviens directe là où j'ai pied.

  • Partager sur Facebook
  • Partager sur Twitter
10 juin 2014 à 8:12:04

Casperaxxx a écrit:

Qui n'a jamais fait marche arrière en php pour pouvoir mieux avancer?

Moi ! :D
Mais c'est vrai que des fois les notions nouvelles sont délicates à comprendre et maîtriser. :)

mungano a écrit:

@ Darth Killer

Je te remercie grandement pour ta collaboration, mais je m'en vais me retourner à la méthode "traditionnelle".
C trop "compliqué" pour moi d'apprendre le chinois...

Comment faisais-tu en méthode traditionnelle pour ne pas lancer la requête si jamais la connexion échouait ? Sans tuer le script, bien sûr...

Note à Casperaxxx : c'est dommage qu'il n'y a pas de smiley *trollface* sur le forum... :p

-
Edité par Darth Killer 10 juin 2014 à 8:13:38

  • Partager sur Facebook
  • Partager sur Twitter
10 juin 2014 à 8:47:36

Tu me disais que tu allais m'avoir Killer avec cette méthode, mais tu vas boire la tasse aussi... :-°
  • Partager sur Facebook
  • Partager sur Twitter