JeuWeb - Crée ton jeu par navigateur
[POO] : Connexion Mysql - 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] : Connexion Mysql (/showthread.php?tid=447)

Pages : 1 2


[POO] : Connexion Mysql - Loetheri - 18-11-2006

Je sais que quelqu'un nous a déballé toutes des classes de connexion SQL.
Seulement, j'aurais aimé faire moi-même cette classe.
Avec mes connaissances en Java (et donc en POO), j'ai essayé de faire une classe MySQL.

Si quelqu'un qui s'y connait, pouvait me dire si c'était juste, ce qu'il faudrait améliorer, ce qui est à changer.

Merci

Code PHP :
<?php 
class Mysql {

// Variable de connexion
private static $serveur = "localhost";
private static
$utilisateur = "root";
private static
$motdepasse = "";
private static
$bd = "site";
private
$link;

// Connexion
public function connect(){
$this->$link = mysql_connect(self::$serveur,self::$utilisateur,self::$motdepasse) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
mysql_select_db(self::$bd,$this->link) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

// Déconnexion
public function disconnect() {
mysql_close($this->link) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

// Recherche
public function select($champs, $table, $criteres) {
mysql_query("SELECT ".$champs." FROM ".$table." ".$criteres) or die(this->erreur(mysql_error(),__FILE__,__LINE__);
}

// Insertion
public function insert($table, $valeur) {
mysql_query("INSERT INTO ".$bd." VALUES(".$valeur.")", $this->link) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

// Suprresion
public function delete($table, $id) {
mysql_query("DELETE FROM ".$table." WHERE id=".$id."", $this->link) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

// Mise à jour
public function update($table, $valeur, $id) {
mysql_query("UPDATE ".$table." SET ".$valeur." WHERE id=".$id, $this->link) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

// Vérification
public function verification($table) {
mysql_query("CHECK TABLE ".$table) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

// Erreur
public function erreur($mysql_erreur, $file, $line) {
var
$fichier = "/erreur/".date("Y-m-d").".txt","a+";
if (
is_writable($fichier) {
if ( var
$handle = fopen($fichier,"a+") ) {
$ligne = date("H:i:s")." : ".$file." = (".$line.")".$mysql_erreur;
if (
fwrite($handle,$ligne) ) {
if (
fclose($handle) {
echo
"Le message d'erreur SQL a été reporté";
}else{
echo
"Impossible de fermer le fichier de rapport d'erreur SQL";
exit;
}
}else{
echo
"Impossible d'écrire dans le fichier de rapport d'erreur SQL";
exit;
}
}else{
echo
"Impossible d'ouvrir dans le fichier de rapport d'erreur SQL";
exit;
}
}else{
echo
"Le rapport d'erreur SQL est inaccéssible en écriture";
exit;
}
}


}



RE: [POO] : Connexion Mysql - Klemmth - 18-11-2006

Je vais essayer de faire une réponse la plus constructive possible, en espérant pouvoir t'aider.

Tout d'abord à ta place j'aurai plutot tendance à passer tout ce qui est serveur, utilisateur, mdp, bd en constante, et ensuite à la déclarer en variable ( $serveur = SERVEUR ) par exemple. Je trouve ça plus lisible et plus simple à modifier, mais bon, c'est loin d'être indispensable, il faut l'avouer.

Ensuite je rajouterai un constructeur pour te permettre d'accéder à une autre bdd si besoin est. Comme ceci :
Code PHP :
<?php 
function __construct($param = array())
{
if(isset(
$param['serveur']))
$this->server = $param['serveur'];
if(isset(
$param['utilisateur']))
$this->user = $param['utilisateur'];
if(isset(
$param['motdepasse']))
$this->password = $param['motdepasse'];
if(isset(
$param['db']))
$this->db = $param['db'];
$this->link = false;
}

Aussi un destructeur au cas où tu oublies de fermer la connexion ( on sait jamais ) :
Code PHP :
<?php 
function __destruct()
{
$this->disconnect();
}

Je trouve aussi que tu te restreins trop pour tes requetes "update" et "delete". A ta place je mettrai la fonction comme ça ( idem pour les 2 mais je n'écris que pour l'"update" ) :
Code PHP :
<?php 
public function update($table, $valeur, $condition = '1') {
mysql_query("UPDATE ".$table." SET ".$valeur." WHERE ".$condition, $this->link) or die($this->erreur(mysql_error(), __FILE__, __LINE__);
}

Voilà pour les généralités. Après bien sûr, ton script peut toujours être amélioré, tu peux rajouter une variable pour mémoriser les requêtes effectuées, pour compter leur nombre, tu peux aussi faire en sorte que ton script puisse marcher avec plusieurs types de SQL, etc...

Si tu as des questions n'hésite pas. J'espère t'avoir aidé.


RE: [POO] : Connexion Mysql - gtsoul - 18-11-2006

essaye de t'assurer que le rapport d'erreur remonte sur plusieurs niveaux

ex :
class A {
function a{
//contient une erreur
}
}

class B {
function b{
a = new A();
a->a();
}
}

si ton système d'exception est correct, il va te dire dans un premier temps :
erreur sql, fichier B.class, l 27, erreur dans la fonction b
mais aussi, il va remonter l'erreur :
erreur sql, fichier A.clas, l36, erreur dans la fonction a, puis affichage de la requete préparée

Cela m'arrive de jouer sur plusieurs niveaux d'objet. J'ai des objets métiers (personnage, objet , monstre), des objets sql associés aux objets métiers qui font les accès à la base;
et mon système de combat par exemple, peut appeler un objet métier, qui peut en appeler un autre, qui va appeler un objet sql (requete), qui au final va créer un objet connection-requete.

Si il n'y a pas de remontée des erreurs, à chaque erreur sql, tu auras un message d'erreur à l'endroit même (cad dans ta classe de connection), sans savoir comment cette fonction a été appelée.

donc à tester.


RE: [POO] : Connexion Mysql - joshua - 18-11-2006

Mouhahahaha si tout le monde met la sienne..... je veux pas etre en reste :p
Code PHP :
<?php
/**************************************************
*
* MySql
* Alexandre DUCROCQ 11/08/06
* d'après Pascaltje
*
* Classe PHP d'accès à une base de données MySql
*
* @param dbHost Adresse IP (ou nom logique) du serveur mysql
* @param dbName Nom de la base de données mysql à activer
* @param dbUser Login de l'utilisateur pour la connexion
* @param dbPass Mot de passe de l'utilisateur pour la connexion
* @return TRUE si initialisation connexion ok
*
* @see
*
*************************************************/

// test inclusion correcte
if( !defined('IN_FLUX') )
{
echo
'erreur d inclusion du fichier erreur.class.php';
exit;
}

class
MySql
{

public
$dbHost = ""; // hostname of the MySQL server
public $dbName = ""; // logical database name on that server
public $dbUser = ""; // database authorized user
public $dbPass = ""; // user's password
public $sql_connect_id = 0; // last result of mysql_connect()
public $errorNumber = 0; // last error number
public $errorMessage = ""; // last error message
public $errorLocation = ""; // last error location
// var de resultat
public $sql_resultat ; // ID de résultat
public $sql_num_res ; // Nombre de lignes retournées
// constructor
function __construct($dbHost = "", $dbName = "", $dbUser = "", $dbPass = "")
{

$this->dbHost = $dbHost;
$this->dbName = $dbName;
$this->dbUser = $dbUser;
$this->dbPass = $dbPass;
}

// error handler
function updateError($location)
{
$this->errorNumber = mysql_errno();
$this->errorMessage = mysql_error();
$this->errorLocation = $location;
if(
$this->errorNumber && SHOW_ERROR_MESSAGES)
{
echo(
'<br /><b>'.$this->errorLocation.'</b><br />'.$this->errorMessage);
flush();
}
}

function
connect()
{
if(
$this->sql_connect_id == 0)
{
$this->sql_connect_id = mysql_connect( $this->dbHost, $this->dbUser, $this->dbPass );
if(!
$this->sql_connect_id)
{
$this->updateError('DB::connect()<br />mysql_connect');
return
false;
}
}
return
true;
}

function
logOff()
{
@
mysql_close($this->sql_connect_id) ;
}

/* éxecution de requètes */
function query($query)
{
if(!
$this->connect())
{
return
false;
}
if(!
mysql_select_db($this->dbName, $this->sql_connect_id))
{
$this->updateError('DB::connect()<br />mysql_select_db');
return
false;
}
// indice du resultat
$nb_res = count($this->sql_resultat);
// Exécution de la requète passée en paramètre
$commande = strtoupper(substr(trim($query), 0, 6));
$this->sql_resultat[$nb_res] = mysql_query($query, $this->sql_connect_id) ;
// Met à jour le nombre de lignes affectées par la requète envoyée
if($commande == "SELECT")
$this->sql_num_res[$nb_res] = @mysql_num_rows($this->sql_resultat[$nb_res]) ;
return
$nb_res ;
}

/**************************************************************
* Retourne une ligne de resultat sous différentes formes
*************************************************************/

/* Tableau à indice numériques : $ligne[0]; */
function getRow($nb_res)
{
$ligne = mysql_fetch_row($this->sql_resultat[$nb_res]);
return
$ligne;
}

/* Tableau à indice alphabétique : $ligne["ma_colonne"] ; */
function getArray($nb_res)
{
$ligne = mysql_fetch_array($this->sql_resultat[$nb_res], MYSQL_ASSOC);
return
$ligne;
}

/* Objet : $ligne->ma_colonne ; */
function getObject($nb_res)
{
$ligne = mysql_fetch_object($this->sql_resultat[$nb_res]);
return
$ligne;
}

/**
* fonction qui récupère le premier id dispo
*/
function get_free_id($id,$tbl)
{
$contenu="SELECT ".$id." FROM ".$tbl." ORDER BY ".$id." DESC LIMIT 0,1";
$res = $this->query($contenu);
$table = $this->getObject($res);
return
$table->id+1;
}



}
?>



RE: [POO] : Connexion Mysql - Loetheri - 18-11-2006

Merci de ces quelques réponses.

En faite, je trouve que l'orienté objet est un réel outil. Malheureusement, ce n'est pas l'idée première du créateur de PHP et secondement, c'est qu'il y a assez peu d'explications sur l'orienté objet en PHP. Et quand il y a des explications, elles sont le plus souvent hyper-superficielles.

J'ai essayé de faire une classe Utilisateur. Mais maintenant, je ne sais pas si cela est correcte car je n'ai pas d'idée exacte de comment faire en PHP.

Enfin, bon. Si jamais quelqu'un a le courrage de faire un tutorial plus détail sur la POO, n'hésitez pas :p


RE: [POO] : Connexion Mysql - Plume - 18-11-2006

J'ai déjà réfléchi à la question, le seul soucis c'est que comme tu dis à l'origine PHP n'est pas pensé pour la conception objet. Cependant, c'est un avenir qui semble avoir été adopté pour le futur de PHP. En effet, PHP5 semble démontrer le désir de PHP de s'orienter vers l'objet. En bref, on est trop dans le flou pour aboutir à quelque chose de concret ...


RE: [POO] : Connexion Mysql - Klemmth - 18-11-2006

En effet, maintenant le PHP est en train de prendre la "tournante" POO, tout comme la plupart des autres langages. Donc bien sûr, on en est pas encore au niveau du C# ( qui est 100% orienté objet ), mais il est de plus en plus conseillé de se tourner vers la POO qui permet d'avoir, il faut le reconnaître, un code bien plus flexible et lisible.
Pour ce qui est d'un tutorial plus détaillé sur la POO, ce serait une bonne idée en effet, mais encore faut-il avoir le temps de le faire Wink


RE: [POO] : Connexion Mysql - Loetheri - 19-11-2006

J'ai continué mes différentes classes. Et cela commence à ressembler à quelque chose (ça fonctionne en plus).
Heureusement que j'ai des cours de Java sans quoi, l'approche OO est impossible.

Lorsque je m'y connaitrais plus en POO, je tenterais d'écrire un tutorial sur ce sujet. Mais il faut espérer que j'ai le temps.


RE: [POO] : Connexion Mysql - Plume - 19-11-2006

Pensez vous que la conception d'un site avec une approche OO est possible ? Genre on fait des classes pour le traitement des données, d'autres pour "l'interfaçage graphique" ? Juste en PHP parce que je sais que ça reste jouable avec Java ou C++/C#. Je me demande, car je voudrais savoir si ça vaut le coup que je tente pour mon site ... On pourrait avec utiliser les designs patterns (je sais que c'est bien pratique, mais j'ai beaucoup de mal à en saisir le concept ...)


RE: [POO] : Connexion Mysql - joshua - 19-11-2006

euuuh... tu penses que je fais quoi, damen? Big Grin