JeuWeb - Crée ton jeu par navigateur
PHP objet: plantage que je ne comprends pas - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : PHP objet: plantage que je ne comprends pas (/showthread.php?tid=531)

Pages : 1 2


PHP objet: plantage que je ne comprends pas - joshua - 13-12-2006

voici les fichiers en cause:

class planete_ressource_db.class.php
Code PHP :
<?php


class planete_ressource_db
{

protected
$element = "";
protected
$value = "";

function
__construct($db='')
{
if (
$db == '')
{
global
$db_exploit;
$db = $db_exploit;
}
$this->db = $db;
$this->id_planete = "NULL";
$this->id_ressource = "NULL";
$this->valeur = "NULL";
$this->croissanceactuelle = "NULL";
$this->timestamp = "NULL";

}


function
__get($element)
{
switch(
$element)
{
case
'id_planete':
return
$this->id_planete;
case
'id_ressource':
return
$this->id_ressource;
case
'valeur':
return
$this->valeur;
case
'croissanceactuelle':
return
$this->croissanceactuelle;
case
'timestamp':
return
$this->timestamp;
}
}

function
check () //valide que tout est bon pour insérer en base
{
if (
$this->id_planete != "NULL")
{
if (
$this->id_ressource != "NULL")
{
if (
$this->valeur != "NULL")
{
if (
$this->croissanceactuelle != "NULL")
{
if (
$this->timestamp != "NULL")
{
$response = "1";
}
}
}
}
}
return
$response;
}

/**
* initialise les données en base
*/
protected function initialize ()
{
$contenu="SELECT croissance FROM `tbl_ressource` WHERE `id_ressource`=".$this->id_ressource." ";
$res = $this->db->query($contenu);
$table = $this->db->getObject($res);
$this->valeur=$table->croissance;
$this->croissanceactuelle=$table->croissance;
$this->timestamp=time();
$contenu="INSERT INTO `tbl_planete_ressource` VALUES ('".$this->id_planete."','".$this->id_ressource."','".$this->valeur."','".$this->croissanceactuelle."','".$this->timestamp."')";
$res = $this->db->query($contenu);
}


/**
* charge un élement depuis la base en se reposant sur son "id"
*/
function load ($id_planete,$id_ressource)
{

$res = $this->db->query("SELECT * FROM tbl_planete_ressource WHERE id_planete = '".$this->id_planete."' AND id_ressource = '".$this->id_ressource."'");
if (
$this->db->sql_num_res[$res] != "0")
{
$table = $this->db->getObject($res);
$this->id_planete = $table->id_planete;
$this->id_ressource = $table->id_ressource;
$this->valeur = $table->valeur;
$this->croissanceactuelle = $table->croissanceactuelle;
$this->timestamp = $table->timestamp;
}
else
{
return
"false";
}
}
?>


et
planete_ressource.class.php
Code PHP :
<?php


/* chemin relatif vers les classes à tester*/
$path_to_classes = '../model/';
/**
* inclusion de la classe mère
*/
require_once($path_to_classes . 'planete_ressource.db.class.php');

/**
* classe de gestion des ressources.
*/
class planete_ressource extends planete_ressource_db
{
protected
$id_planete = "NULL";
protected
$id_ressource = "NULL";
protected
$valeur = "NULL";
protected
$croissanceactuelle = "NULL";
protected
$timestamp = "NULL";

/**
* constructeur de la ressource
*/
function __construct($db='',$id_planete,$id_ressource)
{
if (
$db == '')
{
global
$db_exploit;
$db = $db_exploit;
}
$this->db=$db;
parent::__construct($db);
$test=parent::load($id_planete,$id_ressource);
if (
$test == "false")
{
parent::initialize();
}
}



}

?>


je fais un test simple:

Code PHP :
<?php 
/* Démarrage des tests */
function testInsertPlaneteRessource()
{
$dbtest = $this->setUpContext();
$id = "1";
$nom = "ressource2";
$croissance = "100";
$categorie = "12";
$ressource = new ressource($dbtest);
$ressource->set("id",$id);
$ressource->set("nom",$nom);
$ressource->set("croissance",$croissance);
$ressource->set("categorie",$categorie);
$ressource->save();
$id = "1";
$genre = "planete";
$nom = "planete_2test";
$taille = "52";
$type = "desertique";
$galaxie = "022";
$peuplade = "jawa";
$coordonnee_x = "52";
$coordonnee_y = "52";
$dbtest = $this->setUpContext();
$planete = new planete($dbtest);
$contenu="INSERT INTO `tbl_planete` VALUES ('".$id."','".$genre."','".$nom."','".$taille."','".$type."','".$galaxie."','".$peuplade."','".$coordonnee_x."','".$coordonnee_y."')";
$res = $dbtest->query($contenu);
$dbtest = $this->setUpContext();
$planete_ressource = new planete_ressource($dbtest,"1","1");


}

et il me retourne:
( ! ) Fatal error: Call to a member function query() on a non-object in C:\Program Files\wamp\www\starwars\model\planete_ressource.db.class.php on line 131
Call Stack
# Time Function Location
1 0.0019 {main}() C:\Program Files\wamp\www\starwars\test\test_lanceur.php:0
2 0.0702 GroupTest->run() C:\Program Files\wamp\www\starwars\test\test_lanceur.php:38
3 0.7258 GroupTest->run() C:\Program Files\wamp\www\simpletest\test_case.php:607
4 0.7260 SimpleTestCase->run() C:\Program Files\wamp\www\simpletest\test_case.php:605
5 0.7298 SimpleExceptionTrappingInvoker->invoke() C:\Program Files\wamp\www\simpletest\test_case.php:96
6 0.7298 SimpleInvokerDecorator->invoke() C:\Program Files\wamp\www\simpletest\exceptions.php:39
7 0.7298 SimpleErrorTrappingInvoker->invoke() C:\Program Files\wamp\www\simpletest\invoker.php:126
8 0.7298 SimpleInvokerDecorator->invoke() C:\Program Files\wamp\www\simpletest\errors.php:43
9 0.7298 SimpleInvoker->invoke() C:\Program Files\wamp\www\simpletest\invoker.php:126
10 0.7299 TestOfPlaneteRessource->testInsertPlaneteRessource() C:\Program Files\wamp\www\simpletest\invoker.php:68
11 0.7952 planete_ressource->__construct() C:\Program Files\wamp\www\starwars\test\planete_ressource.class.test.php:85
12 0.7954 planete_ressource_db->load() C:\Program Files\wamp\www\starwars\controller\planete_ressource.class.php:42


je trouve pas :'(


RE: PHP objet: plantage que je ne comprends pas - pascal - 13-12-2006

à mon avis, ça vient de la dernière ligne du test:
Code PHP :
<?php 
$planete_ressource
= new planete_ressource($dbtest,"1","1");

essaie de voir en la commentant, et si c'est ça, remonte le code.

je pense qu'il y a un soucis avec le membre db dans la méthode load parente, genre ce n'est pas un objet du type voulu.

Bon debuggage! :p

A+

Pascal


RE: PHP objet: plantage que je ne comprends pas - joshua - 13-12-2006

Mais ca je le savais deja :'(
Ma base est bien settée un peu plus tot dans le SetUpContext ....
Par contre, visiblement pour lui il ne s'agit plus d'une base dans la fonction load alors qu'elle est bien définie précédemment.....
Si quelqu'un a une idée sur le pourquoi de la fonction load qui ne reconnait plus la db.....


RE: PHP objet: plantage que je ne comprends pas - Aramiil - 13-12-2006

Essai de faire

Code :
die(var_dump($this->db));

avant

Code :
$res = $this->db->query("SELECT * FROM tbl_planete_ressource WHERE id_planete = '".$this->id_planete."' AND id_ressource = '".$this->id_ressource."'");

pour voir ?


RE: PHP objet: plantage que je ne comprends pas - joshua - 13-12-2006

je teste ça ce soir... j'ai pas accès a mon pc avant :'(
Faut que je comprenne ce qui merde, ca me travaille!


RE: PHP objet: plantage que je ne comprends pas - X-ZoD - 13-12-2006

lol
mn code semble apocalyptique a cote de ca -_-


RE: PHP objet: plantage que je ne comprends pas - pascal - 13-12-2006

mouais...

le code est lisible, mais je vais chipoter:
_ la methode check() peut être améliorée:
* la variable $response n'est pas initialisée, on a un risque d'erreur
* comme c'est une vérification, ça devrait renvoyer TRUE ou FALSE, pas la chaine "1"
_ la methode load():
* elle ne renvoie rien ou renvoie la chaine "false"; elle devrait renvoyer TRUE ou FALSE
* si elle ne renvoie rien, comment tester ça dans une variable?

pour identifier le bug, je rajouterai du code :
_ dans la classe dérivée, vérifier $this->db avant et après parent::__construct()
_ au debut de load(), verifier que $this->db existe et est un objet du type voulu ( SQL )

A+

Pascal


RE: PHP objet: plantage que je ne comprends pas - joshua - 13-12-2006

euuuuuh.... tu fais tout ca comment? propose, je suis toujours preneur pour améliorer mon code :p
Les tests c'est pas ma test de thé :p


RE: PHP objet: plantage que je ne comprends pas - pascal - 13-12-2006

je l'écrirai comme ça:

class planete_ressource_db.class.php
Code PHP :
<?php


class planete_ressource_db
{


function
check () //valide que tout est bon pour insérer en base
{
if (
$this->id_planete != "NULL" &&
$this->id_ressource != "NULL" &&
$this->valeur != "NULL" &&
$this->croissanceactuelle != "NULL" &&
$this->timestamp != "NULL" )
{
return
TRUE;
}else{
return
FALSE;
}
}


/**
* charge un élement depuis la base en se reposant sur son "id"
*/
function load ($id_planete,$id_ressource)
{

$res = $this->db->query("SELECT * FROM tbl_planete_ressource WHERE id_planete = '".$this->id_planete."' AND id_ressource = '".$this->id_ressource."'");
if (
$this->db->sql_num_res[$res] != "0")
{
$table = $this->db->getObject($res);
$this->id_planete = $table->id_planete;
$this->id_ressource = $table->id_ressource;
$this->valeur = $table->valeur;
$this->croissanceactuelle = $table->croissanceactuelle;
$this->timestamp = $table->timestamp;
return
TRUE;
}
else
{
return
FALSE;
}
}
?>


et
planete_ressource.class.php
Code PHP :
<?php
/**
* classe de gestion des ressources.
*/
class planete_ressource extends planete_ressource_db
{

/**
* constructeur de la ressource
*/
function __construct($db='',$id_planete,$id_ressource)
{
if (
$db == '')
{
global
$db_exploit;
$db = $db_exploit;
}
$this->db=$db;
/* TEST SUR $this->db ICI */
parent::__construct($db);
/* TEST SUR $this->db ICI */
$test=parent::load($id_planete,$id_ressource);
/* TEST SUR $this->db ICI */

if ($test == FALSE)
{
parent::initialize();
}
}


}

?>
( bien sûr, il faut adapter le code qui utilise cette classe après ces modifications )

et pour le test sur $this->db, soit faire un log dans un fichier, soit faire un echo:
_ existence du membre: isset($this->db);
_ type du membre: get_class($this->db);

enjoy! Smile

A+

Pascal


RE: PHP objet: plantage que je ne comprends pas - joshua - 13-12-2006

l'ennui que jai découvert il y a peu c'est que quand tu sors avec return false, il sort en exit 1...... en gros ton programme s'arrete. C'est pour ca que j'ai mis volontairement des return "false" pour qu'il reconnaisse le nom et pas la fonctionnalité. Ou alors que j'ai mis return 1.......
Pour le reste je teste ca ce soir.
Je suis assez embeté d'avoir un debugger et qu'il ne me retourne pas l'etat de mes variables... visiblement je ne le maitrise pas encore assez!