POO + base de donées

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : POO + base de donées

par Maitrepylos » 23 nov. 2005, 11:00

Merci, mais j'ai trouvé, ce que j'avais pas compris :oops:

Ceci fonctionne
$fiche($sqlite->connectsqlite());
mais il aurais fallu que dans ma class, je mette un parametre pour recevoir cette connection.

Maintenant j'ai compris.

Merci de votre aide :lol:

par jeff » 22 nov. 2005, 17:28

et comme ca
$sqlite = new sqliteconnect();
$sqlite->connectsqlite();
$fiche = new Inscription($sqlite);
$fiche->participants
une autre alternative serait de faire comme ceci
$sqlite = new sqliteconnect();
$sqlite->connectsqlite();
$fiche = new Inscription();
$fiche->setInscription($sqlite->getInscription());
ceci te peremet d'avoir la classe inscriptio indepandante de Sqlite

par Maitrepylos » 22 nov. 2005, 17:24

Pas mieux :cry:

par jeff » 22 nov. 2005, 17:19

ca serait plutot comme ceci
$sqlite= new Sqlit(SERVEUR,LOGIN,PASS,BASE);
$fiche->participants($sqlite);

par Maitrepylos » 22 nov. 2005, 17:16

J'essaye aussi de passer en parametre le connection, mais cela ne fonctione pas
$fiche->participants($sqlite->__construct());

par Maitrepylos » 22 nov. 2005, 11:50

Ok, désolé mais j'étais absent, donc je reviens avec ma question, je comprend bquand dois-je instien la class connection, mais quand dois-je instancié cet objet pour avoir une connection.

J'ai beau le retourner dans tous les sens, seul le fait de mettre une connection dans ma class inscription(premier post) fonctionne.

Apparement une commande sql ammener par un objet ne fonctionne pas, là je rame sec.

Merci de votre aide.

par Liquid » 14 nov. 2005, 17:26

Soit la classe Connexion :
class Connexion{
  private $connexion = null;
  public function __construct($host, $user, $pwd){
    $this->connexion = mysql_connect($host, $user, $pwd);
  }
  public function getConnexion(){
    return $this->connexion;
  }
  public function close(){
    mysql_close($this->connexion);
  }
}
Soit la classe abstraite Query :
abstract class AbstractQuery{
  private $connexion = null;
  protected function __construct($connexion){
    $this->connexion = $connexion;
  }
  public function getConnexion(){
    return $this->connexion; // Retourne la connexion sur laquelle la requête a été lancée.
  }
  public abstract function execute(); // Retourne un résultat [i]mixed[/i] (mauvaise idée, c'est pour l'exemple)
}
Soit une classe concrète UserListQuery qui fait un travail précis :
class UserListQuery extends AbstractQuery{
  public function __construct($connexion){
    parent::__construct($connexion);
  }
  public function execute(){
    $userList = array();
    $query = mysql_query("SELECT * FROM user", $this->connexion->getConnexion());
    // Peupler le tableau [i]etc[/i]
    return $userList;
  }
}
C'est archi-simplifié mais le principe est là. Et toujours selon le principe tu devrais avoir des classes spécialisées dans ce qui est affichage (HTML) contrairement à ton exemple ou la requête et l'affichage sont mélangés.

par Maitrepylos » 14 nov. 2005, 16:42

Je pense avoir compris les bases de la POO, mais de fait je suis plus procèdurier.

Dans ton exemple je bloque ici
3 - Passer l'objet connexion à l'objet requête

par Liquid » 14 nov. 2005, 16:19

1 - Créer objet connexion
2 - Créer objet requête
3 - Passer l'objet connexion à l'objet requête
4 - Appeler une méthode de l'objet requête
5 - Dans cette méthode, exécuter la requête en utilisant l'objet connexion qui a été passé à la classe (voir getConnexion() ci-dessous)

Pour faire une parenthèse sur l'encapsulation, le champ "identifiant de connexion" de la classe Connexion ne doit pas être public mais privé avec une méthode getConnexion() qui retourne connexion :
class Connexion{
  private $connexion = null;
  // Établir la connexion dans le constructeur
  public function getConnexion(){
    return $this->connexion;
  }
}
Clémenceau a dit : "Allons doucement, nous sommes pressés".

par Maitrepylos » 14 nov. 2005, 16:03

Bon alors avec l'objet de connection, tous ce qui est de l'ordre de code sql en dehors d'un objet cela fonctionne bien.

Mais si mon code sql se trouve dans un objet, alors cela ne fonctione pas, est ce que je dois créer un object connect dans mon objet participants?

par Liquid » 14 nov. 2005, 16:02

Il faut que tu t'intéresses à différents concepts si tu vaux aller plus loin :

- Classes, classes abstraites, interfaces
- Héritage
- Encapsulation
- Polymorphisme
- Référence
etc

Tu voir du côté du site "Comment ça marche ?" pour une brève description des concepts clef de la POO.

Tu utilises bien PHP 5 ?

par Liquid » 14 nov. 2005, 15:56

Il faut passer la Cuisine à la Salle. Quand la Salle a besoin d'un plat, elle se sert de sa cuisine pour utiliser le passe-plat.

Quittons la métaphore :)

Tu as un objet de type Connexion que tu dois "passer" là où tu as besoin de faire des requêtes. La classe qui fait des requêtes "se sert" de l'objet Connexion passé - par exemple lors de la construction - pour appeler la méthode retournant la connexion...

par Maitrepylos » 14 nov. 2005, 15:19

D'accord mais je dois me planter quelque part:

J'ai donc créer un class sqliteconncet
class sqliteconnect {
public $db;
	function connectsqlite () {
	$db = sqlite_open('Sqlite/Alpha.sqlite');
	}
Puis j'instancie le tout
$sqlite = new sqliteconnect();
$sqlite->connectsqlite();
$fiche = new Inscription();
$fiche->participants
j'ai donc bien un objet de connection mais cela ne marche pas, il y a quelque chôse que je dois pas comprendre?

par Liquid » 14 nov. 2005, 14:26

Il y a plein de façons de voir le problème. En voilà une histoire de bien comprendre la communication entre classes.

Tu as une Cuisine et une Salle. Pour faire simple nous ne créons pas de Restaurant.
La Salle doit pouvoir se référer à la Cuisine tout le temps de son existence. Quand la Salle a besoin d'un plat elle va utiliser passeMoiLePlat qui se trouve dans la Cuisine.

par zeus » 14 nov. 2005, 14:15

C'est cette classe de connexion qui va te servir de passe plat ;)