Probleme d'execution très bizare

Trinou
Invité n'ayant pas de compte PHPfrance

10 sept. 2010, 09:49

Bonjour tout le monde !

J'ai un problème qui m'échappe totalement : j'ai fait un site en local qui fonctionne très bien et quand j'essaye de le mettre sur serveur plus rien ne va.
Plus rien ne s'affiche pourtant il semblerait que mes fichiers include soient bien chargés...

Je vous met le code pour que ce soit plus clair :
index.php
<?php

//--------------------------
//Include files
//--------------------------

//configuration file
include_once './config.php';

echo $init_file;

//framework classes and interfaces
include_once $root_app.'Ecom/views/View.php';
include_once $root_app.'Ecom/views/ActionView.php';
include_once $root_app.'Ecom/views/TaskView.php';
include_once $root_app.'Framework/ControllerImpl.php';
include_once ($root_app.'Framework/Data.php');
include_once ($root_app.'Framework/StringData.php');
include_once ($root_app.'Framework/Request.php');
include_once ($root_app.'Framework/Response.php');
include_once ($root_app.'Database/MySQLConnection.php');

//Connection with database
echo "1";
$connect = MySQLConnection::getInstance();
echo "2";
try{
	$connect->connect();
	echo "connecté";
}catch (ConnectionException $e){
	echo $e;
}
echo "youpi";
//---etc etc etc
Si je met des echo dans mes classes que je charge (juste après les includes avant le " Class trucmuche {") il me les affiche, donc je suppose que ces pages sont chargées...

mais ensuite, il ne m'affiche que le 1 (voir les echo 1, 2 dans mon index.php). et je ne vois pas pourquoi le MySQLConection n'est pas executé....

MySQLConnection.php
<?php

include_once($root_app."Database/ConnectionException.php");
echo "je suis le fichier MySQLCOnnection";
class MySQLConnection {
	private $connectionId;
	private $dbconnection;
	private $isconnected;
	
	private function _construct(){
		echo "construct";
		$this->isconnected=false;
	}
	
	public static final function getInstance(){
		$instance = null;
		echo "je passe ici";
		if(!isset($isconnected)){
			$instance = new MySQLConnection();
		}else{
			$instance = $this;
		}
		return $instance;
	}
	
	public function connect(){
		$this->connectionId = mysql_connect('toto.fr', 'root', '');
		echo "je passe dans la boucle de connexion";
		if (!$this->connectionId) {
    		die('Connexion impossible : ' . mysql_error());
		}
		$this->dbconnection = mysql_select_db('toto',$this->connectionId) or die('Database error');
		
		if(isset($this->connectionId) && $this->dbconnection){
			$this->isconnected = true;
		}else{
			$this->isconnected=false;
			throw new ConnectionException('Connection failed');
		}
	}
	
Help !! Je suis au bout du roulot et tout ça m'échappe completement !
Le plus bizare c'est que cette version a déjà fonctionné avant mais on n'arrive pas à savoir pourquoi. Est ce que ce serait lié au serveur ??????

Merci d'avance :priere:

Mammouth du PHP | 19672 Messages

10 sept. 2010, 13:10

Où donc est définie ta variable $root_app ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Trinou
Invité n'ayant pas de compte PHPfrance

10 sept. 2010, 13:55

Dans le fichier ./config.php

Mammouth du PHP | 19672 Messages

10 sept. 2010, 14:23

Je suis pas certain que ce soit ça, mais il existe une différence entre « _ » et « __ »
Or dans ta classe, tu as écrit :
<?php
//...
    private function _construct(){
        echo "construct";
        $this->isconnected=false;
    }
Au lieu de
<?php
//...
    private function __construct(){
        echo "construct";
        $this->isconnected=false;
    }
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Trinou
Invité n'ayant pas de compte PHPfrance

10 sept. 2010, 14:32

Et non ça n'a rien changé (mais ça m'explique d'autres problèmes que j'avais eu :lol: merci)

Mammouth du PHP | 19672 Messages

10 sept. 2010, 14:39

Ta question est un peu incomplète.

Dans ton code, tu as mis des echo("qqch") un peu partout : donc tu dois facilement voir jusqu'à quel moment ça fonctionne et donc tu auras un point de départ à donner. Il faut cerner le bug, définir le point qui n'est pas bon et trouver l'origine de l'erreur. Là, on a pas assez d'éléments pour te répondre.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Trinou
Invité n'ayant pas de compte PHPfrance

10 sept. 2010, 14:51

Bah j'ai dit au début, que le code du index.php ne s'éxécutait que jusqu'au echo "1";
Mais je ne comprends pas du tout pourquoi....

Mammouth du PHP | 19672 Messages

10 sept. 2010, 15:05

Bon effectivement j'avais pas regardé ta classe en détail :
Je me demande si tu as bien assimilé certains principes de la POO et de la construction d'un singleton.
Là j'ai pas le temps d'entrer dans les détails, mais voici la base fondamentale de ce que tu devrais avoir :
<?php
class MySQLConnection
{
    private static $_instance;

    private function __construct()
    {
        echo "Construction de l'instance";
    }

    public static final function getInstance()
    {
        echo "je passe ici";
        if(!isset(self::$_instance))
        {
            self::$_instance = new MySQLConnection();
        }
        return self::$_instance;
    }
}
Teste déjà avec ça et reviens pour une suite éventuelle, mais surtout iobserve bien les différences avec ton code actuel et demande-toi pourquoi ça marche dans un cas et pas dans l'autre. Demande-toi aussi ce qui ne va pas dans ton code, en particulier si tu as bien initialisé toutes tes variables dans la méthode statique getInstance() au moment où tu y fais appel.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

devlop78
Invité n'ayant pas de compte PHPfrance

11 sept. 2010, 02:56

Je confirme, le code est bizarre ...

Code : Tout sélectionner

private function _construct(){ echo "construct"; $this->isconnected=false; } public static final function getInstance(){ $instance = null; echo "je passe ici"; if(!isset($isconnected)){ $instance = new MySQLConnection(); }else{ $instance = $this; } return $instance; }
$isconnected != $this->isconnected
De plus, __construct() est appelé après getInstance(), donc initialiser une connexion pour l'éteindre juste après ...
Et le principe de getInstance() est d'être appelé plusieurs fois (mais ce n'est pas une obligation !!). Donc, faire un $instance = null et recréer à chaque fois une nouvelle connexion ....

Mammouth du PHP | 19672 Messages

11 sept. 2010, 09:04

Je confirme, le code est bizarre ...
Tout ça pour dire quoi en fin de compte ? Si ta réponse pouvait apporter un élément aidant à l'apprentissage pour Trinou, ce serait intéressant, mais là ça n'apporte rien du tout et ressemble bien davantage à un ricanement... :non:

Pas sûr que tu aurais beaucoup aimé ça à l'époque où tu apprenais les mêmes chose :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Trinou
Invité n'ayant pas de compte PHPfrance

13 sept. 2010, 15:20

Je sais bien que mon code est bizarre :lol: Si j'ai des erreurs d'exécutions aussi peu claires c'est bien qu'il y a un problème.
J'ai réussi à défaire quelques problèmes. Maintenant je bute autre part, et bien sûr je trouve ça toujours aussi bizarre....

Fichier index.php
Blabla plus haut avec ma chaine de connexion SQL qui fonctionne désormais
//creation of the application controller
$_SESSION['controller']= new ControllerImpl();

$ctrl = $_SESSION['controller'];
//----------------------
//Action management
//----------------------

