POO + base de donées

Mammouth du PHP | 1029 Messages

14 nov. 2005, 12:13

Bonjour, j'essaie de mettre à jour mon projet et je veux le faire en OO, malheureusement dés la première class, je n'y arrive pas.

donc je fais ma class
<?php
class Inscription {
	
function participants(){
	
	echo "<TABLE border = 0 >";
	echo "<H3><B>Participants  <HR></B> </H3><br />";

	echo "<TR><TD><P>Localit&eacute; </p></TD><TD>";

/********************************************************************************************************

	Bout de code pour le choix automatique de la commune etc...

********************************************************************************************************/
// ouverture de la base sqlite


	echo "<select name=\"Localite\">
    <option value=\"-1\">-  Choisissez une localit&eacute; -  </option>";
	// recuperation des valeurs present sur la table region afin d'en faire un menu deroulant
	$result = sqlite_query("SELECT DISTINCT  localite FROM Code_postal ORDER BY localite ASC ",$db);
	while ($row = sqlite_fetch_array($result))
	{
		$valeur = $row["localite"];
		echo($valeur == $reg?"<option selected>".$valeur:"<option>".$valeur);
	}
	//fin du scrip php utile afin de faire le menu deroulant
	echo "</SELECT>";
	echo "</TD>";
	echo "</tr>";
	echo "</TABLE>";
	}

}


?>
Et puis je l'instancie
$fiche = new Inscription();

$fiche->participants();
Jusque le nickel, sauf que je n'arrive pas à acceder à ma base de données.

J'ai beau mettre
include ("Base/sqliteConnect.php")
dans ma page ou je déclare la class : marche pas
dans ma page ou j'instancie l'objet : marche pas
dans la page index d'où tout part : marche pas.

Si vous avez une idée merci pour moi

MaitrePylos
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 1029 Messages

14 nov. 2005, 13:03

Par contre en mettant l'include dans ma fonction cela fonctionne!
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 70 Messages

14 nov. 2005, 14:02

Imagine un restaurant avec une cuisine et une salle. Pour que la salle communique à la cuisine ce qui est commandé et que la cuisine communique les plats préparés il faut un passe-plat. Dans ton exemple il n'y a ni passe-plat ni porte. Si ça marche quand tu inclus le fichier directement dans la fonction c'est un peu comme si tu avais la cuisine dans la salle, mais en objet ça n'est pas la bonne solution.

Mammouth du PHP | 1029 Messages

14 nov. 2005, 14:14

Est-ce que si je créer une class connection et que je l'instancie ,est ce que cela fonctionneras?
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 nov. 2005, 14:15

C'est cette classe de connexion qui va te servir de passe plat ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 70 Messages

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.

Mammouth du PHP | 1029 Messages

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?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 70 Messages

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...

Eléphant du PHP | 70 Messages

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 ?

Mammouth du PHP | 1029 Messages

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?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 70 Messages

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".

Mammouth du PHP | 1029 Messages

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
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 70 Messages

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.

Mammouth du PHP | 1029 Messages

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.
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 1029 Messages

22 nov. 2005, 17:16

J'essaye aussi de passer en parametre le connection, mais cela ne fonctione pas
$fiche->participants($sqlite->__construct());
L'expérience est la somme de toutes nos erreurs.