Page 1 sur 1

Probleme: Passage progressif de mysql à mysqli POO

Posté : 28 nov. 2013, 12:12
par Anacronox
Bonjour à tous, après moult recherche sur le net (je ne doit pas caresser google dans le bon sens...) je ne trouve pas de réponse à mon problème.

Sur un gros projet sur lequel je travail, celui-ci utilise les fonctions procédurales de type Mysql_xxx et je voudrais passer vers le style orienté objet avec Mysqli.

Le problème, c'est que le projet est gros et je ne peut pas faire la conversion d'un coup. Il faudrait dans un premier temps continuer le développement du projet en POO Mysqli tout en migrant petit à petit les fonctions Mysql_xxx vers Mysqli POO.

Je cherche actuellement des solutions de mon coté et l'idée serai d'utiliser une classe qui simule mysqli tout en utilisant Mysql_xxx le temps de modifier l'intégralitée du code.

En gros au lieu de faire:
$db = new mysqli(HOST,USER,PASSWORD,DBNAME);
if ($db->connect_error){ die('Connexion error'); }
$db->query('ma requête ') ;
On ferait

$ConnexionSQL=@mysql_connect(HOST,USER,PASSWORD,DBNAME); //

if (!$ConnexionSQL){ die('Connexion error'); }

$db = new mysqli_simu($ConnexionSQL);
$db->query('ma requête ') ;
Existe t'il se genre de classe? Sinon je vais la créer (au passage je la posterais ici) mais si un équivalent existe ce serai un peut bête...

Voilà je suis preneur de toutes idées me permettant d'avancer.
merci à vous.

Re: Probleme: Passage progressif de mysql à mysqli POO

Posté : 28 nov. 2013, 20:29
par Anacronox
Bon ben voici une partie des 2 classes (évolution au fil des besoins)

désolé pour le code non commenté et un peut cracra mais c'est pour une utilisation temporaire...
class mysqli_simu{
	
	protected $link;
	
	public $connect_error;
	public $affected_rows;
	public $insert_id;
	public $error;
	
	function __CONSTRUCT($link){
		if($link){
			$this->link=$link;
			$connect_error=false;	
		}
		else
		{
			$connect_error=true;	
		}
	}
	
   function real_escape_string($var){
	   if(function_exists('ProtectionBDD'))
	   {
		   return ProtectionBDD($var,$this->link); // utilise un fonction perso spécial qui analyse la configuration php avant de faire mysql_real_escape_string()
	   }
	   else
	   {
		   return mysql_real_escape_string($var,$this->link);
	   }
	   
   }
	
	function query($query){
		$result=mysql_query($query,$this->link);
		if($result)
		{
			$this->affected_rows = mysql_affected_rows($this->link);
			$this->insert_id = mysql_insert_id($this->link);
			$this->error = '';
			return new mysqli_simu_query($result);
		}
		else
		{
			$this->affected_rows = -1;
			$this->error = mysql_error($this->link);
			return false;	
		}
	}
	

}


class mysqli_simu_query{
	protected $result;
	public $num_rows;
	
	function __CONSTRUCT($result){
		$this->result=$result;
		$this->num_rows = @mysql_num_rows($result); // provoque une erreur notice lorsque la requête n'est pas de type SELECT
	}
	function __DESTRUCT() {
        mysql_free_result($this->result);
    }
	
	function fetch_assoc(){
		return mysql_fetch_assoc($this->result);
	}
	function fetch_array(){
		return mysql_fetch_array($this->result);
	}
}
Voilà. Et pour l'utiliser c'est tout simple:
/* $ConnexionSQL=@mysql_connect(HOST,USER,PASSWORD,DBNAME); //
if (!$ConnexionSQL){ die('Connexion error'); } */

$mysqli = new mysqli_simu($ConnexionSQL); //$ConnexionSQL étant votre connection ouverte avec  mysql_connect(HOST,USER,PASSWORD,DBNAME)
$Result = $mysqli->query('ma requête SELECT ou autre ') ;
/*
ce qui est utilisable:
$mysqli->error
$mysqli->real_escape_string($var)
$mysqli->insert_id
$Result->num_rows 
$Result->fetch_assoc();
$Result->fetch_array();
*/
Bon cette classe ne gere pas grand chose pour l'instant mais bon...

