Page 1 sur 1

Attribué des données MySQL aux variables de classe

Posté : 02 avr. 2014, 22:37
par Allen_Blocci
Bonjour,

J'essaie de créer ma première classe et d'attribuer aux variables de ma classe des données d'une base MySQL. Il s'agit plus d'un exercice pour l'instant que de créer une réelle appli.
Cela ne fonctionne pas et je ne comprend pas pourquoi (syntaxe ? Fonction ?...)

Ma classe et sa fonction Construct :
<?php


class Fiche
{
	
private $Title;
private $Editeur;
	
	public function _construct($id)
    
	{
		$db = mysql_connect("localhost", "xxxx", "xxxx")
   		or die("Impossible de se connecter : " . mysql_error());
   		mysql_select_db('XXXX',$db);
   		mysql_set_charset( 'utf8' );   
		$result = mysql_query("SELECT * FROM `XXXX`.`Fiche_livre` WHERE Type='$id' ");
		while ($row = mysql_fetch_array($result)) 
		{
		return $this->Title = $row[0];
		return $this->Editeur = $row[1];
		
		}
		mysql_free_result($result);
		mysql_close($db);
   
    }
   
   }
?>
Le fichier faisant appel à ma classe souhaitant afficher les variables :
<?php

include_once('classe.fiche.php');
$id = '840';
$Fiche = new Fiche($id);
echo $Title;
echo $Editeur;

?>
Il y a quelque chose que je n'ai pas compris dans la construction de la fonction _construct. Mais après avoir parcouru le forum, et des tuto sur le web je n'ai pas trouvé...

En vous remerciant de vote aide !!!

Allen Blocci

Re: Attribué des données MySQL aux variables de classe

Posté : 04 avr. 2014, 15:46
par moogli
salut,

le mot clef return sert à indiquer ce que l'on souhaite retourner.
Tu ne peux l'utiliser qu'une seule fois.
Tu ne peux pas dire je retourne mes variables et elles sont dispo dans le code, cela va a l'encontre du modèle objet et de la séparation des responsabilités.

Je pense que tu devrais revoir les base de l'objet afin de mieux comprendre ce qui ne va pas dans ton code. Par exemple http://www.lephpfacile.com/cours/24-la- ... ndamentaux

pour affecter quelque chose à une variable ou dans ton cas une propriété de la classe utilise simplement l'opérateur =

Pendant que j'y suis tu n'as pas besoin de boucle étant donnée que tu ne doivant qu'une seule ligne de données correspondant à un id ? (sinon c'est qu'il y a un soucis nan ? ;:)).

je suppose que le "Type" est un entier ? si oui pas besoin de ' en sql un entier n'est pas une chaîne de caractère (oui cela fonctionne dans ce cas mais ce n'est pas toujours le cas donc autant prendre le pli correctement.

vu que que tu es en apprentissage je te conseil ne pas utiliser l’extension mysql qui est vouée à disparaître (regarde dasn la doc ce qu'il en est dit) au profit des extensions mysqli ou PDO.

Vu que tu lance dans l'objet autant le faire et aborder de suite les motifs de conception.
L'un d'entre, simple, s'appel DAO (data access objet) qui permet de gérer l'accès aux données (fichier, sgbd, stream, pigeon voyageur ou autre).
La dao va fournir des objet ou des listes d'objets correspondant à ta demande.
Dans ton cas tu aurais un objet "fiche" qui ne contient que les données et une class dao réalisant la requête sql.


un exemple que ce cela peux donner
<?php

class Fiche {

    private $titre;
    private $editeur;

    public function __construct(){

    }

    /**
     * @param mixed $editeur
     */
    public function setEditeur($editeur) {
        $this->editeur = $editeur;
    }

    /**
     * @return mixed
     */
    public function getEditeur() {
        return $this->editeur;
    }

    /**
     * @param mixed $titre
     */
    public function setTitre($titre) {
        $this->titre = $titre;
    }

    /**
     * @return mixed
     */
    public function getTitre() {
        return $this->titre;
    }
}

class FicheDao {

    private $sgbdConn;

    public function __construct( \PDO $sgbdConn) {
        if(is_null($sgbdConn)){
            throw new InvalidArgumentException('Connexion SGBD  obligatoire');
        }
        $this->sgbdConn = $sgbdConn;
    }

    public function getFiche($id){
        if(is_null($id) || !is_numeric($id)){
            throw new InvalidArgumentException('Id null non accepté !');
        }
        $sql = 'SELECT * FROM Fiche_livre WHERE Type='.$this->sgbdConn->quote($id, PDO::PARAM_INT);

        $result = $this->sgbdConn->query($sql);
        if($result == false){
            $e = $this->sgbdConn->errorInfo ();
            throw new \Exception ( 'Erreur SQL : ' . $e [2], $this->sgbdConn->errorCode () );
        }
        $data = $result->fetchAll ( \PDO::FETCH_CLASS, 'Fiche' );
        $result->closeCursor();
        return $data[0];
    }

}

// utilisation

$pdo = new PDO('mysql:host=localhost;dbname=testdb','user','password');

$ficheDao = new FicheDao($pdo);

$fiche = $ficheDao->getFiche(840);

echo $fiche->getTitre();
echo $fichier->getEditeur();
L'avantage c'est que tu code la dao une seule fois et la réutilisé quand tu en a besoin.

j'ai aussi introduit le conception "d'injection de dépendance" (par le constructeur).
C'est à dire que l'on injecte (fournit) l'objet permettant la connexion à la base de donnée.

Pourquoi ?

Parce que cela permet de ne faire cette connexion qu'une seule fois, tu ne ballade les identifiants partout dans le code et tu n'auras pas 14 connexion d'ouvertes les unes après les autres (même si, bon réflexe, tu clos la connexion l'ouverture et surement ce qui demande le plus de temps et donc ralentis inutilement le script ;) ).


