8141 visites

Fonctions pour PDO

dimanche 1er juillet 2018 (), par Vader[FR]

PDO est une couche d’abstraction en PHP permettant d’adresser une base de données indépendamment de son type (MySQL, PostGres, Oracle...)
Par sécurité, il est préférable de faire des requêtes paramétrées afin d’éviter l’injection SQL.
Le contrecoup, c’est le rajout de code qui devient plus long à écrire.

Le code étant toujours le même, il est toutefois possible de le simplifier en créant une fonction simple qu’il suffira d’appeler.

Cette première fonction permet de préparer et exécuter une requête, laquelle peut être paramétrée, et dont le résultat pourra être :

  • plusieurs lignes, traitées ensuite dans une boucle foreach
  • un nombre de ligne modifié

Elle effectue donc un prepare, puis bindValue pour 0-n paramètres, puis un execute, et renvoie l’objet requête PDO.
les paramètres de la requêtes sont fournis dans un tableau qui commence à 1 (de préférence) ou zéro
la requête doit donc avoir " ?" en paramètre(s) afin de pouvoir les affecter depuis un tableau par indice, plus facilement traitable. voir l’exemple plus bas

function prepexec($rek,$params,$db){
	if (isset($params[0])){
		$debut=0;
		$correc=1;
		$fin=sizeof($params)-1;
	}else{
		$debut=1;
		$correc=0;
		$fin=sizeof($params);
	}
	$rk=$db->prepare($rek);
	// si tableau param vide, pas de bindValue => fonction unique prepare avec/sans param + exec
	for ($i=$debut;$i<=$fin;$i++){
		$typ_param=PDO::PARAM_STR;// PAR DEFAUT
		$param=$params[($i+$correc)];
		if (preg_match("/[\w]+/",$param)){ $typ_param=PDO::PARAM_STR; } // PDO::PARAM_STR
		if (preg_match("/^[+-]?\d+$/",$param)){ $typ_param=PDO::PARAM_INT; } // PDO::PARAM_INT
		// PDO::PARAM_BOOL -  MySQL might not support PARAM_BOOL
		if (preg_match("/^$/",$param)){ $typ_param=PDO::PARAM_NULL; } // PDO::PARAM_NULL
		$rk->bindValue($i,$param,$typ_param);
	}
	// renvoie la requête préparée et executée
	$rk->execute();
	// $nb=$rk->execute(); OU foreach ($rk as $result){
	// donc $nb=prepexec(... ou $rk=prepexec puis foreach($rk... ou même foreach(prepexec...
	return $rk;
}

exemple d’appel :

		$rek="select count(login) as existe from utilisateur where login=?";
		$params[1]=$user;
		$rk=prepexec($rek,$params,$db);
		$existe=0;
		foreach ($rk as $result){
			$existe=$result['existe'];
		}

Cependant, cela est encore trop long.
Cette deuxième fonction va donc faire le boulot en appelant la première et en renvoyant la valeur attendue, unique, et dont le nom du champ est indiqué.

function simplexec($rek,$params,$db,$nomvar){
	$resultat=null;	
	$rk=prepexec($rek,$params,$db);
	foreach ($rk as $result){
			$resultat=$result["$nomvar"];
	}
	return $resultat;
}

Répondre à cet article

Total 436886 visites depuis 4633 jours | | SPIP | | Plan du site | Suivre la vie du site RSS 2.0