Une classe qui ne voudrait pas s'initialiser

Ferdi
Invité n'ayant pas de compte PHPfrance

10 sept. 2005, 12:10

Bonjour à tous,
je suis en train de créer mon premier site en php.
En fait c'est un site en html dans lequel je vais essayer d'inserer un peu de php pour l'automatiser un peu.
Mon premier défi est donc de construire une page d'inscription correcte, dont les champs iraient dans ma base de données.
J'ai donc construit la page www.drivingmanagement.yi.org/inscription2.htm qui est une page expérimentale pour l'instant qui viendra remplacer ma page d'inscription normale (inscription.htm).

Donc je résume la situation:

j'ai mon formulaire en:
<form action="suivi_inscription.php" enctype="application/x-www-form-urlencoded">
Sur ma page suivi_inscription.php j'ai fait :
<?php
include("header.php");
$_POST["identifiant"] = stripslashes($_POST["identifiant"]);
$_POST["password"] = stripslashes($_POST["password"]);
$_POST["email"] = stripslashes($_POST["email"]);
$_POST["ecurie"] = stripslashes($_POST["ecurie"]);
$_POST["nom_patron"] = stripslashes($_POST["nom_patron"]);
$_POST["nation"] = stripslashes($_POST["nation"]);
$_POST["description_ecurie"] = stripslashes($_POST["description_ecurie"]);
$souvenir_info = $_GET["souvenir_info"];
if ($souvenir_info = oui)
{
$_cookieUnName="identifiant";
$_cookieDeuxName="password";
$_cookieUnValue="identifiant";
$_cookieDeuxValue="password";
$_expire=14*24*3600;
setcookie($_cookieUnName, $_cookieUnValue, time() + $_expire);
setcookie($_cookieDeuxName, $_cookieDeuxValue, time() + $_expire);

}
$c = new inscription($_POST["identifiant"], $_POST["password"], $_POST["email"], $_POST["ecurie"], $_POST["nom_patron"], $_POST["nation"], $_POST["description_ecurie"]);
$c -> enregistrer();
$destinataire = $_POST["email"];
$sujet = "Récapitulatif de vos informations à propos de l\'inscription sur le site de jeu Driving Management";
$corps="à remplir";
mail ( $destinataire, $sujet, $corps);
print("Votre inscription a bien été validée!<br/>Vous allez recevoir un message récapitulant les informations que vous venez d'entrer à l'adresse email que vous venez d'indiquer.<br/>Vous allez maintenant être redirigé sur la page d\'accueil de la catégorie pour laquelle vous venez d'être inscrit.");
print("<meta HTTP-EQUIV=\"refresh\" CONTENT=20;URL=\"kart_saison1.htm\">");
include("footer.php");
?>
et mon header.php est :
<?php
function __autoload($classe)
{
	include("classes/".$classe.".php");
}
?>
<html>
<head>
<title>Suivi des inscriptions au jeu Driving Management</title>
</head>
<body>
Ma classe inscription existe et est bien dans le répertoire classes:
<?php
class Inscription
{
	private $identifiant;
	private $password;
	private $email;	
	private $ecurie;
	private $nom_patron;
	private $nation;	
	private $description_ecurie;
		function __construct( $identifiant, $password, $email, $ecurie, $nom_patron, $nation, $description_ecurie )
	{
		$this->identifiant = $identifiant;
		$this->password = $password;
		$this->email = $email;
		$this->ecurie = $ecurie;
		$this->nom_patron = $nom_patron;
		$this->nation = $nation;
		$this->description_ecurie = $description_ecurie;
	}
	function enregistrer()
	{
		$bdd = new MySql();
		$bdd->connecter();
		$requete  = "INSERT INTO kart_saison1 (identifiant, password, email, ecurie, nom_patron, nation, description_ecurie) VALUES (";
		$requete .= "'" . mysql_escape_string($this->identifiant) . "', ";
		$requete .= "'" . mysql_escape_string($this->password) . "', ";		
		$requete .= "'" . mysql_escape_string($this->email) . "', ";
		$requete .= "'" . mysql_escape_string($this->ecurie) . "', ";
		$requete .= "'" . mysql_escape_string($this->nom_patron) . "', ";		
		$requete .= "'" . mysql_escape_string($this->nation) . "', ";	
		$requete .= "'" . mysql_escape_string($this->description_ecurie) . "' )";		
				$bdd->executerRequete( $requete );
				$bdd->deconnecter();
	}

}
?>
Le problème est au final que d'une part les cookies ne sont pas envoyés (mais ça c'est pas très grave, c'est juste un truc que j'essayais de faire) mais surtout que j'ai le message d'erreur:
Fatal error: Cannot instantiate non-existent class: inscription in /home/drivingman/domains/drivingmanagement.yi.org/public_html/suivi_inscription.php on line 19
Il me semble que ça veut dire qu'il pense que ma classe inscription n'existe pas.

