Télécharger ang Faire des requêtes préparées avec l'extension mysql

Mise à jour le : 03/03/2011  ·   Licence : Creative Commons  ·   Téléchargé 167 fois   ·     +
Présentation
L'extension Mysql commence à bien vieillir et est maintenant uniquement en correction de bug, l'extension mysqli la remplace, et PDO possède aussi un driver mysql. (plus d'info ici : http://fr2.php.net/manual/fr/mysqli.overview.php)

Avec PDO on a vite pris l'habitude de faire des requêtes préparées, de part sa simplicité, mais aussi sa couche sécuritaire. Mais il y'a malheureusement encore des résistants du mysql_* (coucou PHP 4) qui eux n'ont pas de requêtes préparées avec l'api. Et rien n'empêche d'en faire ;)

Je vous propose donc trois fonctions supplémentaires pour mysql_* :
- mysql_prepare
- mysql_execute

Et en bonus :
- mysql_fetch_all (compatible avec les mysql_fetch_*)

Adresse du projet : https://github.com/stealth35/mysql_prepare

Exemple d'utilisation :

ini_set('mysql.trace_mode', true);
mysql_connect('localhost', 'root', '');
mysql_select_db('test');
mysql_set_charset('utf8');

$stmt = mysql_prepare('SELECT * FROM `test` WHERE `id` > ? LIMIT ?');
$result = mysql_execute(array(5, 3), $stmt);

echo '';
print_r(mysql_fetch_all($result, 'object'));
echo '';
Téléchargement :
Compatibilité :
Windows Linux Mac  






		
  1. <?php
  2. /**
  3.  * @param string $query
  4.  * @param ressource $link optional
  5.  *
  6.  * @return string
  7.  */
  8. function mysql_prepare($query, $link = null)
  9. {
  10. if(false === is_string($query))
  11. {
  12. trigger_error(sprintf('%s() expects parameter 1 to be string, %s given',
  13. __FUNCTION__, gettype($query)), E_USER_WARNING);
  14.  
  15. return false;
  16. }
  17.  
  18. if(false === is_null($link) && false === is_resource($link))
  19. {
  20. trigger_error(sprintf('%s() expects parameter 3 to be resource, %s given',
  21. __FUNCTION__, gettype($link)), E_USER_WARNING);
  22.  
  23. return false;
  24. }
  25.  
  26. if(is_resource($link) && 'mysql link' !== get_resource_type($link))
  27. {
  28. trigger_error(sprintf('%s(): supplied resource is not a valid MySQL-Link resource',
  29. __FUNCTION__), E_USER_WARNING);
  30.  
  31. return false;
  32. }
  33.  
  34. $stmt = uniqid();
  35.  
  36. if(is_resource($link))
  37. {
  38. $query = mysql_real_escape_string($query, $link);
  39. }
  40. else
  41. {
  42. $query = mysql_real_escape_string($query);
  43. }
  44.  
  45. $prep = sprintf('PREPARE `%s` FROM \'%s\'', $stmt, $query);
  46.  
  47. if(is_resource($link))
  48. {
  49. if(mysql_query($prep, $link))
  50. {
  51. return $stmt;
  52. }
  53. }
  54. else
  55. {
  56. if(mysql_query($prep))
  57. {
  58. return $stmt;
  59. }
  60. }
  61.  
  62. return false;
  63. }
  64.  
  65. /**
  66.  * @param string $stmt
  67.  * @param array $input_parameters optional
  68.  * @param ressource $link optional
  69.  *
  70.  * @return ressource
  71.  */
  72. function mysql_execute($stmt, $input_parameters = array(), $link = null)
  73. {
  74. if(false === is_string($stmt))
  75. {
  76. trigger_error(sprintf('%s() expects parameter 1 to be string, %s given',
  77. __FUNCTION__, gettype($stmt)), E_USER_WARNING);
  78.  
  79. return false;
  80. }
  81.  
  82. if(false === is_array($input_parameters))
  83. {
  84. trigger_error(sprintf('%s() expects parameter 2 to be an array, %s given',
  85. __FUNCTION__, gettype($input_parameters)), E_USER_WARNING);
  86.  
  87. return false;
  88. }
  89.  
  90. if(false === is_null($link) && false === is_resource($link))
  91. {
  92. trigger_error(sprintf('%s() expects parameter 3 to be resource, %s given',
  93. __FUNCTION__, gettype($link)), E_USER_WARNING);
  94.  
  95. return false;
  96. }
  97.  
  98. if(is_resource($link) && 'mysql link' !== get_resource_type($link))
  99. {
  100. trigger_error(sprintf('%s(): supplied resource is not a valid MySQL-Link resource',
  101. __FUNCTION__), E_USER_WARNING);
  102.  
  103. return false;
  104. }
  105.  
  106. foreach($input_parameters as $id => $input_parameter)
  107. {
  108. $key = sprintf('@`%s`', $id);
  109.  
  110. if(is_numeric($input_parameter))
  111. {
  112. $sf = '@`%s` = %s';
  113. }
  114. else
  115. {
  116. $sf = '@`%s` = \'%s\'';
  117. }
  118.  
  119. $input_parameter = settype($input_parameter, 'string');
  120.  
  121. if(is_resource($link))
  122. {
  123. $input_parameter = mysql_real_escape_string($input_parameter, $link);
  124. }
  125. else
  126. {
  127. $input_parameter = mysql_real_escape_string($input_parameter);
  128. }
  129.  
  130. $sets[$key] = sprintf($sf, $id, $input_parameter);
  131. }
  132.  
  133. if(false === empty($sets))
  134. {
  135. $set = sprintf('SET %s', implode(',', $sets));
  136.  
  137. if(is_resource($link))
  138. {
  139. if(false === mysql_query($set, $link))
  140. {
  141. return false;
  142. }
  143. }
  144. else
  145. {
  146. if(false === mysql_query($set))
  147. {
  148. return false;
  149. }
  150. }
  151.  
  152. $ext = sprintf('EXECUTE `%s` USING %s', $stmt, implode(',', array_keys($sets)));
  153. }
  154. else
  155. {
  156. $ext = sprintf('EXECUTE `%s`', $stmt);
  157. }
  158.  
  159. if(is_resource($link))
  160. {
  161. return mysql_query($ext, $link);
  162. }
  163.  
  164. return mysql_query($ext);
  165. }
  166.  
  167. /**
  168.  * @param ressource $result
  169.  * @param string $type optional
  170.  * @param boolean $group optional
  171.  *
  172.  * @return mixed
  173.  */
  174. function mysql_fetch_all($result, $type = 'array', $group = false)
  175. {
  176. if(false === is_resource($result))
  177. {
  178. trigger_error(sprintf('%s() expects parameter 1 to be resource, %s given',
  179. __FUNCTION__, gettype($result)), E_USER_WARNING);
  180.  
  181. return false;
  182. }
  183.  
  184. if(false === is_string($type))
  185. {
  186. trigger_error(sprintf('%s() expects parameter 2 to be string, %s given',
  187. __FUNCTION__, gettype($type)), E_USER_WARNING);
  188.  
  189. return false;
  190. }
  191.  
  192. if(false === is_bool($group))
  193. {
  194. trigger_error(sprintf('%s() expects parameter 3 to be boolean, %s given',
  195. __FUNCTION__, gettype($group)), E_USER_WARNING);
  196.  
  197. return false;
  198. }
  199.  
  200. if(is_resource($result) && 'mysql result' !== get_resource_type($result))
  201. {
  202. trigger_error(sprintf('%s(): supplied resource is not a valid MySQL result resource',
  203. __FUNCTION__), E_USER_WARNING);
  204.  
  205. return false;
  206. }
  207.  
  208. $func = 'mysql_fetch_' . strtolower($type);
  209.  
  210. while(false != ($row = call_user_func($func, $result)))
  211. {
  212. if(false !== $row)
  213. {
  214. if($group)
  215. {
  216. if('array' === $type)
  217. {
  218. array_shift($row);
  219. }
  220.  
  221. if('object' === $type)
  222. {
  223. $cols = get_object_vars($row);
  224. $col = array_shift($cols);
  225. }
  226. else
  227. {
  228. $col = array_shift($row);
  229. }
  230.  
  231. $rows[$col][] = $row;
  232. }
  233. else
  234. {
  235. $rows[] = $row;
  236. }
  237. }
  238. else
  239. {
  240. return false;
  241. }
  242. }
  243.  
  244.  
  245. if(false === empty($rows))
  246. {
  247. return $rows;
  248. }
  249.  
  250. return false;
  251. }