Voilà je suis preneur de toutes idées me permettant d'avancer Ou si il existe d'autre solution que cette machine a gaz je suis preneur
@++

Re: Probleme: Passage progressif de mysql à mysqli POO

Posté : 28 nov. 2013, 22:59
par moogli
salut,

première chose qui me viens : quel intérêt de faire une classe pour remplacer le reste ?
il faudra bien que tu remplace cette classe par mysqli a moins que tu ne garde la class wrapper ?
qui ne servira a rien.

si tel est le but, il faut que tu colle le plus possible à la signature de mysqli mais aussi mysqli_result car il faut penser que le jeux de résultat est un objet et pas une ressource comme avec mysql etc etc.

pourquoi ne pas simplement utiliser direction mysqli sur les nouveaux dev ? (quitte a ouvrir un connexion mysqli et pas mysql).
se sera plus simple :)


@+

Re: Probleme: Passage progressif de mysql à mysqli POO

Posté : 29 nov. 2013, 10:43
par Anacronox
Merci pour ta réponse moogli :D
quel intérêt de faire une classe pour remplacer le reste ?
Je veut éviter d'ouvrir une connexion mysqli en plus de mysql pour des raisons de ressources de la base de donnée (mais si au final je n'ai pas le choix...)
Et puis je ne sais pas pourquoi mais je pensais (a cause de ce que j'avais lu sur le net probablement) que l'on ne pouvais pas mélangé les 2, mais vu que je veut éviter d'ouvrir plusieurs connections ça revient au même

Cependant tu à peut être raison... vu que c'est sensé être temporaire pourquoi ne pas tout simplement ouvrir une connexion mysqli supplémentaire

sinon pour passer de ma classe au vrai mysqli il me sufit de faire:
$mysqli=new mysqli_simu($ConnexionSQL);// je supprime cette ligne
$mysqli= new mysqli(HOST,USER,PASSWORD,BDNAME);// et je la remplace par celle-ci
pourquoi ne pas simplement utiliser direction mysqli sur les nouveaux dev ? (quitte a ouvrir une connexion mysqli et pas mysql).
à cause de la structure des scripts: en gros : c'est un seul fichier qui charge tout le reste (identification, autorisations, pages, plugins etc...) du coup la connexion se fait en début de fichier... sauf pour tout ce qui est ajax.

Re: [RESOLU] Probleme: Passage progressif de mysql à mysqli

Posté : 29 nov. 2013, 16:08
par moogli
donc franchement, qui a faire quelque chose, je ferais une truc simple

dans le fichier qui créer la connexion mysql tu ajoute une liste (tableau) des pages qui utilise mysqli et si tu est sur cette page tu créer la connexion mysqli.
du coup la connexion en double ne sera que sur les pages qui en ont besoin.
en plus tu ne perd le fonctionnement des bouts de code que tu as oublié mais qui utilise la base ;)

Au fur et a mesure du changement d'extension tu inverse la vapeur et la liste c'est pour les pages qui auront besoin de la connexion myslq et pas de mysqli (et donc mysqli par défaut) ;)

l'avantage c'est que tu touche à rien.
tu perds pas de temps a créer une classe similaire à mysqli.

effectivement tu as deux ressources qui cohabite mais est ce genant.

quand au deux extension, perso j'ai les deux en même temps et cela ne semble pas poser de problème (au pire un test simple et rapide te le montrera ;) ).


@+

Re: [RESOLU] Probleme: Passage progressif de mysql à mysqli

Posté : 29 nov. 2013, 16:46
par Anacronox
Merci pour ta réponse

Je vais compiler toutes ces infos et voir ce qui en sort, je vais aller au plus simple et fiable je pense.

En tout cas merci, tu ma donné quelques pistes auxquelles je n'avais pas pensé. :) reste maintenant à faire au mieux avec ce que j'ai.

J'ai mis ce topic en résolu.