Jj'imagine donc que le problème vient de la fonction__autoload du header.php

Je me suis librement inspiré du livre PHP 5 de N.Borde chez Micro App.
C'est pour ça que mon système parait bizzarement complexe pour un newbie du php. Mais je pense avoir compris ce que j'ai fait et ce qui est censé se dérouler.

Merci de bien vouloir m'aider à débugger tout ça car je n'y arive pas moi-même.
Ciao

Mammouth du PHP | 19672 Messages

10 sept. 2005, 12:17

Est-ce que ton serveur est bien configuré en PHP5 et non en PHP4 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Ferdi
Invité n'ayant pas de compte PHPfrance

10 sept. 2005, 12:35

En effet il est configuré en php4;
je ne sais pas comment modifier mon script en conséquence
Auriez-vous une idée de comment opérer?
Merci d'avance

Mammouth du PHP | 19672 Messages

10 sept. 2005, 12:43

Alors tu dois modifier le nom de ton constructeur qui doit être nommé comme la classe elle-même au lieu de __construct() qui est une syntaxe PHP5 que ne comprend pas PHP4.

Même chose pour __destruct ou toutes les méthodes "magiques" de PHP5 si tu en crées une ultérieurement.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 353 Messages

10 sept. 2005, 12:53

Tu ajoutes une méthode:

function Inscription( $identifiant, $password, $email, $ecurie, $nom_patron, $nation, $description_ecurie ) {
$this->__construct($identifiant, $password, $email, $ecurie, $nom_patron, $nation, $description_ecurie);
}

et la compatibilité est assurée. Ta classe fonctionnera aussi bien avec php4 qu'avec php5

Mammouth du PHP | 19672 Messages

10 sept. 2005, 13:02

Simple et astucieux =D>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Ferdi
Invité n'ayant pas de compte PHPfrance

10 sept. 2005, 13:13

Ok super pour l'aide
j'ai hâte de voir si ça va marcher mais malheureusement je ne sais pas où placer la méthode que tu m'indique: quel fichier exactement et je dois enlever quoi pour mettre ceci àla place.
Est-ce que je dois aussi faire ce que Cyrano m'a dit?
Merci beaucoup pour votre aide

Mammouth du PHP | 19672 Messages

10 sept. 2005, 13:45

