pas de connection mysql à partir d'une function

Eléphant du PHP | 227 Messages

11 avr. 2009, 11:05

Bonjour à tous,

Pourriez-vous m'expliquer pourquoi la connexion ne se fait pas en passant par une function alors que si je ne passe pas par une function cela fonctionne ? Merci !

Apparamment c'est l'initialisation qui ne se fait pas voici les erreurs :

Code : Tout sélectionner

Notice: Undefined variable: serveur in Warning: mysql_pconnect() [function.mysql-pconnect]: Access denied for user 'ODBC'@'localhost'

$serveur = "localhost";
$admin   = "moi";
$mdp     = "mdp";
$base    = "db_fc";

function region_connect()
	{		
	$connexion = mysql_pconnect($serveur, $admin, $mdp)or die('Erreur de connection à la base : '.mysql_error());
	
	if($connexion != false)
	{
	  $base_connect = mysql_select_db($base, $connexion);
	  $sql1 = "SELECT `id_region`, `nom_region`"." FROM `fc_region`"." ORDER BY `id_region`";
	  $rech_regions = mysql_query($sql1);
	  
	  $code_region = array();
	  $nom_region = array();		
	  
	  $nb_regions = 0;
	  if($rech_regions != false)
	{
	while($ligne = mysql_fetch_assoc($rech_regions))
	{
		
	  array_push($code_region, $ligne['id_region']);
	  array_push($nom_region, $ligne['nom_region']);
	  
	  $nb_regions++;		
	    }
	  }
	}				
			}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 avr. 2009, 11:26

C'est une question de portée.

Les fonctions ont en effet un petit côté autiste : elles ne sont absolument pas conscientes de ce qui se passe autour d'elles si on ne le leur dit pas explicitement :)

Pour qu'elles puissent avoir accès à une variable déclarée à l'extérieure de la fonction, il te faut soit lui passer les valeurs en paramètres, soit lui spécifier qu'il s'agit de variables globales, et qu'elle doit aller les chercher à l'extérieur :
function region_connect($serveur, $admin, $mdp) { // valeurs à donner lors de l'appel à la fonction
  ....
}

// ou bien 

function region_connect() {
  global $serveur, $admin, $mdp; // le mot clé global indique à la fonction qu'il s'agit de variables externes
  ....
}
Dans le premier cas, tu ne passes que les valeurs à la fonction, dans le second cas tu lui indiques la présence des variables externes. La différence, c'est que dans le second cas tu peux également modifié ces variables, alors que tu ne peux pas le faire dans le premier (vu que tu récupères juste les valeurs)

HTH :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 227 Messages

11 avr. 2009, 12:20

Bonjour Ryle,

Tout d'abord merci de la rapidité de la réponse, j'ai bien compris et rajouter:

Code : Tout sélectionner

global $serveur, $admin, $mdp, $base;
Donc plus d'erreur de connexion. Par contre toujours dans le même esprit, pourquoi dans le cadre de cette même function l'extraction de la base de ce fait plus ?
Faut-il également initialiser les autres variables ?

Merci de ton aide.

Mammouth du PHP | 1339 Messages

11 avr. 2009, 14:44

Il faut rajouter dans global toutes les $variables qui ne sont pas défini au sein de la fonction ...
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 avr. 2009, 16:34

En fait, les variables que tu déclares dans une fonction ne sont définies que localement. A la fin de l'exécution de la fonction, elles sont perdues (toujours ce côté autiste ;))

Tu peux donc soit déclarer tes variables hors de la fonction, puis les spécifier comme globales (ce qui te permet de les modifier à l'intérieur de la fonction), soit demander à ta fonction de retourner une valeur que tu pourras récupérer :
$code_region = array(); 
$nom_region = array();    // déclaration des variables hors de la fonction

function region_connect() {
  global $code_region, $nom_region; // spécifications des variables externes
  ...
      array_push($code_region, ...); // met à jour la variable externe
  ...
}

// autre solution 

function region_connect() {
  ...
      array_push($code_region, ...); // met à jour la variable INterne
  ...
  return $code_region; // retourne la valeur de la variable interne
}

$code_region = region_connect(); // récupère la valeur retournée par la fonction dans la variable externe
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 227 Messages

11 avr. 2009, 16:49

J'ai suivi tes conseils et cela fonctionne
Merci beaucoup et bonne après midi

Gesualda