Version complète: sur le forum Webmaster Hub : problème basique d'héritage de class
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
seif_scalp
Bonjour,

j'ai un problème basique d'héritage de class, je viens de créer deux classes : la première qui me connect à la base de donnée et réalisé toutes les fonctions correspondantes et la seconde qui est l'extention de la première se nommant arti...



CODE
class sql_db
{

    var $db_connect_id;
    var $query_result;

    
    function sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true)
    {

etc etc...


et la seconde

CODE
class arti extends sql_db {

    public $db;

    public function arti()
    {
            $this->sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true);
    }

    public function last_arti($num,$typ)

    {

        $tabarti = array();
        $sql="SELECT * FROM arti WHERE typ='$typ' order by id DESC limit $num";
        $result = $this->sql_query($sql) OR die(mysql_error());

        while($aff = $this->sql_fetchrow($result));
        {

            $tabarti[$aff['id']] = array('pict' =>  $aff['pict'],'num' =>  $aff['num'],'typ' =>  $aff['typ']);

        }

        return $tabarti;

etc...


et enfin l'appel

CODE
$db = new sql_db('localhost','root','','bdd', false);

$manews = new arti();
    $tab = $manews->last_arti(5,1);
        
        foreach ($tab as $news_id=>$new)
            {                        
                echo '<b>'.$new[num].'</b>';
            }



ce qui s'affiche a l'écran est : "No database selected"

ma faute est normalement au niveau de l'extension de classe, car j'ai vérifié chaque classe en autonome elles marchent toutes les deux ... je commence avec les class php et ça marche plutot bien jusque là ... l'extension de class c'est chaud ... tongue.gif

Merci d'avance pour votre aide smile.gif
marcb
Et si tu remplaçais

CODE
$db = new sql_db('localhost','root','','bdd', false);
$manews = new arti();


par

CODE
$manews = new arti('localhost','root','','bdd', false);


Et en ajoutant les différents paramètres dans le constructeur de arti.
Ca devrait être mieux.

Ton problème, c'est que tu instancies arti sans paramètre. Et accessoirement tu instancies
sql_db mais tu n'utilises plus l'objet créé après.

Je penses qu'avec un
CODE
error_reporting(E_ALL);


au début de ton script, tu aurais eu des warnings qui t'auraient mis sur la piste.

M
Findel
Dans le constructeur de arti :

$sqlserver, $sqluser, $sqlpassword, $database, $persistency = true

Autant de variables qui n'existent pas, à mon avis le soucis vient de là. Comme le disait march, il faudrait que tu rajoute tout ça en paramètres au constructeur d'arti
seif_scalp
oui mais ds ce cas ca m'oblige a rédéclarer mysql en quelque sorte et c'est pas vraiment intéressant car dans ce cas l'héritage sert a rien ... happy.gif

j'y ai pensé aussi, mais c'est pas la solution de réécrire la déclaration de variable tongue.gif en fait j'ai surtout un problème de compréhension sur l'héritage si vous avez des tutos ou autre happy.gif merci d'avance smile.gif
seif_scalp
bon g finalement opter pour la solution que vous m'avez proposer c'est à dire initialiser dans ma class arti les valeur de sql_db mais je rencontre un nouveau problème ... il n'y a plus d'erreur mais ma boucle foreach n'affiche pas les valeurs savez vous si jme suis trompé ds le code ci-dessous :

CODE
class arti extends sql_db {

     public $ids;
     public $db;
     public $lien;

     public function arti()

     {
        
        
         $this->sql_db('localhost','root','','bdd', false);

     }



     public function last_arti()

     {

         $tabarti = array();
         $sql="SELECT nid,id,typ,tiin,titr,tex FROM arti WHERE id='1' && typ='1' order by nid DESC";
     $result = $this->sql_query($sql) OR die(mysql_error());
    
     while($aff = $this->sql_fetchrow($result));
         {

             $tabarti[$aff['nid']] = array('titr' => $aff['titr'],'tex' => $aff['tex']);

         }

         return $tabarti;
        

     }


};




     $manews = new arti();
     $manews->ids = $id;
     $ta = $manews->last_arti();
        
         foreach ($ta as $news_id=>$new)
             {        

echo '
<b>'.$new[titr].'</b>
<b>'.$new[tex].'</b>
';            
}


si j'affiche directement $aff = $this->sql_fetchrow($result); -> echo $aff[titr]; ca m'affiche bien un élément donc aucune faute avant le while()

et donc jtrouve pas là ... sad.gif

RESOLU : il fallait simplement enlever le ; après le while, faute bête...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.