Tu l'insère dans ta classe comme ceci:
<?php
class Inscription
{
    private $identifiant;
    private $password;
    private $email;
    private $ecurie;
    private $nom_patron;
    private $nation;
    private $description_ecurie;
    /**
     * Constructeur PHP5
     */
    function __construct( $identifiant, $password, $email, $ecurie, $nom_patron, $nation, $description_ecurie )
    {
        $this->identifiant = $identifiant;
        $this->password = $password;
        $this->email = $email;
        $this->ecurie = $ecurie;
        $this->nom_patron = $nom_patron;
        $this->nation = $nation;
        $this->description_ecurie = $description_ecurie;
    }
    /**
     * Constructeur PHP4
     */
    function Inscription( $identifiant, $password, $email, $ecurie, $nom_patron, $nation, $description_ecurie )
    {
        $this->__construct($identifiant, $password, $email, $ecurie, $nom_patron, $nation, $description_ecurie);
    }
    /**
     * Enter description here...
     *
     */
    function enregistrer()
    {
        $bdd = new MySql();
        $bdd->connecter();
        $requete  = "INSERT INTO kart_saison1 (identifiant, password, email, ecurie, nom_patron, nation, description_ecurie) VALUES (";
        $requete .= "'" . mysql_escape_string($this->identifiant) . "', ";
        $requete .= "'" . mysql_escape_string($this->password) . "', ";
        $requete .= "'" . mysql_escape_string($this->email) . "', ";
        $requete .= "'" . mysql_escape_string($this->ecurie) . "', ";
        $requete .= "'" . mysql_escape_string($this->nom_patron) . "', ";
        $requete .= "'" . mysql_escape_string($this->nation) . "', ";
        $requete .= "'" . mysql_escape_string($this->description_ecurie) . "' )";
        $bdd->executerRequete( $requete );
        $bdd->deconnecter();
    }
}
?>
La question que je me pose par contre, c'est qu'en PHP4, ça va peut-être tordre le nez à cause des "private" des propriétés de la classe :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Ferdi
Invité n'ayant pas de compte PHPfrance

10 sept. 2005, 13:57

Je viens de tester exactement la modification de la classe insription mais j'ai toujours le même message d'erreur.
Je pense que le problème se situe au niveau de la fonction __autoload de mon header.
Qu'en pensez-vous?

Mammouth du PHP | 19672 Messages

10 sept. 2005, 14:00

Très juste: alors pour php4, ajoute un include pour insérer la classe : __autoload() est une autre méthode magique de PHP5 non comprise par PHP4
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Ferdi
Invité n'ayant pas de compte PHPfrance

10 sept. 2005, 14:52

Je te remercie pour ton aide
J'imagine facilement qu'un simple include("classes/inscription.php") marcherait facilement, mais en fait j'aurais aimé gardé ce header pour toute les pages de mon site que je programmerais en php.
De plus, la classe inscription en fait appel à une autre: MySql, qui elle-même en fait intervenir une autre.
C'est pour ça que mon autoload m'aurait aidé à gérer ces classes qui n'ont pas subi d'include auparavant.
Est-il possible de conserver un système convenable alors?
Sinon, deux solutions s'offrent à moi: soit je renonce à ce système, soit je change d'hébergeur.

Mammouth du PHP | 19672 Messages

10 sept. 2005, 14:56

Fais-toi un fichier d'inclusion unique dans lequel tu auras l'appel à tes classes: le jour où ton serveur passe à PHP5, tu n'auras que ce fichier à modifier pour utiliser la méthode __autoload() et dans tes défférenttes pages, tu fais un include de ce fichier au lieu d'inclure directement les classes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Ferdi
Invité n'ayant pas de compte PHPfrance

10 sept. 2005, 15:01

OK merci pour le coup de main
Je pense comprendre le concept de ce qui pourrait se passer mais j'avoue avoir un peu de mal à voir à quoi ressemblerait ce fichier:
est ce que ce serait quelque chose du genre?
<?php
class Inscription
{
/* bla bla
*/
}


class MySql
{

}
?>
Sinon pourrais tu me faire une rapide arborescence de ce à quoi il devrait ressembler à peu près (dans le même style qu'au-dessus peut être)?
Merci d'avance

Mammouth du PHP | 1311 Messages

10 sept. 2005, 15:05

salut
pour utiliser autoload tu fait un fichier par class et le nom de ton fichier est celui de ta class avec la meme casse

Mammouth du PHP | 19672 Messages

10 sept. 2005, 15:12

Le principe basique: dans tes fichier, une ligne comme par exemple:
include_once("./charge_classes.php")
Dans ce fichier "charge_classes.php" les lignes d'incusion des classes:
<?php
include_once('./lib/identifier.php');
include_once('./lib/mysql.php');
// etc...
?>
Où "lib" serait donc le répertoire contenant les classes.

Le jour où tu passes à PHP5 sur le serveur, tu remplace tous les include de ce fichier par la méthode __auto_load()

Ou mieux encore : tu teste dans un if/else la version de PHP avec phpversion() et selon le résultat, tu mets les includes ou l'autoload.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: