Page 1 sur 1

message d'erreur lors d'un appel de fonction

Posté : 20 avr. 2012, 22:50
par smashcfr
Bonsoir,

Débutant en PHP, après quelques heures de recherches dans mon code et sur le net, je viens demander un peu d'aide...

Lors de l'appel de la fonction selectionner() de la classe gestion_sql, j'ai cette erreur :
PHP Fatal error: Call to a member function selectionner() on a non-object in /home/smashcfr/Documents/info/sitegene/fonctions/gestion_users/gene_sql_traitement_inscription.php on line 21, referer: http://127.0.0.1/fonctions/gestion_user ... iption.php
A force de chercher, et vu les commentaires trouvés par ailleurs dans d'autres sujets, je me demande si ce n'est pas un problème de portée de l'objet $req_sql, mais sans parvenir à vérifier si c'est ça, et à résoudre le problème.

Ci-dessous les contenus qui peuvent aider à résoudre l'incident (j'essaie de séparer mes fichiers contenant la présentation, les fonctions php, mysql, et les fichiers de classes).


Extrait du fichier gene_fonctionsphp_traitement_inscription.php
	// On inclut les classes
	require($_SERVER['DOCUMENT_ROOT']."/classes/class_user_registration.php");
	require($_SERVER['DOCUMENT_ROOT']."/classes/class_gestion_sql.php");
	require($_SERVER['DOCUMENT_ROOT']."/classes/class_gestion_mail.php");

//....

	// On inclut les pages nécessaires aux opérations mysql à suivre.
	include($_SERVER['DOCUMENT_ROOT']."/fonctions/gestion_mysql/gestion_connection.php");		
	include($_SERVER['DOCUMENT_ROOT']."/fonctions/gestion_users/gene_sql_traitement_inscription.php");

	// Ouverture de la connection à la base de données.
	$req_sql = null;	
	$res_cnx = ouvrir_connection($req_sql);
	
	// Si la connection a échoué, on affiche l'erreur.
	if ($res_cnx == false)
	{
		echo "La connection à la base de données a échoué. Veuillez retenter ultérieurement.";	
	}
	else
	{
		// La connection à la base de données a réussi.
		// Vérification que le login et l'adresse mail ne sont pas déjà présents dans la base de données.
		$regverif -> verif_double_inscription($req_sql, $_POST['login'], $_POST['adresse_mail']); 
	}

Extrait du fichier de classe class_user_registration.php
function verif_double_inscription($req_sql, $login, $email) 
{
	$liste_verif = array(
    		":login" => $login,
    		":adresse_mail" => $email,
    	);
    		
    	// On récupère un tableau avec les résultats de la requête. 
    	// Deux champs : login et adresse mail
    	$retour = verif_sql_inscription($req_sql, $liste_verif);
    		
    	// On vérifie dans le tableau quel élément est déjà présent : login, adresse mail, ou les deux.

}		
Fichier class_gestion_sql.php
<?php

class gestion_sql extends PDO
{
	private $_serveur;
	private $_user;
	private $_mdp;
	private $_bdd;
	public $connexion;

	function __construct()
	{
		$this -> _serveur = "127.0.0.1";
		$this -> _user = "xxxxx";
		$this -> _mdp = "xxxxx";
		$this -> _bdd = "yyyyy";
	}

	function connection()
	{
		try 
		{
			parent::__construct('mysql:host='.$this -> _serveur.';dbname='.$this -> _bdd, $this -> _user, $this -> _mdp);
			$cnx_ok = true;
		}
		catch (PDOException $error) 
		{
			die();
			$cnx_ok = false;
		}
		return $cnx_ok;
	}

	function selectionner($requete, $param = NULL)
	{
		$requete = $this -> prepare($requete);
		if ($param[0] != NULL)
		{
			$nbelem = count($param);
			for ($i = 0; $i < $nbelem; $i++)
			{
				$requete -> bindParam(key($param[i]), $param[i]);
			}
		}
		$requete -> execute();
		$requete -> setFetchMode(PDO::FETCH_OBJ);
		return $requete;
	}
	
	function creer_uniqueid()
	{
		return md5(uniqid());		
	}
}

?>
Fichier gestion_connection.php
<?php

function ouvrir_connection($req_sql)
{
	// Ouverture de la connexion vers la base de données
	$req_sql = new gestion_sql();
	$res_connection = $req_sql -> connection();
	return $res_connection;
}

?>
Fichier gene_sql_traitement_inscription.php
<?php

function proceder_inscription()
{
	// Préparation de la requête, et insertion du nouvel utilisateur dans la base.
	$idunique = $req_sql -> creer_uniqueid();
	$inscription = $req_sql -> prepare("INSERT INTO gen_users (login, mdp, adresse_mail, unique_id) VALUES(:login, :mdp, :email, :uniqueid)");
	$inscription -> bindvalue(':login', $_POST['login'], gestion_sql::PARAM_STR);
	$inscription -> bindvalue(':mdp', md5($_POST['mot_de_passe']), gestion_sql::PARAM_STR);
	$inscription -> bindvalue(':email', $_POST['adresse_mail'], gestion_sql::PARAM_STR);
	$inscription -> bindvalue(':uniqueid', $idunique, gestion_sql::PARAM_STR);
	$inscription -> execute();
	return $idunique;
}

function verif_sql_inscription($req_sql, $liste_verif)
{
	$requete = "SELECT login, adresse_mail FROM gen_users WHERE login = :login OR adresse_mail = :adresse_mail";
	
	// Retour est défini localement et est ici un tableau de résultat de requête mysql
	$retour = $req_sql -> selectionner($requete, $liste_verif);
	
	// On met le résultat de la requete dans un tableau, que l'on va renvoyer à la fonction php appelante.
	$retourtab = array();
	while ($ligne = $retour->fetch())
	{
		array_push($retourtab, $ligne);
	}
	
	return $retourtab;
}

?>
Merci bcp !

Re: message d'erreur lors d'un appel de fonction

Posté : 21 avr. 2012, 07:52
par xTG
Dans une fonction tu n'as accès qu'aux super-globales -$_GET, $_POST, $_SERVER, ect) ainsi qu'aux fonctions passées en paramètre.
Donc tu dois passer en paramètre cette variable, ou bien la déclarer en global.

Exemple :
$a = 2;
function output1($a){
  echo $a; // ok
}
function output2(){
  global $a;
  echo $a; // ok
}

Re: message d'erreur lors d'un appel de fonction

Posté : 21 avr. 2012, 12:34
par smashcfr
Merci pour la réponse.

Ca m'a permis d'avoir des pistes pour continuer à chercher, et la solution que j'ai retenue et qui a l'air de fonctionner :

- Passage de $req_sql, mais par référence, dans l'ouverture de connexion, afin de permettre à la fonction de le modifier (Conseillé ? Pas conseillé ?)
$res_cnx = ouvrir_connection(&$req_sql);
- Passage de $req_sql en paramètre de la fonction proceder_inscription().


Maintenant me reste d'autres erreurs, notamment dans le passage de mes paramètres de ma fonction selectionner($requete, $param = NULL). Je vais regarder, et je posterai un sujet si vraiment je ne trouve pas.

Merci :)

(A priori pas possible d'ajouter le tag [Résolu] dans le sujet ?)

Re: message d'erreur lors d'un appel de fonction

Posté : 22 avr. 2012, 11:39
par xTG
Depuis PHP5 les objets sont implicitement passés par référence.

Re: message d'erreur lors d'un appel de fonction

Posté : 22 avr. 2012, 19:22
par smashcfr
Ok merci !
Je vais voir pour tenter sans le passage par référence alors.