JeuWeb - Crée ton jeu par navigateur
POO et DB - 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 : POO et DB (/showthread.php?tid=4598)

Pages : 1 2 3 4 5 6 7


RE: POO et DB - NicoMSEvent - 18-04-2010

excellentes réponses Zamentur, je n'aurais pas mieux expliqué Smile

Zamentur a écrit :Donc si tu unset() chaque référence quand tu n'en a plus besoin tu détruit l'objet.
Peut être aussi est il possible de détruire directement en appelant le destructeur.

Le unset d'un objet va se servir du destructeur. (met un echo dans le destructeur, tu verras le comportement Wink )
Je me sert beaucoup du __tostring
pour n'importe que objet, ça me permet de faire un "echo $mon_objet"; et ça m'imprime l'état de l'objet, ou ce que j'ai envie (pour ma db, je fais ça en fin de script, et ça me retourne le nombre de requêtes de la page)

function __tostring(){
return $this->link_db?('Connecte a la DB. Nbreq='.self::$nb_req):'Pas connecte';
}



RE: POO et DB - Kihmé - 18-04-2010

Merci pour les réponses, en gros avec une instanciation de connexion je peux avoir plusieurs connections (une connexion par utilisateur utilisant toutes la même instanciation)

Pour les objets donc ils persistent le temps de l'exécution du script, donc leur durée de vie est contenu entre mon ouverture <?php et ma fermeture ?> ? Je demande ça car ayant fait de la poo en java et c# ça me parait étrange.

Voilà sinon avec ça je pense que je n'aurais plus qu'à me lancer


RE: POO et DB - NicoMSEvent - 18-04-2010

en fait, ton système existe juste le temps de chargement de la page. (même si tu as plusieurs scripts php dans ta page)
Ce que tu charges comme objets pour une page (ou un utilisateur) est indépendant des autres pages (ou utilisateurs).

Ton singleton (connexion db) ne restera ouverte et instancié que le temps de vie de ta page, et que pour ta page.


RE: POO et DB - Ter Rowan - 18-04-2010

y a une nuance par rapport à java, on avait du mal à communiquer avec mes collègues javaistes et moi avant qu'on ne comprenne une différence, alors je te l'expose :

a priori, l'instanciation singleton en java est unique quelque soit les utilisateurs connectés (je crois qu on peut cependant gérer des singletons par thread ou un truc comme ça)

en php, ça ne marche pas comme ça, en paraphrasant nico, ton utilisateur lance un script, ce qui se passe dedans n'est que pour lui.

==> Si tu as 10 connectés, en java 1 singleton
==> Si tu as 10 connectés, en php 10 singletons

L'intérêt du singleton php est un peu moindre, mais il évite au moins d'avoir n connexions lorsque tu inclus n script autonomes ayant chacun besoin du dit singleton.

enfin on en était arrivé là de nos discussions, ça se trouve c'est une grossse bêtise que je poste ^^


RE: POO et DB - NicoMSEvent - 18-04-2010

chaque page délivrée par le serveur apache est un thread.
Donc, il est normal que l'utilisateur ne voit que les objets instanciés pour lui.
Pour faire communiquer les utilisateurs entre eux, il faut passer par la DB, par de fichiers, pas des sockets... ou ce que tu veux,
mais tout n'est pas accessible a n'importe qui par n'importe quel moyen Wink

Comme les objets ne voient que leur méthodes(fonctions) et attributs, et que conceptuellement les variables globales sont proscrites, le plus propre et naturel est de passer par un singleton, pour la connexion a la DB (c'est ce que j'en tire comme conclusion apres 3 mois de pratique de la POO en PHP) Smile


RE: POO et DB - Kihmé - 18-04-2010

et bien merci beaucoup pour toutes ces réponses, je vois beaucoup mieux, je pense finir mes modélisations objets ce soir, j'ai mon analyse, mon interface et ma bdd de faites donc j'attaque le code. Je pense être bien armé du coup.


RE: POO et DB - Kihmé - 29-04-2010

J'en appelle encore à votre aide. Je suis en train de faire ma classe de connexion, je me suis inspiré de celle de Nico en très grande partie, mais j'ai un soucis sur la création de mon instance, je n'ai peut être pas compris comment faire la différence entre PDO et la classe que j'ai créée, je sais pas, je m'embrouille là donc si quelqu'un peut jeter un coup d'oeil.
Merci

message d'erreur :
Code :
Notice: Undefined variable: hostname in C:\wamp\www\Glyndwiz\connection.php  on line 22

Notice: Undefined variable: login in C:\wamp\www\Glyndwiz\connection.php on line 22

Notice: Undefined variable: password in C:\wamp\www\Glyndwiz\connection.php on line 22
Connection error : invalid data source name