if(!isset($_REQUEST['action'])){
    echo " pas isset";
    $request = new Request($_REQUEST);
    $response = new Response();
    echo " 1 ";
    $listener = $ctrl->getListener("default");
    echo "classe : ".get_class($listener);
    $data = $listener->handle($request);
    echo $data;
    $view = $ctrl->getView("default");
    echo "pourp2";
    $view->display($data,$response);
Fichier init.php
<?php
echo " ok 1 ";
//-----------------------------------------------------------------------------
// includes des views
//-----------------------------------------------------------------------------
include_once 'Ecom/views/DefaultView.php';
include_once 'Ecom/views/ErrorView.php';
include_once 'Ecom/views/ActionView.php';
include_once 'Ecom/views/TaskView.php';
include_once 'Ecom/listeners/DefaultListener.php';
include_once 'Ecom/listeners/ActionListener.php';
include_once 'Ecom/listeners/TaskListener.php';

echo " ok 8 ";

$controller =$_SESSION['controller'];
echo " ok 9 ";
/**
*Pour chaque action que l'on passera dans l'URL, on associe une view et un listener
*/

//-----------------------------------------------------------------------------
// registration of the views and default error page
//-----------------------------------------------------------------------------

$controller->registerView ('default', new DefaultView());
echo " ok 10 ";
$controller->registerView ('error', new ErrorView());
echo " ok 11 ";
$controller->registerView ('action', new ActionView());
echo " ok 12 ";
$controller->registerView ('newAction', new ActionView());
echo " ok 13 ";
$controller->registerView ('task', new TaskView());
echo " ok 14 ";
//-----------------------------------------------------------------------------
// registration of the listeners
//-----------------------------------------------------------------------------
$controller->registerActionListener ('default', new DefaultListener());
$controller->registerActionListener ('action', new DefaultListener());
$controller->registerActionListener ('newAction', new ActionListener());
$controller->registerActionListener ('task', new TaskListener());
 ?>
Fichier DefaultView.php
<?php
echo "dv 1";

echo "dv 2";
include_once "Ecom/views/View.php";
include_once "Ecom/model/ActionPlanDAO.php";
include_once "Ecom/model/TaskDAO.php";
echo "dv 3";

/**
* Cette view est celle par défaut, elle appelé lorsqu'aucune action n'est spécifiée dans l'url
*/

class DefaultView implements View{
    /**
    * La fonction display permet d'affiche du contenu html dans la page
    * elle est appelé dans index.php
    * @param Data $data la donnée renvoyée par le handle des listeners
    * @param Response $response l'objet créé dans index.php
    */
    public function display(Data $data, Response $response){
        //----------------Action Part--------------------//
        $actionPlanDAO = new ActionPlanDAO();

        $result = $actionPlanDAO->_findAll();
        
        $xml_output  = '<?xml version="1.0" encoding="UTF-8"?>'.'<carnet>';
        while ($row = mysql_fetch_array($result)) {
            $xml_output .= '<truc>';
        }
        $xml_output .= '</carnet>';
        
        $fp = fopen("actionExport.xml", 'w+');
        fputs($fp, $xml_output);
        fclose($fp);
        $response->write("<br/>");
        $response->write('<div id="grid-example2"></div><a href="actionExport.xml">Voir le fichier XML</a><br/>');
    
        $link1 = "'index.php?action=action'";
        $response->write('<input type="button" value="View actions" name="action_link" onclick="self.location.href='.$link1.'" /><br/>');
        
        //---------------------Task Part---------------------//
        $taskDAO = new TaskDAO();
        $result = $taskDAO->_findAll();
        
        $xml_output  = '<?xml version="1.0" encoding="UTF-8"?>'.'<carnet>';
        while ($row = mysql_fetch_array($result)) {
            $xml_output .= '<truc>';
        }
        $xml_output .= '</carnet>';
        
        $fp = fopen("taskExport.xml", 'w+');
        fputs($fp, $xml_output);
        fclose($fp);
        $response->write("<br/>");
        $response->write('<div id="grid-example"></div><a href="taskExport.xml">Voir le fichier XML</a><br/>');
        
        
        $link2 = "'index.php?action=task'";
        $response->write('<input type="button" value="View tasks" name="task_link" onclick="self.location.href='.$link2.'" />');
        $response->write("<br/><br/>");
        
        
    }
}
Dans mon fichier index.php, j'inclue le fichier init.php. Donc lorsque je lance index.php sans paramètre il est sensé m'afficher la default view, mais ça coince au moment du echo "ok 10"; à l'écran ça ne va que jusqu'au echo ok 9, donc je suppose que le problème est ici :

$controller->registerView ('default', new DefaultView());

Mais qu'est ce qui cloche ???
(En tout cas merci de votre aide, ça m'aide à tenir !)

Trinou
Invité n'ayant pas de compte PHPfrance

14 sept. 2010, 14:21

OK c'est bon j'ai trouvé !

Il fallait que je fasse mon include init.php entre ces lignes là :
$_SESSION['controller']= new ControllerImpl();

$ctrl = $_SESSION['controller'];

Et que je fasse un session_start() au tout début !

Merci pour les autres erreurs !