8791 sujets

Développement web côté serveur, CMS

Salut ^^

Bon, ça y est, à force qu'on me dise que c'est mieux et comme je refais une v2 qui va me pousser à presque tout refaire, autant se lancer...

A part que...si trouver comment construire mes classes, ça devrait être faisable, je cale sur des bêtises...

2 pour débuter pour être précise...

1) une question de syntaxe...

Issus de mysqli::query
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* Vérification de la connexion */
if (mysqli->connect_errno) {
    printf("Échec de la connexion : %s\n", mysqli->connect_error);
    exit();
}


Issu de mysqli::__construct
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

/*
 * Ceci est le style POO "officiel"
 * MAIS $connect_error était erroné jusqu'en PHP 5.2.9 et 5.3.0.
 */
if ($mysqli->connect_error) {
    die('Erreur de connexion (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}


Quel est le sens du $ devant mysqli->connect_errno ? Pourquoi il n'apparaît pas dans le premier code et qu'il apparaît dans le second ?

Smiley sweatdrop


2) Comment on organise ses classes quand les valeurs des attributs doivent être récupéré du mysql ? Comment on fait ça en pratique ? (sachant que j'aurais une fonction sql_connect(); sql_query($requete) et une fonction sql_close() ) ?



*Je me doute que ça semble des questions stupides, mais faut bien démarrer par quelque chose...*
Modifié par Lothindil (14 Aug 2012 - 16:19)
Lothindil a écrit :

Quel est le sens du $ devant mysqli->connect_errno ? Pourquoi il n'apparaît pas dans le premier code et qu'il apparaît dans le second ?


C'est une erreur dans le premier code.

Lothindil a écrit :

2) Comment on organise ses classes quand les valeurs des attributs doivent être récupéré du mysql ? Comment on fait ça en pratique ? (sachant que j'aurais une fonction sql_connect(); sql_query($requete) et une fonction sql_close() ) ?


J'ai pas compris ta question.
Pour le premier, je pouvais encore chercher longtemps ^^


Pour le second, c'est simple, je vois des tas d'exemples de classes où ils fixent les attributs d'une classe ainsi :

class personnage{
	private $_force = 6;
	private $_experience = 0;
	private $_vie = 40;
}


Or, dans mon cas, ces attributs sont forcément des données issues de mes tables. Et je me demandais si y avait une bonne manière d'écrire ou d'organiser son code pour ce genre de cas, tout simplement.
Modifié par Lothindil (14 Aug 2012 - 16:23)
2)

Tu veux parler d'une régle de nommage pour les attributs d'une classe issue d'une bdd ?
Modifié par perfectionniste (14 Aug 2012 - 16:31)
D'une manière globale d'organiser la classe avec un accès bdd plutôt... (à la limite les conventions, m'en fous un peu pour l'instant) ^^

Genre est-ce que faire un truc dans le genre est possible/clair/propre ?

class personnage($id){
	$resultat=sql->requete_sql("select * from pj where ID=".$id."");
	
	private $force=$resultat->force;
	private $experience=$resultat->experience;
	private $vie=$resultat->PV;

}


sachant que mon "sql->requete_sql" vient d'un truc qui ressemble vaguement à ça pour l'instant :


class sql
{
	public function connect_sql()
	{
		switch($_SERVER['SERVER_NAME'])
		{
			case "www.yuimen.com/v2":
				$host= /*ip*/
				$user= /*login*/
				$pass= /*pass*/
				$db = /*db*/
			break;
		}
		$mysqli=new mysqli($host,$user,$pass,$db);
  		if ($mysqli->connect_error) {
			die('Erreur de connexion (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
		}
	};
	public function requete_sql($requete)
	{
		$resultat= $mysqli->query($requete);
		return $resultat;
	};
	public function close_sql()
	{
		$mysqli->close;
	};
}



(en même temps, si y a des trucs louches dans le dernier bout de code dites-le, il est pas encore testé ^^)



edit : correction d'une faute (un tiret manquant) et ajout de la fonction pour fermer la connexion.

edit 2 : OK, je vois une piste par le constructeur que je vais devoir creuser... ça va compliquer...


edit 3 : 2ème essai Smiley rolleyes


class personnage{
	private $force;
	private $experience;
	private $vie;
	
	public function __construct($id){
		$resultat=sql->requete_sql("select * from pj where ID=".$id."");
	
		$this->force=$resultat->force;
		$this->experience=$resultat->experience;
		$this->vie=$resultat->PV;
	}
}


Ca marcherait ainsi ? Smiley murf
Modifié par Lothindil (14 Aug 2012 - 16:54)
Hello,

J'ai pas regardé le tout en détail, mais selon moi le mieux c'est d'utiliser l'extension PDO pour tes bases de données.

Si tu souhaites apprendre les bases de la POO, il y a des très bon tutoriaux sur www.siteduzero.com. Car en ce moment, tes questions sont peu être trop vagues.

Bye !
Tes champs dans ta bdd devraient avoir le même nom que dans ta classe. Après un simple foreach permet de peupler tes propriétés. Tu devrais passer ton objet SQL au constructeur pour rendre ta classe personnage indépendante de ta classe sql. Personnellement je n'aurais pas choisi de charger le personnage depuis le constructeur mais depuis une méthode, comme ça tu peux aussi avoir une méthode pour créer un personnage.

Enfin j'aurais fait deux classes, un controlleur (ta classe personnage) et un modèle (PersonnageModel) qui serait chargé de charger/sauver/formater les données de tes persos.


class Personnage {

  private $sql;

  private $force;
  private $experience;
  private $vie;
	
  public function __construct(Sql $sql) {
    $this->sql = $sql;
  }

  public function chargerPersonnage($id) {
    $resultat = $this->sql->requete_sql("select * from pj where ID=".$id."");
	
    foreach ($resultat as $k => $v) {
      $this->$k = $v;
    }

    unset($resultat);
  }

  public function creerPersonnage($data) {
    return $this->sql->insere($data);
  }
}

Modifié par jb_gfx (15 Aug 2012 - 01:33)
@Anymah : Je veux pas utiliser de PDO, j'ai le droit non ? J'utilise le lot de fonction mysqli à la place ^^

Et pour le tutoriel, je l'ai suivi, j'ai l'impression de l'avoir capté, mais il me paraît flou et j'ai du mal à le transposer à mon cas, d'où mes questions qui sont un véritable tâtonnement (en attendant que j'ai reçu le livre sur la POO d'Eyrolles).

@jb_gfx :Je peux multiplier les classes, c'est pas un problème.

Par contre, je comprends pas ce que tu fais dans le construct.

edit :

changement complet dans ma class sql ^^ je pense que je tiens un bon truc :

class Sql
{
	private static $_host= /*ip*/;
	private static $_user= /*user*/;
	private static $_pass= /*pass*/;
	private static $_db=/*db*/;
	
	public static function connect_sql()
	{
		$mysqli=new mysqli(self::$_host,self::$_user,self::$_pass,self::$_db);
  		if ($mysqli->connect_error) {
			die('Erreur de connexion (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
		}
	};
	public static function requete_sql($requete)
	{
		$resultat= $mysqli->query($requete);
		return $resultat;
	};
	public static function close_sql()
	{
		$mysqli->close;
	}
}


Ca me paraît pas trop mal ce coup-ci... Smiley murf

et mes appels deviennent :

Sql::connect_sql();
/*bout de code*/
Sql::close_sql();



edit 2 : c'est bon, j'ai compris le principe de ton construct ! Smiley langue
Modifié par Lothindil (16 Aug 2012 - 12:56)

private static $_host= "91.XXX.XX.XX";
private static $_user= "xxxx";
private static $_pass= "***********";
private static $_db="XXXX";

Tu viens de donner le mot de passe de ta base + le login etc.... ou je me trompe ?
Su4p a écrit :

private static $_host= "91.XXX.XX.XX";
private static $_user= "xxxx";
private static $_pass= "***********";
private static $_db="XXXX";

Tu viens de donner le mot de passe de ta base + le login etc.... ou je me trompe ?

Euh ouais... Smiley confus

(arg, la bêtise, j'ai pensé à le changer partout ailleurs...)

(en même temps, ça n'a pas d'importance, c'est une partie de test actuellement vide donc bon... Puis le pass est changé depuis +/-5 minutes^^)
Modifié par Lothindil (16 Aug 2012 - 12:56)
paolo a écrit :
Change vite tes identifiants, on peut se connecter à ta base.

C'est fait ^^

*mais quelle @#@#@#@#@, quand même Smiley sweatdrop *
ça marche... Une petite classe simple (enfin 2, une pour la bdd et une d'affichage), un fichier qui appelle les classes et ma classe sql...

Finalement, l'orienté objet, c'est marrant. Smiley murf