Appel d'une fonction sur un non-objet... Le retour !

Eléphanteau du PHP | 29 Messages

09 mai 2012, 21:30

Bonsoir,

J'essaie de continuer à progresser dans mon script, mais je bloque de nouveau sans parvenir à trouver une solution...

J'ai de nouveau ce message d'erreur.... Mais ne parviens pas à appliquer les pistes qu'on avait évoquées la dernière fois :
PHP Fatal error:  Call to a member function selectionner() on a non-object in /home/smashcfr/Documents/info/sitegene/fonctions/gestion_users/fonctions_bdd/gene_sql_traitement_inscription.php

La structure :

fichier index.php
<?php
// Initialisation du système de routing.
require("systeme/header_principal.php");

// Connexion à la bdd
require($listeroutes -> getemplacement("gestion_connection")); 
?>
....
<html>
....
<?php include ($listeroutes -> getemplacement("inclusion_cadre_principal")); ?>

fichier inclusion_cadre_principal.php
<?php 
	if (file_exists($pagegeneree))
	{
		include($pagegeneree);					
	}
	else
	{
		echo "Page inexistante";
	}
	//include ($listeroutes -> getemplacement("accueil")); 
?>
La page est générée depuis le fichier init.php
<?php

// Appel de la classe.
require($_SERVER['DOCUMENT_ROOT']."/classes/class_gestion_routes.php");

// Nouvelle instance de la classe.
$listeroutes = new gestion_routes();

// Création de la liste des routes.
require("routes.php");

// Test de l'argument passé en url.
if (isset($_GET["page"]))
{
	$nomroute = htmlentities(trim($_GET["page"]));
}
else
{
	// argument non défini, on va appeler la page d'accueil.
	$nomroute = "accueil";
}

// Test de l'existence de la route, et génération de la page correspondante.
$pagegeneree = $listeroutes -> getemplacement($nomroute);

?>

fichier gestion_connexion.php où se fait l'ouverture de la connexion
<?php

require($listeroutes -> getemplacement("class_gestion_sql"));

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;
}

$res_cnx = ouvrir_connection(&$req_sql);

?>
Puis, extrait du fichier où l'on se sert de la connexion :
$regverif -> verif_double_inscription($req_sql, $_POST['login'], $_POST['adresse_mail']); 
N'hésitez pas si besoin d'autres infos, ou si je n'ai pas été clair...

EDIT : Petite précision... Dans ma recherche de solutions, j'ai essayé de serializer l'objet créé, mais ceci n'est à priori pas possible, car "You cannot serialize or unserialize PDO instances".

Merci !

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

09 mai 2012, 21:54

salut,

y a quoi dans ce fichier home/smashcfr/Documents/info/sitegene/fonctions/gestion_users/fonctions_bdd/gene_sql_traitement_inscription.php ?

et surtout pourquoi ne pas vérifier pourquoi l'objet n'est pas ce que tu attend ( la je suppose qu'il vaut false).

Il faut debuguer a grand coup de var_dump() mais sans le code du fichier en question on peux pas t'aider plus (d'ailleurs manque le numéro de ligne dans le message d'erreur la)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 29 Messages

09 mai 2012, 22:23

Voici le fichier !
<?php

function proceder_inscription($req_sql)
{
	// Préparation de la requête, et insertion du nouvel utilisateur dans la base.
	$idunique = $req_sql -> creer_uniqueid();
	$pass = md5($_POST['mot_de_passe']);
	$liste_valid = array(
    	":login" => $_POST['login'],
		":mdp" => $pass,
		":email" => $_POST['adresse_mail'],
		":uniqueid" => $idunique,
	);
	$requete = 	"INSERT INTO gene_gen_users (login, mdp, adresse_mail, unique_id) VALUES(:login, :mdp, :email, :uniqueid)";
	$retour = $req_sql -> inserer($requete, $liste_valid);
	if ($retour == false)
	{
		return "false";
	}
	else
	{
		return $idunique;
	}
}

function verif_sql_inscription($req_sql, $liste_verif)
{
	$requete = "SELECT login, adresse_mail FROM gene_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();
	$i = 0;
	while ($ligne = $retour->fetch())
	{
		$retourtab[$i][0] = $ligne -> login;
		$retourtab[$i][1] = $ligne -> adresse_mail;
		$i = $i + 1;
	}
	
	return $retourtab;
}

?>
Le message d'erreur en entier :
[Tue May 08 21:56:14 2012] [error] [client 127.0.0.1] PHP Fatal error:  Call to a member function selectionner() on a non-object in /home/smashcfr/Documents/info/sitegene/fonctions/gestion_users/fonctions_bdd/gene_sql_traitement_inscription.php on line 31, referer: http://127.0.0.1/index.php?page=gene_inscription
En fait, le fait qu'il soit à false ou true pour l'instant importe peu. L'objectif à terme est de mettre un die au moment de la connexion s'il est à false pour interrompre les scripts si ce n'est pas bon.
Là l'objectif est de garder l'objet représentant la connexion à la base de données, pour que les accès puissent se faire. Conserver l'instance PDO en bref.

J'ai l'impression que l'objet se perd en court de route (c'est ce qui m'était arrivé la dernière fois, résolu en le passant de fonction en fonction). Mais là, je ne vois pas comment faire du fait du système de routing qui est générique quel que soit le fichier appelé.

En complément, l'erreur si j'essaie de serializer l'objet, j'ai ceci comme erreur :
[Tue May 08 21:59:09 2012] [error] [client 127.0.0.1] PHP Fatal error:  Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in /home/smashcfr/Documents/info/sitegene/fonctions/gestion_mysql/gestion_connection.php:15\nStack trace:\n#0 [internal function]: PDO->__sleep()\n#1 /home/smashcfr/Documents/info/sitegene/fonctions/gestion_mysql/gestion_connection.php(15): serialize(Object(gestion_sql))\n#2 /home/smashcfr/Documents/info/sitegene/index.php(4): require('/home/smashcfr/...')\n#3 {main}\n  thrown in /home/smashcfr/Documents/info/sitegene/fonctions/gestion_mysql/gestion_connection.php on line 15, referer: http://127.0.0.1/index.php?page=gene_traitement_inscription

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

09 mai 2012, 22:49

il faut que tu vérifie que $req_sql soit bien l'objet voulu (instance_of etc)

Parce que la c'est sur cette variable n'est pas ce que tu souhaite.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 29 Messages

11 mai 2012, 21:08

Ah punaise j'ai trouvé !!!

En fait je n'arrivais pas à comprendre, car quand j'utilisais cette commande, j'avais toujours un résultat à "true", quel que soit le fichier utilisé.
var_dump($req_sql instanceof gestion_sql);
Donnait :
bool(true) 
A force de chercher, je me suis aperçu qu'il me restait l'ancienne déclaration de l'instance (Qui était faite avant son initialisation, et que donc je passais à NULL dans mon appel de fonction pour que cela fonctionne....).
$req_sql = null;
Forcément, en mettant cette ligne en commentaire, mon instance est conservée et tout fonctionne...

Merci pour le "instanceof" que je ne connaissais pas, et qui m'a permis de comprendre mon problème plus facilement :)