IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Problème avec $this de PHP4 à PHP5


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut [POO] Problème avec $this de PHP4 à PHP5
    Bonjour à vous tous. Mon hébergeur à passé à la version 5 sans m'en parler donc je voudrais faire fonctionner mes pages à nouveau.

    Tous les sites que j'ai fait fonctionne magnifiquement bien sur les serveurs PHP4.x mais ne veut rien savoir en version 5.

    J'utilise la structure suivante : Mon fichier index.php appel par include le fichier bll.php, qui lui-même appel dal.php et qui à son tour appel connection.php

    l'avantage est que si je change de type de base de données je n'ai qu'à changer mes requêtes dans le fichier dal.php et mon fichier de connexion.


    Voici mes fichiers

    inc/connection.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    <?
    	class connection {
     
    		var $Host     = "mysql2.myserv.com"; // Hostname of our MySQL server.
    		var $Database = "mydatabasename"; // Logical database name on that server.
    		var $User     = "mydatabaseuser"; // User und Password for login.
    		var $Password = "mydatabasepass";
     
    		var $Link_ID  = 0;  // Result of mysql_myconnect().
    		var $Query_ID = 0;  // Result of most recent mysql_query().
    		var $Record   = array();  // current mysql_fetch_array()-result.
    		var $Row;           // current row number.
     
    		var $Errno    = 0;  // error state of query...
    		var $Error    = "";
     
    		## myhalt() start ##
    		function myhalt($msg) {
    			printf("</td></tr></table><b>Database error:</b> %s<br>\n", $msg);
    			printf("<b>MySQL Error</b>: %s (%s)<br>\n",
    				$this->Errno,
    				$this->Error);
    			die("Session halted.");
    		}		
    		## myhalt() end ##
     
    		## myconnect() start ##
    		function myconnect() {
    			if ( 0 == $this->Link_ID ) {
    				$this->Link_ID=mysql_myconnect($this->Host, $this->User, $this->Password);
    				if (!$this->Link_ID) {
    					$this->myhalt("Link-ID == false, connect failed");
    				}
    			  	if (!mysql_query(sprintf("use %s",$this->Database),$this->Link_ID)) {
    					$this->myhalt("cannot use database ".$this->Database);
    			  	}
    			}
    		}	
    		## myconnect() end ##
     
    		## dispose() start ##
    		function dispose() {
    			$this->Link_ID = -1;
    		}
    		## dispose() end ##
     
    		## query() start ##
    		function query($Query_String) {
    			$this->myconnect();
     
    			$this->Query_ID = mysql_query($Query_String,$this->Link_ID);
    			$this->Row   = 0;
    			$this->Errno = mysql_errno();
    			$this->Error = mysql_error();
    			if (!$this->Query_ID) {
    				$this->myhalt("Invalid SQL: ".$Query_String);
    			}
     
    			return $this->Query_ID;
    		}		
    		## query() end ##
     
    		## next_query() start ##			
    		function next_record() {
    			$this->Record = mysql_fetch_array($this->Query_ID);
    			$this->Row   += 1;
    			$this->Errno = mysql_errno();
    			$this->Error = mysql_error();
     
    			$stat = is_array($this->Record);
    			if (!$stat) {
    				mysql_free_result($this->Query_ID);
    				$this->Query_ID = 0;
    			}
    			return $stat;
    		}		
    		## next_query() end ##
     
    		## seek() start ##
    		function seek($pos) {
    			$status = mysql_data_seek($this->Query_ID, $pos);
    			if ($status)
    				$this->Row = $pos;
    			return;
    		}		
    		## seek() end ##
     
    		function num_rows() {
    			return mysql_num_rows($this->Query_ID);
    		}
     
    		function num_fields() {
    			return mysql_num_fields($this->Query_ID);
    		}
     
    		function f($Name) {
    			return $this->Record[$Name];
    		}
     
    		function p($Name) {
    			print $this->Record[$Name];
    		}
     
    		function affected_rows() {
    			return @mysql_affected_rows($this->Link_ID);
    		}
     
    	}
    ?>
    inc/dal.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?
    	include("connection.php");
     
    	class DAL {  // CONNECTION
    		function conn(){
    			$this = new connection;		
    		}
     
    		function dispose(){
    			$this->dispose();
    		}	
     
    		///////////////////////////////////////////////////
    		//////////////////     LOGIN    ///////////////////
    		///////////////////////////////////////////////////
    		function mylogin($user, $pass){
    			if ($user != "" OR $pass != ""){
    				$qry = "SELECT * FROM tbl_user WHERE fld_username = '".$user."' AND fld_pw = '".$pass."';";			
    				$this->conn();
    				$this->query($qry);
    				if($this->num_rows() == 1){
    					$this->next_record();
    					$t = $this->Record['fld_userID'];
    					$this->dispose();
    					return $t;
    				}
    				else
    				{
    					return -1 ;
    				}
    			}
    			else
    			{
    				return -1 ;
    			}
    		}
    } // FIN CLASS
    ?>
    inc/bll.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?
    	include("dal.php");
     
    	class BLL {
     
    		function conn() {
    			$this = new DAL;
    		}	
     
    		function dispose() {
    			$this->dispose();
    		}
     
     
    		///////////////////////////////////////////////////
    		//////////////////     LOGIN    ///////////////////
    		///////////////////////////////////////////////////		
    		function mylogin($user, $pass){
    			$this->conn();
    			$t = $this->mylogin($user, $pass);
    			if ($t > 0){
    				$_SESSION['userID'] = $t; 
    				$this->dispose();
    				return $t;
    			}
    			else {
    				$this->dispose();
    				return false;
    			}
    		}
    } // FIN CLASS
    ?>

    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <? 
    	session_start();
     
    	//INCLUDE
    	include("inc/bll.php");
    	include("inc/util.php");
    	include("inc/error.php");
     
    	//VARIABLES
    	$badUser = "";
    	$error = array();
     
    	//VALIDATION
    	if ($_SERVER['REQUEST_METHOD'] == "POST"){
    		$user = $_POST['user'];
    		$pw = md5($_POST['pw']);
     
    		if($user == "" || $pw == "") {
    				$error[] = 1;
    				$_SESSION['userID'] = 0;
    				$_SESSION['security'] = 0;
    		}
    		else
    		{
    			$conn = new BLL;
    			$login = $conn->mylogin($user, $pw);
    			if ($login > 0){
    				$conn->dispose();			
    				header("location: home.php"); 
    			}
    			else{
    				$conn->dispose();
    				$error[] = 2;
    				$_SESSION['userID'] = 0;
    				$_SESSION['security'] = 0;		
    			}
     
    		}
    	}
     
     
    	// COLLECTE D'INFORMATION POUR LES MESSAGES D'ERREUR A AFFICHER
    	if (count($error) > 0){
    		$errormsg = "";
    		for ($x = 0; $x <= count($error); $x++){
    			if ($error[$x] > 0){
    				$errormsg .= gestionError($error[$x])."<br>";
    			}
    		}
    	}
     
    ?>
    <html>
    <head>
    <title>TITRE</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <link href="css/general.css" rel="stylesheet" type="text/css">
    </head>
     
    <body>
    <form name="form1" method="post" action="">
      <table width="760" border="0" align="center" cellpadding="0" cellspacing="0" class="text">
        <tr>
          <td colspan="2"><img src="i/logo.gif" width="760" height="84"></td>
        </tr>
        <tr>
          <td width="28%" height="20">&nbsp;</td>
          <td width="72%" height="20">&nbsp;</td>
        </tr>
        <tr>
          <td height="20">&nbsp;</td>
          <td height="20" class="error"><? echo $errormsg; ?></td>
        </tr>
        <tr>
          <td height="20" colspan="2"><table width="760" border="0" cellspacing="0" cellpadding="0">
            <tr class="text">
              <td height="20"><div align="right">Nom d'Usager&nbsp;:&nbsp; </div></td>
              <td height="20"><input name="user" type="text" class="text" id="user"></td>
            </tr>
            <tr class="text">
              <td height="20"><div align="right">Mot de Passe&nbsp;:&nbsp;</div></td>
              <td height="20"><input name="pw" type="password" class="text" id="pw"></td>
            </tr>
            <tr class="text">
              <td height="20">&nbsp;</td>
              <td height="20"><input type="submit" name="Submit" value="Valider"></td>
            </tr>
          </table></td>
        </tr>
      </table>
    </form>
    </body>
    </html>

    Lorsque je tente d'exécuter le code sur la version 5, il me donne tout simplement une page blanche avec rien dedans, même si j'affiche la source.

    Après plusieurs heures de recherche, de lecture sur les différents forums et à mettre tout en commentaire et activer peu à peu mon code ... voici la ligne qui cause tous les problèmes selon moi mais qui est primordiale dans l'ensemble de mon code.


    dans le fichier dal.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function conn(){
    			$this = new connection;	 // ICI LE PROBLÈME	
    		}
    il ne semble pas aimer $this = ...


    qqun a une idée du problème causé par PHP 5 ????

    Merci à l'avance

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par c4l3m
    Après plusieurs heures de recherche, de lecture sur les différents forums et à mettre tout en commentaire et activer peu à peu mon code ... voici la ligne qui cause tous les problèmes selon moi mais qui est primordiale dans l'ensemble de mon code.


    dans le fichier dal.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function conn(){
    			$this = new connection;	 // ICI LE PROBLÈME	
    		}
    il ne semble pas aimer $this = ...


    qqun a une idée du problème causé par PHP 5 ????

    Merci à l'avance
    Salut,

    Et ça marchait ça en php4 ?

    Parce qu'il me semble que c'est de toute façon incorrect.
    Tu dois plutôt lui donner une variable publique $conx et affecter dans le constructeur, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class DAL {
        public $cnx;
     
        __construct {
            $this->cnx = new connection;
        }
    }
    Et encore, ça dépend de ce qu'est "connection", mais j'imagine que c'est défini dans ton include précédent la classe.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut oui
    Oui tout ca fonctionne très bien sous PHP4.x

    connection est la classe connection qui est dans le fichier connection.php appelé par le fichier dal.php qui lui est appelé par bll.php

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Etonnant. Peut être qu'en php4, le $this était interprété comme une propriété.
    Quoi qu'il en soit, je maintiens ma première remarque.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut je suis un boulet
    Rebonjour,

    je n'arrive malheureusement pas à faire ce que j'ai en tête

    Je veux avoir une classe qui serait entre ma classe de connexion et ma page web pour faire la gestion de la requête. C'est la que se corse mes trucs et ca fait 8h que je buche ...

    Mon fichier s'appel dal.php et est une classe .. il fonctionne sur php4 mais pas php5 et j'aimerais arriver à le faire fonctionner.


    Dans ma page web j'aimerais appeler le tout comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $t = new DAL;
    $infoUser = $t->getUserInfos($userID);
    $t->dispose();
    Le problème majeur que je n'arrive pas à faire fonctionner est que l'objet DAL ne veut pas connecter et faire le traitement de la requête puis retourner un array des champs.

    Voici le traitement dans mon fichier DAL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    function getUserInfos($userID){
    			$qry = "SELECT  * FROM `TBL_USERS` WHERE `fld_id` =".$userID.";";
    			$this->conn();
    			$this->query($qry);
    			if($this->num_rows() >= 1){
    				$t = array();
    				while ($this->next_record()){
    					$t[] = array(
    								$this->Record['fld_id'], 						// 0
    								$this->Record['fld_land'],
    								$this->Record['fld_honor'],
    								$this->Record['fld_gold'],
    								$this->Record['fld_food'],
    								$this->Record['fld_rock'],						// 5
    								$this->Record['fld_gf'],
    								$this->Record['fld_joy'],
    								$this->Record['fld_high_networth'],
    								$this->Record['fld_high_land'],
    								$this->Record['fld_high_honor'],				// 10
    								$this->Record['fld_total_land_explored'],
    								$this->Record['fld_total_atk_made'],
    								$this->Record['fld_total_win'],
    								$this->Record['fld_total_gain'],
    								$this->Record['fld_total_atk_suffered'],		// 15
    								$this->Record['fld_total_lost'],
    								$this->Record['fld_era']
    								);
    				}
    				$this->dispose();
    				return $t;
    			}
    			else 
    			{
    				return -1;
    			}
    		}
    J'ai fait une tentative avec le début de code de jml94 mais je n'arrive pas à jumeler ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class DAL {
        public $cnx;
     
        __construct {
            $this->cnx = new connection;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function getUserInfos($userID){
    			$qry = "SELECT  * FROM `TBL_USERS` WHERE `fld_id` =".$userID.";";
    			$this->conn();
    			$this->query($qry);  ........
    Qqun peut me diriger pour bâtir le début de ma classe DAL svp ??

  6. #6
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Et bien moi, je ne ferais pas une mais deux classes !

    Une couche db pure et ta classe DAL, surcouche d'accès à la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    <?php
    class clsMysql
    {
    	public $cnx;
    	public $query_result;
     
    	function __construct($serveur, $user, $motpasse, $dbname) {
    		$this->cnx = @mysql_connect($db_host, $db_username, $motpasse);
     
    		if ($this->cnx) {
    			if (@mysql_select_db($dbname, $this->cnx))
    				return $this->cnx;
    			else
    				return 'Database inconnue. MySQL error: '.mysql_error();
    		}
    		else
    			return 'Connexion au serveur impossible. MySQL error: '.mysql_error();
    	}
     
     
    	function requete($sql) {
    		$this->query_result = @mysql_query($sql, $this->cnx);
     
    		if ($this->query_result) return $this->query_result;
    		else                     return false;
    	}
     
     
    	function fetch_assoc($query_id = 0) {
    		return ($query_id) ? @mysql_fetch_assoc($query_id) : false;
    	}
     
     
    	function nb_results($query_id = 0) {
    		return ($query_id) ? @mysql_num_rows($query_id) : false;
    	}
     
     
    	function close() {
    		if ($this->cnx) {
    			if ($this->query_result)
    				@mysql_free_result($this->query_result);
     
    			return @mysql_close($this->cnx);
    		}
    		else
    			return false;
    	}
    }
    ?>
    et la classe DAL, faite à ta guise, le principe de l'accès aux données étant le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    $myDb = new clsMysql ($serveur, $user, $motpasse, $dbname);
     
    $objDAL = new DAL ($myDb);
     
    // puis à l'intérieur de ta classe
    $resultat = $myDb->requete('SELECT truc, bidule FROM table_machin;')
    $curseur_des_resultats = $myDb->fetch_assoc($resultat);
    $nombre_de_lignes = $myDb->nb_results($resultat);
    // etc...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Erreur avec $this
    Par Touareg dans le forum Langage
    Réponses: 6
    Dernier message: 05/03/2007, 07h29
  2. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  3. [POO] Problème avec setInterval/méthodes d'écriture
    Par Lpu8er dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/07/2006, 15h37
  4. [POO] Probleme avec $this
    Par cubepiege dans le forum Langage
    Réponses: 5
    Dernier message: 01/03/2006, 15h39
  5. [POO] Problème avec l'utilisation de classes.
    Par sekiryou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo