Page 1 sur 2

Une classe qui ne voudrait pas s'initialiser

Posté : 10 sept. 2005, 12:10
par Ferdi
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

Posté : 10 sept. 2005, 12:17
par Cyrano
Est-ce que ton serveur est bien configuré en PHP5 et non en PHP4 ?

Posté : 10 sept. 2005, 12:35
par Ferdi
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

Posté : 10 sept. 2005, 12:43
par Cyrano
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.

Compatibilité

Posté : 10 sept. 2005, 12:53
par nicolas
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

Posté : 10 sept. 2005, 13:02
par Cyrano
Simple et astucieux =D>

Posté : 10 sept. 2005, 13:13
par Ferdi
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

Posté : 10 sept. 2005, 13:45
par Cyrano
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

Posté : 10 sept. 2005, 13:57
par Ferdi
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?

Posté : 10 sept. 2005, 14:00
par Cyrano
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

Posté : 10 sept. 2005, 14:52
par Ferdi
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.

Posté : 10 sept. 2005, 14:56
par Cyrano
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.

Posté : 10 sept. 2005, 15:01
par Ferdi
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

Posté : 10 sept. 2005, 15:05
par jeff
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

Posté : 10 sept. 2005, 15:12
par Cyrano
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.