vue Tableaux de paramètres de connexion PDO
Kommunauty
Connexion
Inscription

Tableaux de paramètres de connexion PDO


fabcodeur Messages : 10

Bonjour,

sur mon système, j'ai un fichier qui contient toute la config de mon site, mais au début, la connexion aux bases SQL se faisait manuellement comme ds le tutode m@teo.

Mais depuis, j'aimerais que cette connexion soit automatique et que les paramètres de connexion soient enregistrés dans un tableaux associatifs afin d'être utilisé par une classe (pour la gestion des exceptions plus personnel entre autre) :

<?php
$db['base_1']['hostname'] = "nom_d_hote";
$db['base_1']['username'] = "nom_d_utilisateur";
$db['base_1']['password'] = "mot_de_passe";
$db['base_1']['database'] = "base_de_donnees";
 
$db['base_2']['hostname'] = "nom_d_hote";
$db['base_2']['username'] = "nom_d_utilisateur";
$db['base_2']['password'] = "mot_de_passe";
$db['base_2']['database'] = "base_de_donnees";
?>

Mais, le problème c'est que je bloque sur la méthode qui va créer les connexions et qui utilisera le tableaux global que j'ai donnée plus haut, je ne sais pas du tout comment faire :

<?php
public function connectDatabase(){
  foreach ($db ...)
}
?>

Merci d'avance de votre aide

vendredi 15 juillet 2011

Lucas Messages : 830

Tu devrais essayer ça :


public function connectDatabase(){
    foreach ($db as $d){
        $pdos[] = new PDO('mysql:host='.$d['hostname'].';dbname='.$d['database'], $d['username'], $d['password']);
    }
    return $pdos;
}

et là la fonction retourne un array avec toutes les connexions PDO...

Infos :

En fait, il serait préférable que tu fasses passer les différentes bdd en paramètre, c'est d'ailleurs plus logique :

(puisqu'il y a "public" devant ta fonction, j'en conclue qu'elle est placée dans une classe) :


class Taclasse {
    public function connectDatabase($db){
        foreach ($db as $d){
            $pdos[] = new PDO('mysql:host='.$d['hostname'].';dbname='.$d['database'], $d['username'], $d['password']);
        }
    }
}
$db['base_1']['hostname'] = "nom_d_hote";
$db['base_1']['username'] = "nom_d_utilisateur";
$db['base_1']['password'] = "mot_de_passe";
$db['base_1']['database'] = "base_de_donnees";
 
$db['base_2']['hostname'] = "nom_d_hote";
$db['base_2']['username'] = "nom_d_utilisateur";
$db['base_2']['password'] = "mot_de_passe";
$db['base_2']['database'] = "base_de_donnees";
// et après :
$plop = new Taclasse();
$pdos = $plop->connectDatabase($db);

Sinon si tu souhaites ne pas passer de paramètre et que la variable qui contient les données est en dehors de ta classe,

alors dans ta fonction il faut que tu ajoutes :


global $db;

avant le foreach pour préciser que la variable que tu vas utiliser est globale.

J'espère que c'est ce que tu voulais.

vendredi 15 juillet 2011 (Dernière édition vendredi 15 juillet 2011)

fabcodeur Messages : 10

Salut,

merci beaucoup , mais il manque juste une chose, comment utiliser une connexion présentes dans le tableau pdo ?

Je fais :

<?php
$rubrique = new maClasse();
$pdos = $rubrique->connectDatabase($db);
$reponselastjoined = $pdos->query('SELECT pseudo, id FROM membre ORDER BY id DESC LIMIT 0,5');
?>

Mais il me répond : "Call to a member function query() on a non-object in"

Merci d'avance de votre aide

samedi 16 juillet 2011

Lucas Messages : 830

bah, dans la mesure où $pdo est un array, pour utiliser les connexions tu peux faire :


<?php
$rubrique = new maClasse();
$pdos = $rubrique->connectDatabase($db);
$reponselastjoined = $pdos[1]->query('SELECT pseudo, id FROM membre ORDER BY id DESC LIMIT 0,5');
?>

Sinon, tu peux aussi récupérer les connexions avec leur nom, mais il faudra modifier la fonction connectDatabase :


class maClasse {
    public function connectDatabase($db){
        foreach ($db as $k => $v){
            $pdos[$k] = new PDO('mysql:host='.$v['hostname'].';dbname='.$v['database'], $v['username'], $v['password']);
        }
        return $pdos;
    }
}
$db['base_1']['hostname'] = "nom_d_hote";
$db['base_1']['username'] = "nom_d_utilisateur";
$db['base_1']['password'] = "mot_de_passe";
$db['base_1']['database'] = "base_de_donnees";
 
$db['base_2']['hostname'] = "nom_d_hote";
$db['base_2']['username'] = "nom_d_utilisateur";
$db['base_2']['password'] = "mot_de_passe";
$db['base_2']['database'] = "base_de_donnees";
// et après :
$plop = new maClasse();
$pdos = $plop->connectDatabase($db);

$reponselastjoined = $pdos['base_1']->query('SELECT pseudo, id FROM membre ORDER BY id DESC LIMIT 0,5');

En fait j'avais oublié un "return $pdos" dans la fonction de mon ancien message...

Voilà !!

samedi 16 juillet 2011

fabcodeur Messages : 10

Merci, c'est justement ce qui manquait. j'ai un peu modifié et voici ma méthode :

Merci

Finalement, voici ma méthode :


<?php
public function connectDatabase($db){
foreach ($db as $d){
  switch ($d['extension']){
    case 'pdo':
      try
      {
$sql_connect[''.$d['database'].''] = new PDO('mysql:host='.$d['hostname'].';dbname='.$d['database'], $d['username'], $d['password']);
      }
      catch (PDOException $e)
      {
$this->setErrorLog('errors.log', 'Une exception a été lancée. Message d'erreur lors de la connexion à une base de données : '.$e.'');
      }  
    break;
    
    case 'mysqli':
      $sql_connect[''.$d['database'].''] = new mysqli($d['hostname'], $d['username'], $d['password'], $d['database']);
    break;
    
    case 'mysql':
      $sql_connect[''.$d['database'].''] = mysql_connect($d['hostname'], $d['username'], $d['password']);
      $sql_connect[''.$d['database'].''] = mysql_select_db($d['database']);
    break;
    
    default :
      $this->setErrorLog('errors.log', 'L'extension de cette connexion n'est pas gérée');
    break;
  }
}
return $sql_connect;
}
?>

et, voici comment on l'utilise :


<?php
  $base=$rubrique->connectDatabase($db);
  $reponse = $base['geekcafe']->query('SELECT * FROM membre');  // où ['geekcafe'] correspond au nom de la base
?>
samedi 16 juillet 2011

Lucas Messages : 830

Okay ! bon boulot !

samedi 16 juillet 2011

Répondre Pour répondre, tu dois d'abord t'inscrire rapidement sur Kommunauty. Rejoins-nous vite !