Je sais que c'est dense, surement mal expliqué, mais si tu te lance dans l'objet autant le faire bien des le départ sur tu va perdre l'utilité du concept ;)

@+

Re: Attribué des données MySQL aux variables de classe

Posté : 04 avr. 2014, 16:17
par Allen_Blocci
Merci moogli pour cette approche complète !! =D>

Cela m'éclaire, ne serait-ce que de savoir que return ne peut-être utiliser qu'une fois...

Je vais potasser ton message et le lien que tu m'indiques, que je n'avais pas trouvé ou pas cliqué dans mes recherches google.

Et je reviendrai sur ce post avec un meilleur code.

Encore merci.

Allen Blocci
http://www.lokazionel.fr

Re: Attribué des données MySQL aux variables de classe

Posté : 07 avr. 2014, 22:08
par Allen_Blocci
Bonjour à tous,

je reviens sur ce post pour vous faire part de mon avancement au cas où cela pourrait aider les débutants comme moi.

En suivant les pistes de Moogli j'ai fini par trouver deux liens très clairs que je vous conseille :

http://jcrozier.developpez.com/tutoriel ... gn-classe/
http://studio.jacksay.com/tutoriaux/php ... l-avec-pdo

Je vous propose ci-dessous un code qui fonctionne :

LE CODE DE LA CLASSE : classe.fiche.php
<?php
   
class Fiche
{
    private $_titre;
    private $_ladate;
    private $_type;

    function __construct()
    
	{
		
	include_once('connexion.php');

$select = $connection->query("SELECT * FROM `biblio`.`Fiche_livre`");

$select->setFetchMode(PDO::FETCH_OBJ);

while( $enregistrement = $select->fetch() )
{
  
  $this->_titre = $enregistrement->Titre;
  $this->_ladate = $enregistrement->Editeur;
  $this->_type = $enregistrement->Type;

}

        
	}

public function Titre()
{
    return $this->_titre;
}

public function Ladate()
{
    return $this->_ladate;
}

public function Type()
{
    return $this->_type;
}

}
?>
LE CODE DE LA CONNEXION A LA BASE : connexion.php
<?php
try {
  $dns = 'mysql:host=localhost;dbname=biblio';
  $utilisateur = 'root';
  $motDePasse = 'root';
  $connection = new PDO( $dns, $utilisateur, $motDePasse );
} catch ( Exception $e ) {
  echo "Connection à MySQL impossible : ", $e->getMessage();
  die();
}
?>

LE CODE POUR UTILISER LA CLASSE : test.classe.php
<?php

include_once('classe.event.php');

$Fiche = new Fiche();

echo $Fiche->Titre();
echo $Fiche->Ladate();
echo $Fiche->Type();
?>	
Le code affichera les trois valeurs du dernier enregistrement de la table.

Mais si je crée une classe fiche dans laquelle je crée des objets livres (titre, editeur...) et que je souhaite afficher toutes les fiches des objets livres de type roman.... ?

Vous me conseillez quelle construction ?

En vous remerciant

Allen Blocci
http://www.lokazionel.fr

Re: Attribué des données MySQL aux variables de classe

Posté : 08 avr. 2014, 00:26
par moogli
Je te conseil de vraiment regarder du côté des motifs de conception comme DAO afin d'éviter ce que tu viens de faire.

Il y a d'un côté les objets qui représente les classes (comme livre ou fiche qui sont des objets réel), d'un autre côté les classes d'accès aux données (DAO) et les classes métiers qui s'occupe d'appliquer les règles métiers (je demande les livres à couverture rouge ou jaune etc.).

Ce n'est vraiment pas recommandé de faire comme ton exemple tu mélange tous dans un objet et casse le modèle objet que tu pourrais obtenir.

Pur ta seconde question il te faut revoir qui contient l'autre.
Est ce qu'une fiche correspond a un ou plusieurs livre(s) ?
Est ce qu'un livre est sur plusieurs fiches ?

Suivant le cas, l'un des objets va contenir un tableau de l'autre.
Et c'est la que la DAO entre en œuvre pour génère cette liste.

@+