ma classe connection :
Code :
<?php
Class Connection
{
    private static $instance;
    private $hostname;
    private $login;
    private $passWord;
    
    private function __construct()
    {
        $hostname="mysql:host=localhost;dbname=project";
        $login="root";
        $password="";
    }
    
    public static function getInstanceConnection()
    {
        if(null === self::$instance)
        {
            try
            {
                self::$instance = new PDO($hostname, $login, $password);
            }
            catch (PDOException $exce)
            {
                die("Connection error : " . $exce->getMessage() );
            }
        }
        return self::$instance;
    }
}
?>

mon contrôleur :
Code :
<?php
    include("connection.php");
    $user = $_POST['user'];
    $password = $_POST['password'];
    
    $connect=connection::getInstanceConnection();
    $req="select count(id) from player where name='Florent';";
    $ans=$connect->query($req);
    if($ans==1)
    {
        echo'Row found';
    }
    else
    {
        echo'Row not found';
    }
    $connect=Null;
    
    
?>



RE: POO et DB - Ter Rowan - 29-04-2010

edit deux fois je dis que des conneries ^^


RE: POO et DB - christouphe - 29-04-2010

je te passe la mienne comme exemple:

Code PHP :
<?php

class database {

private
$_dbDns;
private
$_dbUser;
private
$_dbPassword;
private
$_connexion;
private
$_statement;
private static
$_instance = null;

/**
* \brief Accesseur à l'objet connecteur de la base de données..
*
* \return _instance l'e nouveau serveur'instance unique de l'objet.
*/
public static function getInstance()
{
if(
is_null(self::$_instance) ) {
self::$_instance = new self;
}
return
self::$_instance;
}

private function
__construct() {}
private function
__clone() {}

/*
* Destructeur d'objet
*/
public function __destruct() {
}

/**
* \brief Modificateur du serveur de la base de données.
*
* \param dbDns le nouveau serveur.
*/
public function setDbDns($dbDns) {
$this->_dbDns = $dbDns;
}

/**
* \brief Modificateur de l'utilisateur de la base de données.
*
* \param dbUser le nouvel utilisateur.
*/
public function setDbUser($dbUser) {
$this->_dbUser = $dbUser;
}

/**
* \brief Modificateur du mot de passe de la base de données.
*
* \param dbPassword le nouveau mot de passe.
*/
public function setDbPassword($dbPassword) {
$this->_dbPassword = $dbPassword;
}

/**
* \brief Accesseur à la connexion de l'extérieur.
*
* \return la connexion à la base de données.
*/
public function getConnexion() {
return
self::$_instance -> _connexion;
}

/**
* \brief Méthode préparant la requête envoyée.
*
* \param requete la requête à préparer.
*/
public function prepareRequete($requete) {
self::$_instance -> _statement = self::$_instance -> _connexion -> prepare($requete);
}

/**
* \brief Méthode exécutant la requête préparée par prepareRequete()
*
* \return booléen
*/
public function executeRequete() {
if (!
self::$_instance -> _statement -> execute()) {
return
false;
} else {
return
true;
}
}

/**
* \brief Méthode retournant un tableau des résultats de la requête
*
* \return Le tableau de résultat
*/
public function getTableauResultat() {
return
self::$_instance -> _statement -> fetchAll();
}

/**
* \brief Créé la connexion à la base de données
*/
public function connexion() {
self::$_instance -> _connexion = new PDO(self::$_instance -> _dbDns,self::$_instance -> _dbUser,self::$_instance -> _dbPassword);
self::$_instance -> _connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

/**
* \brief Ferme la connexion à la base de données
*/
public function closeConnexion() {
self::$_instance -> _connexion = null;
}

et un exemple d'utilisation:

Code PHP :
<?php
$dns
= 'mysql:dbname=monjeu;host=127.0.0.1';
$user = 'root';
$password = 'root';

$oPdo = database::getInstance(); // avec singleton
$oPdo -> setDbDns($dns);
$oPdo -> setDbUser($user);
$oPdo -> setDbPassword($password);

$oPdo -> connexion();

$req = "SELECT id FROM table";
$oPdo -> prepareRequete($req);
if (!
$oPdo -> executeRequete()) {
echo
"ERREUR";
} else {
$tab = $oPdo -> getTableauResultat();
print_r($tab,true);
}



RE: POO et DB - Ter Rowan - 29-04-2010

tu ne construis jamais ta classe telle que ton code est fait puisque personne n'appelle le constructeur du coup tu n'initialises jamais les données de la classe

d'ailleurs les données de la classe ne s'appelle pas par $toto mais $this->toto ou self::$toto c'est ce que dit tes warning il ne reconnait pas les variables passées en paramètre de new pdo