PHP et connexion à une bd mysql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : PHP et connexion à une bd mysql

par Tatiana » 28 sept. 2006, 07:28

Le problème était ici:
<?php function ClasseMysql() {
        require_once("connexion.php");
        $this->adr = $mysql_adresse;
        $this->login = $mysql_login;
        $this->passe = $mysql_pass;
        $this->base = $mysql_base;
    } 
Au lieu de "require_once("connexion.php")", il fallait que ce soit "include("connexion.php")".

C'est quelqu'un qui me l'a dit, et effectivement ça a fonctionné... Mais je ne comprends même pas pourquoi! J'aimerais quand même comprendre, le sauriez-vous?

Et pour répondre à la question, j'étais bien dans la même page... bizarre! :?:

par Cyrano » 27 sept. 2006, 00:11

Une même instance sur la même page ? :-k

La question pourrait paraître farfelue, mais on voit parfois bien des curiosités sur PHPFrance. Je veux dire par là que si par exemple sur mapage1.php tu crées une instance et que ta page comporte un lien vers mapage2.php, pour effectuer des opérations avec ta base depuis la seconde page, il faudra créer une nouvelle instance.

Si ce n'est pas ça et que tu es bien dans la même page, alors montre-nous donc ton code à partir de l'instanciation jusqu'au second appel de méthode qui plante (en coupant éventuellement le superflu)

par Tatiana » 26 sept. 2006, 21:17

Merci tout le monde pour votre coup de main!
Salut,
si tu regardes la méthode de connexion, tu as ceci:
<?php
//...
$obj_db = mysql_connect($this->adr, $this->login, $this->passe);
//...
?>
Ça signifie que les paramètres de connexion doivent être stockés dans les propriétés de ta classe et initialisé dans le constructeur. Les messages d'erreur indiqués montrent que les variables que tu envoies au constructeur ne sont pas définies dans ton fichier de configuration : mais ce fichier s'appelle ClasseMysql.txt : change donc son extension et mets-lui une extension .php puis refais le test.
C'est fait, toutes mes extensions sont en php, mais j'ai toujours la même erreur. Mes paramètres sont bien identifiés dans mon fichier connexion.php. Le code du constructeur est:
    function ClasseMysql() {
        require_once("connexion.php");
        $this->adr = $mysql_adresse;
        $this->login = $mysql_login;
        $this->passe = $mysql_pass;
        $this->base = $mysql_base;
    }
D'ailleurs, s'ils ne l'étaient pas, c'est dès le premier appel d'une méthode de ma classe que j'aurais une erreur. Actuellement, c'est au deuxième. Comment diable est-il possible que la classe "oublie" ses variables entre deux appels à partir d'une même instance?!

par Cyrano » 26 sept. 2006, 12:51

Effectivement fred9999, mais c'est du procédural et là, Tatiana utilise une classe Objet. Il faut donc qu'elle initialise convenablement les paramètres de connexion :
- soit en les programmant en dur dans sa classe, ce qui n'est pas vraiment la solution à plus appropriée en POO;
- soit utiliser un fichier de configuration dans un format approprié. Cette méthode permet d'utiliser la même classe sans jamais devoir y toucher sur différents sites en faisant appel pour chacun à un fichier de configuration spécifique : pour chaque site, ça veut juste dire de modifier quatre valeurs de paramètres, c'est tout. En procédural, on pourrait le faire aussi mais ce sera moins "propre".

par fred9999 » 26 sept. 2006, 10:43

moi pour mes connexion à mes bdd

j'utilise un fichier ex : conec.php
ou je met a paut près ça:
<?php
$db_conn = mysql_connect("localhost", "root", "");
$mysql=mysql_select_db("mabase",$db_conn );
  if (!$mysql)
  {
  echo "cannot select database";
  exit;
  }
?>
et ensuite dans les pages ou je souhaite utiliser ma bdd je l'appelle com
ça :
<?php
include "conec.php";
?>
c'es simple et efficace :lol: [/code]

par Cyrano » 26 sept. 2006, 08:14

Salut,
si tu regardes la méthode de connexion, tu as ceci:
<?php
//...
$obj_db = mysql_connect($this->adr, $this->login, $this->passe);
//...
?>
Ça signifie que les paramètres de connexion doivent être stockés dans les propriétés de ta classe et initialisé dans le constructeur. Les messages d'erreur indiqués montrent que les variables que tu envoies au constructeur ne sont pas définies dans ton fichier de configuration : mais ce fichier s'appelle ClasseMysql.txt : change donc son extension et mets-lui une extension .php puis refais le test.

PHP et connexion à une bd mysql

par Tatiana » 26 sept. 2006, 04:53

Bonjour!

J'aimerais savoir comment se gère l'ouverture et la fermeture de la connexion à une base de données mysql.

Je m'explique, j'utilise une classe pour gérer mes accès. J'ai deux fichiers (la source complète est ici, tout en bas de la page). L'un est "connexion.php" (je n'écris pas mes données ici mais j'ai inscrit les valeurs approprées, bien sûr):

Code : Tout sélectionner

<?php $mysql_adresse = "localhost"; $mysql_login = "root"; $mysql_pass = ""; $mysql_base = "votre_base"; ?>
L'autre est mysql.php, qui comprend entre autres:

Code : Tout sélectionner

function connexion() { // méthode privée // connexion à la base de données if ($this->base) { $obj_db = mysql_connect($this->adr, $this->login, $this->passe); if (!$obj_db) { echo '<div style="' . STYLE_MYSQL . '">Erreur de connexion à la base de données <b>' . $this->base . '</b></div>'; return false; } if (!mysql_select_db($this->base, $obj_db)) { echo '<div style="' . STYLE_MYSQL . '">Erreur : ' . mysql_error( ) . '</div>'; mysql_close($obj_db); return false; } return true; } else { echo '<div style="' . STYLE_MYSQL . '">Erreur : aucune information de connexion - base de données indisponible</div>'; return false; } } function close() { // méthode publique mysql_close(); } [.....................] function select($chaine_sql, $methode, $args=null, $connexion=true) { if ($connexion) { if (!$this->connexion()) return null; } ........etc.
Autrement dit, la fonction connexion() est privée, donc appelée par toutes les autres (ex.: select(...)), mais par contre la fonction close() est publique. Quand dois-je me servir de la fonction close()? Autrement dit, dois-je fermer l'accès à ma BD à la fin de chacune de mes requêtes?

Tandis que j'y suis, j'ai également une autre classe qui fait appel à cette classe, c'est à dire que je l'importe. Je l'ai appelée ClasseGererBD.

De ma page php, j'instancie cette classe, ex: $bd = new ClasseGererBD.

Cela fonctionne, mais je ne peux qu'appeler une seule des méthodes de ma classe ClasseMysql. La seconde fois, j'obtiens:

Code : Tout sélectionner

Notice: Undefined variable: mysql_adresse in c:\...\ClasseMysql.txt on line 32 Notice: Undefined variable: mysql_login in c:\...\ClasseMysql.txt on line 33 Notice: Undefined variable: mysql_pass in c:\...\ClasseMysql.txt on line 34 Notice: Undefined variable: mysql_base in c:\...\ClasseMysql.txt on line 35 Erreur : aucune information de connexion - base de données indisponible
Bon, l'erreur est générée par ClasseMysql, mais je ne comprends pas pourquoi mes variables ne sont plus définies au second appel d'une méthode alors que tout fonctionnait au premier... L'erreur n'est pas dans la méthode elle-même, car le premier appel que je fais fontionne toujours, c'est le second qui bogue.