Poster une réponse Retrouver la discussion sur le forum

Avatar de thebarbarius thebarbarius
Membre habitué
le 23/02/2011
Sa fait beacoup de ligne par rapport a PDO ....

De plus a part en local et peut etre quelque rare hebergeur, la fonction init n'est pas autorisé...
Avatar de stealth35 stealth35
Modérateur
le 23/02/2011

Citation:





Envoyé par thebarbarius
Voir le message

Sa fait beacoup de ligne par rapport a PDO ....

De plus a part en local et peut etre quelque rare hebergeur, la fonction init n'est pas autorisé...


non ca fait même moins de ligne que PDO, pour le ini_set c'est pas obligatoire tu peux toujours utiliser les or die pas beaux (regarde a quoi correspond mysql.trace_mode...) en PDO ca donne :
Code :
12345678910111213141516171819
try
{
    $driver_options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, 
                            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '', $driver_options);
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

$stmt = $dbh->prepare('SELECT * FROM `test` WHERE `id` > ? LIMIT ?');
$stmt->bindValue(1, 5, PDO::PARAM_INT);
$stmt->bindValue(2, 3, PDO::PARAM_INT);
$stmt->execute();

echo '<pre>';
print_r($stmt->fetchAll(PDO::FETCH_OBJ));
echo '</pre>'

donc plus de ligne
Avatar de stealth35 stealth35
Modérateur
le 03/03/2011
Pour ceux qui seraient intéressés par le projet voici les derniers ajouts :

  • Support du $link

  • Support du fetch group

  • Ajout des erreurs liés aux paramètres de fonction



L'adresse du projet : https://github.com/stealth35/mysql_prepare



Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.

Connexion

Identifiant
Mot de passe
S'inscrireMot de passe oublié ?
 
 
 
 
Partenaires

Hébergement Web