PageRenderTime 52ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/spip/ecrire/req/mysql.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 865 lines | 647 code | 111 blank | 107 comment | 84 complexity | 7d604a01255b7b3b94e1c38472bb6ffd MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. // fonction pour la premiere connexion a un serveur MySQL
  13. // http://doc.spip.org/@req_mysql_dist
  14. function req_mysql_dist($host, $port, $login, $pass, $db='', $prefixe='') {
  15. if (!charger_php_extension('mysql')) return false;
  16. if ($port > 0) $host = "$host:$port";
  17. $link = @mysql_connect($host, $login, $pass, true);
  18. if (!$link) {
  19. spip_log('Echec mysql_connect. Erreur : ' . mysql_error(),'mysql');
  20. return false;
  21. }
  22. $last = '';
  23. if (!$db) {
  24. $ok = $link;
  25. $db = 'spip';
  26. } else {
  27. $ok = spip_mysql_selectdb($db);
  28. if (defined('_MYSQL_SET_SQL_MODE')
  29. OR defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
  30. )
  31. mysql_query($last = "set sql_mode=''");
  32. }
  33. # spip_log("Connexion vers $host, base $db, prefixe $prefixe "
  34. # . ($ok ? "operationnelle sur $link" : 'impossible'));
  35. return !$ok ? false : array(
  36. 'db' => $db,
  37. 'last' => $last,
  38. 'prefixe' => $prefixe ? $prefixe : $db,
  39. 'link' => $GLOBALS['mysql_rappel_connexion'] ? $link : false,
  40. );
  41. }
  42. $GLOBALS['spip_mysql_functions_1'] = array(
  43. 'alter' => 'spip_mysql_alter',
  44. 'count' => 'spip_mysql_count',
  45. 'countsel' => 'spip_mysql_countsel',
  46. 'create' => 'spip_mysql_create',
  47. 'create_base' => 'spip_mysql_create_base',
  48. 'create_view' => 'spip_mysql_create_view',
  49. 'date_proche' => 'spip_mysql_date_proche',
  50. 'delete' => 'spip_mysql_delete',
  51. 'drop_table' => 'spip_mysql_drop_table',
  52. 'drop_view' => 'spip_mysql_drop_view',
  53. 'errno' => 'spip_mysql_errno',
  54. 'error' => 'spip_mysql_error',
  55. 'explain' => 'spip_mysql_explain',
  56. 'fetch' => 'spip_mysql_fetch',
  57. 'seek' => 'spip_mysql_seek',
  58. 'free' => 'spip_mysql_free',
  59. 'hex' => 'spip_mysql_hex',
  60. 'in' => 'spip_mysql_in',
  61. 'insert' => 'spip_mysql_insert',
  62. 'insertq' => 'spip_mysql_insertq',
  63. 'insertq_multi' => 'spip_mysql_insertq_multi',
  64. 'listdbs' => 'spip_mysql_listdbs',
  65. 'multi' => 'spip_mysql_multi',
  66. 'optimize' => 'spip_mysql_optimize',
  67. 'query' => 'spip_mysql_query',
  68. 'quote' => 'spip_mysql_quote',
  69. 'replace' => 'spip_mysql_replace',
  70. 'replace_multi' => 'spip_mysql_replace_multi',
  71. 'repair' => 'spip_mysql_repair',
  72. 'select' => 'spip_mysql_select',
  73. 'selectdb' => 'spip_mysql_selectdb',
  74. 'set_charset' => 'spip_mysql_set_charset',
  75. 'get_charset' => 'spip_mysql_get_charset',
  76. 'showbase' => 'spip_mysql_showbase',
  77. 'showtable' => 'spip_mysql_showtable',
  78. 'update' => 'spip_mysql_update',
  79. 'updateq' => 'spip_mysql_updateq',
  80. // association de chaque nom http d'un charset aux couples MySQL
  81. 'charsets' => array(
  82. 'cp1250'=>array('charset'=>'cp1250','collation'=>'cp1250_general_ci'),
  83. 'cp1251'=>array('charset'=>'cp1251','collation'=>'cp1251_general_ci'),
  84. 'cp1256'=>array('charset'=>'cp1256','collation'=>'cp1256_general_ci'),
  85. 'iso-8859-1'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
  86. //'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
  87. 'iso-8859-9'=>array('charset'=>'latin5','collation'=>'latin5_turkish_ci'),
  88. //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
  89. 'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci'))
  90. );
  91. // http://doc.spip.org/@spip_mysql_set_charset
  92. function spip_mysql_set_charset($charset, $serveur='',$requeter=true,$requeter=true){
  93. $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
  94. #spip_log("changement de charset sql : "."SET NAMES "._q($charset));
  95. return mysql_query($connexion['last'] = "SET NAMES "._q($charset));
  96. }
  97. // http://doc.spip.org/@spip_mysql_get_charset
  98. function spip_mysql_get_charset($charset=array(), $serveur='',$requeter=true){
  99. $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
  100. $connexion['last'] = $c = "SHOW CHARACTER SET"
  101. . (!$charset ? '' : (" LIKE "._q($charset['charset'])));
  102. return spip_mysql_fetch(mysql_query($c), NULL, $serveur);
  103. }
  104. // obsolete, ne plus utiliser
  105. // http://doc.spip.org/@spip_query_db
  106. function spip_query_db($query, $serveur='',$requeter=true) {
  107. return spip_mysql_query($query, $serveur, $requeter);
  108. }
  109. // Fonction de requete generale, munie d'une trace a la demande
  110. // http://doc.spip.org/@spip_mysql_query
  111. function spip_mysql_query($query, $serveur='',$requeter=true) {
  112. $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
  113. $prefixe = $connexion['prefixe'];
  114. $link = $connexion['link'];
  115. $db = $connexion['db'];
  116. $query = traite_query($query, $db, $prefixe);
  117. // renvoyer la requete inerte si demandee
  118. if (!$requeter) return $query;
  119. if (isset($_GET['var_profile'])) {
  120. include_spip('public/tracer');
  121. $t = trace_query_start();
  122. } else $t = 0 ;
  123. $connexion['last'] = $query;
  124. $r = $link ? mysql_query($query, $link) : mysql_query($query);
  125. if ($e = spip_mysql_errno($serveur)) // Log de l'erreur eventuelle
  126. $e .= spip_mysql_error($query, $serveur); // et du fautif
  127. return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
  128. }
  129. // http://doc.spip.org/@spip_mysql_alter
  130. function spip_mysql_alter($query, $serveur='',$requeter=true){
  131. return spip_mysql_query("ALTER ".$query, $serveur, $requeter); # i.e. que PG se debrouille
  132. }
  133. // http://doc.spip.org/@spip_mysql_optimize
  134. function spip_mysql_optimize($table, $serveur='',$requeter=true){
  135. spip_mysql_query("OPTIMIZE TABLE ". $table);
  136. return true;
  137. }
  138. // http://doc.spip.org/@spip_mysql_explain
  139. function spip_mysql_explain($query, $serveur='',$requeter=true){
  140. if (strpos(ltrim($query), 'SELECT') !== 0) return array();
  141. $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
  142. $prefixe = $connexion['prefixe'];
  143. $link = $connexion['link'];
  144. $db = $connexion['db'];
  145. $query = 'EXPLAIN ' . traite_query($query, $db, $prefixe);
  146. $r = $link ? mysql_query($query, $link) : mysql_query($query);
  147. return spip_mysql_fetch($r, NULL, $serveur);
  148. }
  149. // fonction instance de sql_select, voir ses specs dans abstract.php
  150. // traite_query pourrait y etre fait d'avance ce serait moins cher
  151. // Les \n et \t sont utiles au debusqueur.
  152. // http://doc.spip.org/@spip_mysql_select
  153. function spip_mysql_select($select, $from, $where='',
  154. $groupby='', $orderby='', $limit='', $having='',
  155. $serveur='',$requeter=true) {
  156. $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
  157. $query =
  158. calculer_mysql_expression('SELECT', $select, ', ')
  159. . calculer_mysql_expression('FROM', $from, ', ')
  160. . calculer_mysql_expression('WHERE', $where)
  161. . calculer_mysql_expression('GROUP BY', $groupby, ',')
  162. . calculer_mysql_expression('HAVING', $having)
  163. . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) :'')
  164. . ($limit ? "\nLIMIT $limit" : '');
  165. // renvoyer la requete inerte si demandee
  166. if ($requeter === false) return $query;
  167. $r = spip_mysql_query($query, $serveur, $requeter);
  168. return $r ? $r : $query;
  169. }
  170. // 0+x avec un champ x commencant par des chiffres est converti par MySQL
  171. // en le nombre qui commence x.
  172. // Pas portable malheureusement, on laisse pour le moment.
  173. // http://doc.spip.org/@spip_mysql_order
  174. function spip_mysql_order($orderby)
  175. {
  176. return (is_array($orderby)) ? join(", ", $orderby) : $orderby;
  177. }
  178. // http://doc.spip.org/@calculer_mysql_where
  179. function calculer_mysql_where($v)
  180. {
  181. if (!is_array($v))
  182. return $v ;
  183. $op = array_shift($v);
  184. if (!($n=count($v)))
  185. return $op;
  186. else {
  187. $arg = calculer_mysql_where(array_shift($v));
  188. if ($n==1) {
  189. return "$op($arg)";
  190. } else {
  191. $arg2 = calculer_mysql_where(array_shift($v));
  192. if ($n==2) {
  193. return "($arg $op $arg2)";
  194. } else return "($arg $op ($arg2) : $v[0])";
  195. }
  196. }
  197. }
  198. // http://doc.spip.org/@calculer_mysql_expression
  199. function calculer_mysql_expression($expression, $v, $join = 'AND'){
  200. if (empty($v))
  201. return '';
  202. $exp = "\n$expression ";
  203. if (!is_array($v)) {
  204. return $exp . $v;
  205. } else {
  206. if (strtoupper($join) === 'AND')
  207. return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
  208. else
  209. return $exp . join($join, $v);
  210. }
  211. }
  212. // http://doc.spip.org/@spip_mysql_select_as
  213. function spip_mysql_select_as($args)
  214. {
  215. $res = '';
  216. foreach($args as $k => $v) {
  217. if (substr($k,-1)=='@') {
  218. // c'est une jointure qui se refere au from precedent
  219. // pas de virgule
  220. $res .= ' ' . $v ;
  221. }
  222. else {
  223. if (!is_numeric($k)) {
  224. $p = strpos($v, " ");
  225. if ($p)
  226. $v = substr($v,0,$p) . " AS `$k`" . substr($v,$p);
  227. else $v .= " AS `$k`";
  228. }
  229. $res .= ', ' . $v ;
  230. }
  231. }
  232. return substr($res,2);
  233. }
  234. //
  235. // Changer les noms des tables ($table_prefix)
  236. // Quand tous les appels SQL seront abstraits on pourra l'ameliorer
  237. define('_SQL_PREFIXE_TABLE', '/([,\s])spip_/S');
  238. // http://doc.spip.org/@traite_query
  239. function traite_query($query, $db='', $prefixe='') {
  240. if ($GLOBALS['mysql_rappel_nom_base'] AND $db)
  241. $pref = '`'. $db.'`.';
  242. else $pref = '';
  243. if ($prefixe)
  244. $pref .= $prefixe . "_";
  245. if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
  246. $suite ='';
  247. } else {
  248. $suite = strstr($query, $regs[0]);
  249. $query = substr($query, 0, -strlen($suite));
  250. if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite, $r)) {
  251. $suite = $r[1] . traite_query($r[2], $db, $prefixe);
  252. }
  253. }
  254. $r = preg_replace(_SQL_PREFIXE_TABLE, '\1'.$pref, $query) . $suite;
  255. # spip_log("traite_query: " . substr($r,0, 50) . ".... $db, $prefixe");
  256. return $r;
  257. }
  258. // http://doc.spip.org/@spip_mysql_selectdb
  259. function spip_mysql_selectdb($db) {
  260. $ok = mysql_select_db($db);
  261. if (!$ok)
  262. spip_log('Echec mysql_selectdb. Erreur : ' . mysql_error(),'mysql');
  263. return $ok;
  264. }
  265. // Retourne les bases accessibles
  266. // Attention on n'a pas toujours les droits
  267. // http://doc.spip.org/@spip_mysql_listdbs
  268. function spip_mysql_listdbs($serveur='',$requeter=true) {
  269. return @mysql_list_dbs();
  270. }
  271. // Fonction de creation d'une table SQL nommee $nom
  272. // a partir de 2 tableaux PHP :
  273. // champs: champ => type
  274. // cles: type-de-cle => champ(s)
  275. // si $autoinc, c'est une auto-increment (i.e. serial) sur la Primary Key
  276. // Le nom des caches doit etre inferieur a 64 caracteres
  277. // http://doc.spip.org/@spip_mysql_create
  278. function spip_mysql_create($nom, $champs, $cles, $autoinc=false, $temporary=false, $serveur='',$requeter=true) {
  279. $query = ''; $keys = ''; $s = ''; $p='';
  280. // certains plugins declarent les tables (permet leur inclusion dans le dump)
  281. // sans les renseigner (laisse le compilo recuperer la description)
  282. if (!is_array($champs) || !is_array($cles))
  283. return;
  284. $res = spip_mysql_query("SELECT version() as v");
  285. if ($row = mysql_fetch_array($res)
  286. && (version_compare($row['v'],'5.0','>=')))
  287. spip_mysql_query("SET sql_mode=''");
  288. foreach($cles as $k => $v) {
  289. $keys .= "$s\n\t\t$k ($v)";
  290. if ($k == "PRIMARY KEY")
  291. $p = $v;
  292. $s = ",";
  293. }
  294. $s = '';
  295. $character_set = "";
  296. if (@$GLOBALS['meta']['charset_sql_base'])
  297. $character_set .= " CHARACTER SET ".$GLOBALS['meta']['charset_sql_base'];
  298. if (@$GLOBALS['meta']['charset_collation_sql_base'])
  299. $character_set .= " COLLATE ".$GLOBALS['meta']['charset_collation_sql_base'];
  300. foreach($champs as $k => $v) {
  301. if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i',$v,$defs)){
  302. if (preg_match(',(char|text),i',$defs[1]) AND !preg_match(',binary,i',$defs[1]) ){
  303. $v = $defs[1] . $character_set . ' ' . substr($v,strlen($defs[1]));
  304. }
  305. }
  306. $query .= "$s\n\t\t$k $v"
  307. . (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
  308. ? " auto_increment"
  309. : ''
  310. );
  311. $s = ",";
  312. }
  313. $temporary = $temporary ? 'TEMPORARY':'';
  314. $q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ")".
  315. ($character_set?" DEFAULT $character_set":"")
  316. ."\n";
  317. return spip_mysql_query($q, $serveur);
  318. }
  319. function spip_mysql_create_base($nom, $serveur='',$requeter=true) {
  320. return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
  321. }
  322. // Fonction de creation d'une vue SQL nommee $nom
  323. // http://doc.spip.org/@spip_mysql_create_view
  324. function spip_mysql_create_view($nom, $query_select, $serveur='',$requeter=true) {
  325. if (!$query_select) return false;
  326. // vue deja presente
  327. if (sql_showtable($nom, false, $serveur)) {
  328. spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
  329. return false;
  330. }
  331. $query = "CREATE VIEW $nom AS ". $query_select;
  332. return spip_mysql_query($query, $serveur, $requeter);
  333. }
  334. // http://doc.spip.org/@spip_mysql_drop_table
  335. function spip_mysql_drop_table($table, $exist='', $serveur='',$requeter=true)
  336. {
  337. if ($exist) $exist =" IF EXISTS";
  338. return spip_mysql_query("DROP TABLE$exist `$table`", $serveur, $requeter);
  339. }
  340. // supprime une vue
  341. // http://doc.spip.org/@spip_mysql_drop_view
  342. function spip_mysql_drop_view($view, $exist='', $serveur='',$requeter=true) {
  343. if ($exist) $exist =" IF EXISTS";
  344. return spip_mysql_query("DROP VIEW$exist `$view`", $serveur, $requeter);
  345. }
  346. // http://doc.spip.org/@spip_mysql_showbase
  347. function spip_mysql_showbase($match, $serveur='',$requeter=true)
  348. {
  349. return spip_mysql_query("SHOW TABLES LIKE " . _q($match), $serveur, $requeter);
  350. }
  351. // http://doc.spip.org/@spip_mysql_repair
  352. function spip_mysql_repair($table, $serveur='',$requeter=true)
  353. {
  354. return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
  355. }
  356. // Recupere la definition d'une table ou d'une vue MySQL
  357. // colonnes, indexes, etc.
  358. // au meme format que la definition des tables de SPIP
  359. // http://doc.spip.org/@spip_mysql_showtable
  360. function spip_mysql_showtable($nom_table, $serveur='',$requeter=true)
  361. {
  362. $s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
  363. if (!$s) return '';
  364. if (!$requeter) return $s;
  365. list(,$a) = mysql_fetch_array($s ,MYSQL_NUM);
  366. if (preg_match("/^[^(),]*\((([^()]*\([^()]*\)[^()]*)*)\)[^()]*$/", $a, $r)){
  367. $dec = $r[1];
  368. if (preg_match("/^(.*?),([^,]*KEY.*)$/s", $dec, $r)) {
  369. $namedkeys = $r[2];
  370. $dec = $r[1];
  371. }
  372. else
  373. $namedkeys = "";
  374. $fields = array();
  375. foreach(preg_split("/,\s*`/",$dec) as $v) {
  376. preg_match("/^\s*`?([^`]*)`\s*(.*)/",$v,$r);
  377. $fields[strtolower($r[1])] = $r[2];
  378. }
  379. $keys = array();
  380. foreach(preg_split('/\)\s*,?/',$namedkeys) as $v) {
  381. if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) {
  382. $k = str_replace("`", '', trim($r[1]));
  383. $t = strtolower(str_replace("`", '', $r[2]));
  384. if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;
  385. }
  386. }
  387. spip_mysql_free($s);
  388. return array('field' => $fields, 'key' => $keys);
  389. }
  390. $res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
  391. if($res) {
  392. $nfields = array();
  393. $nkeys = array();
  394. while($val = spip_mysql_fetch($res)) {
  395. $nfields[$val["Field"]] = $val['Type'];
  396. if($val['Null']=='NO') {
  397. $nfields[$val["Field"]] .= ' NOT NULL';
  398. }
  399. if($val['Default'] === '0' || $val['Default']) {
  400. if(preg_match('/[A-Z_]/',$val['Default'])) {
  401. $nfields[$val["Field"]] .= ' DEFAULT '.$val['Default'];
  402. } else {
  403. $nfields[$val["Field"]] .= " DEFAULT '".$val['Default']."'";
  404. }
  405. }
  406. if($val['Extra'])
  407. $nfields[$val["Field"]] .= ' '.$val['Extra'];
  408. if($val['Key'] == 'PRI') {
  409. $nkeys['PRIMARY KEY'] = $val["Field"];
  410. } else if($val['Key'] == 'MUL') {
  411. $nkeys['KEY '.$val["Field"]] = $val["Field"];
  412. } else if($val['Key'] == 'UNI') {
  413. $nkeys['UNIQUE KEY '.$val["Field"]] = $val["Field"];
  414. }
  415. }
  416. spip_mysql_free($res);
  417. return array('field' => $nfields, 'key' => $nkeys);
  418. }
  419. return "";
  420. }
  421. //
  422. // Recuperation des resultats
  423. //
  424. // http://doc.spip.org/@spip_mysql_fetch
  425. function spip_mysql_fetch($r, $t='', $serveur='',$requeter=true) {
  426. if (!$t) $t = MYSQL_ASSOC;
  427. if ($r) return mysql_fetch_array($r, $t);
  428. }
  429. function spip_mysql_seek($r, $row_number, $serveur='',$requeter=true) {
  430. if ($r) return mysql_data_seek($r,$row_number);
  431. }
  432. // http://doc.spip.org/@spip_mysql_countsel
  433. function spip_mysql_countsel($from = array(), $where = array(),
  434. $groupby = '', $having = array(), $serveur='',$requeter=true)
  435. {
  436. $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
  437. $r = spip_mysql_select("COUNT($c)", $from, $where,'', '', '', $having, $serveur, $requeter);
  438. if (!$requeter) return $r;
  439. if (!is_resource($r)) return 0;
  440. list($c) = mysql_fetch_array($r, MYSQL_NUM);
  441. mysql_free_result($r);
  442. return $c;
  443. }
  444. // Bien specifier le serveur auquel on s'adresse,
  445. // mais a l'install la globale n'est pas encore completement definie
  446. // http://doc.spip.org/@spip_mysql_error
  447. function spip_mysql_error($query='', $serveur='',$requeter=true) {
  448. $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
  449. $s = $link ? mysql_error($link) : mysql_error();
  450. if ($s) spip_log("$s - $query", 'mysql');
  451. return $s;
  452. }
  453. // A transposer dans les portages
  454. // http://doc.spip.org/@spip_mysql_errno
  455. function spip_mysql_errno($serveur='',$requeter=true) {
  456. $link = $GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
  457. $s = $link ? mysql_errno($link) : mysql_errno();
  458. // 2006 MySQL server has gone away
  459. // 2013 Lost connection to MySQL server during query
  460. if (in_array($s, array(2006,2013)))
  461. define('spip_interdire_cache', true);
  462. if ($s) spip_log("Erreur mysql $s");
  463. return $s;
  464. }
  465. // Interface de abstract_sql
  466. // http://doc.spip.org/@spip_mysql_count
  467. function spip_mysql_count($r, $serveur='',$requeter=true) {
  468. if ($r) return mysql_num_rows($r);
  469. }
  470. // http://doc.spip.org/@spip_mysql_free
  471. function spip_mysql_free($r, $serveur='',$requeter=true) {
  472. return mysql_free_result($r);
  473. }
  474. // http://doc.spip.org/@spip_mysql_insert
  475. function spip_mysql_insert($table, $champs, $valeurs, $desc='', $serveur='',$requeter=true) {
  476. $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
  477. $prefixe = $connexion['prefixe'];
  478. $link = $connexion['link'];
  479. $db = $connexion['db'];
  480. if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
  481. $query ="INSERT INTO $table $champs VALUES $valeurs";
  482. if (!$requeter) return $query;
  483. if (isset($_GET['var_profile'])) {
  484. include_spip('public/tracer');
  485. $t = trace_query_start();
  486. } else $t = 0 ;
  487. $connexion['last'] = $query;
  488. # spip_log($query);
  489. if (mysql_query($query, $link))
  490. $r = mysql_insert_id($link);
  491. else {
  492. if ($e = spip_mysql_errno($serveur)) // Log de l'erreur eventuelle
  493. $e .= spip_mysql_error($query, $serveur); // et du fautif
  494. }
  495. return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
  496. // return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
  497. }
  498. // http://doc.spip.org/@spip_mysql_insertq
  499. function spip_mysql_insertq($table, $couples=array(), $desc=array(), $serveur='',$requeter=true) {
  500. if (!$desc) $desc = description_table($table);
  501. if (!$desc) $couples = array();
  502. $fields = isset($desc['field'])?$desc['field']:array();
  503. foreach ($couples as $champ => $val) {
  504. $couples[$champ]= spip_mysql_cite($val, $fields[$champ]);
  505. }
  506. return spip_mysql_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter);
  507. }
  508. // http://doc.spip.org/@spip_mysql_insertq_multi
  509. function spip_mysql_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
  510. if (!$desc) $desc = description_table($table);
  511. if (!$desc) $tab_couples = array();
  512. $fields = isset($desc['field'])?$desc['field']:array();
  513. $cles = "(" . join(',',array_keys($tab_couples[0])) . ')';
  514. $valeurs = array();
  515. foreach ($tab_couples as $couples) {
  516. foreach ($couples as $champ => $val){
  517. $couples[$champ]= spip_mysql_cite($val, $fields[$champ]);
  518. }
  519. $valeurs[] = '(' .join(',', $couples) . ')';
  520. }
  521. // Inserer par groupes de 100 max pour eviter un debordement de pile
  522. $r = false;
  523. do {
  524. $ins = array_slice($valeurs,0,100);
  525. $valeurs = array_slice($valeurs,100);
  526. $r = spip_mysql_insert($table, $cles, join(', ', $ins), $desc, $serveur, $requeter);
  527. } while (count($valeurs));
  528. return $r; // dans le cas d'une table auto_increment, le dernier insert_id
  529. }
  530. // http://doc.spip.org/@spip_mysql_update
  531. function spip_mysql_update($table, $champs, $where='', $desc='', $serveur='',$requeter=true) {
  532. $set = array();
  533. foreach ($champs as $champ => $val)
  534. $set[] = $champ . "=$val";
  535. if (!empty($set))
  536. return spip_mysql_query(
  537. calculer_mysql_expression('UPDATE', $table, ',')
  538. . calculer_mysql_expression('SET', $set, ',')
  539. . calculer_mysql_expression('WHERE', $where),
  540. $serveur, $requeter);
  541. }
  542. // idem, mais les valeurs sont des constantes a mettre entre apostrophes
  543. // sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc)
  544. // http://doc.spip.org/@spip_mysql_updateq
  545. function spip_mysql_updateq($table, $champs, $where='', $desc=array(), $serveur='',$requeter=true) {
  546. if (!$champs) return;
  547. if (!$desc) $desc = description_table($table);
  548. if (!$desc) $champs = array(); else $fields = $desc['field'];
  549. $set = array();
  550. foreach ($champs as $champ => $val) {
  551. $set[] = $champ . '=' . spip_mysql_cite($val, $fields[$champ]);
  552. }
  553. return spip_mysql_query(
  554. calculer_mysql_expression('UPDATE', $table, ',')
  555. . calculer_mysql_expression('SET', $set, ',')
  556. . calculer_mysql_expression('WHERE', $where),
  557. $serveur, $requeter);
  558. }
  559. // http://doc.spip.org/@spip_mysql_delete
  560. function spip_mysql_delete($table, $where='', $serveur='',$requeter=true) {
  561. $res = spip_mysql_query(
  562. calculer_mysql_expression('DELETE FROM', $table, ',')
  563. . calculer_mysql_expression('WHERE', $where),
  564. $serveur, $requeter);
  565. if (!$requeter) return $res;
  566. if ($res){
  567. $connexion = &$GLOBALS['connexions'][$serveur ? $serveur : 0];
  568. $link = $connexion['link'];
  569. return $link ? mysql_affected_rows($link) : mysql_affected_rows();
  570. }
  571. else
  572. return false;
  573. }
  574. // http://doc.spip.org/@spip_mysql_replace
  575. function spip_mysql_replace($table, $couples, $desc=array(), $serveur='',$requeter=true) {
  576. return spip_mysql_query("REPLACE $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',array_map('_q', $couples)) . ')', $serveur, $requeter);
  577. }
  578. // http://doc.spip.org/@spip_mysql_replace_multi
  579. function spip_mysql_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
  580. $cles = "(" . join(',',array_keys($tab_couples[0])). ')';
  581. $valeurs = array();
  582. foreach ($tab_couples as $couples) {
  583. $valeurs[] = '(' .join(',',array_map('_q', $couples)) . ')';
  584. }
  585. $valeurs = implode(', ',$valeurs);
  586. return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
  587. }
  588. // http://doc.spip.org/@spip_mysql_multi
  589. function spip_mysql_multi ($objet, $lang) {
  590. $lengthlang = strlen("[$lang]");
  591. $posmulti = "INSTR(".$objet.", '<multi>')";
  592. $posfinmulti = "INSTR(".$objet.", '</multi>')";
  593. $debutchaine = "LEFT(".$objet.", $posmulti-1)";
  594. $finchaine = "RIGHT(".$objet.", CHAR_LENGTH(".$objet.") -(7+$posfinmulti))";
  595. $chainemulti = "TRIM(SUBSTRING(".$objet.", $posmulti+7, $posfinmulti -(7+$posmulti)))";
  596. $poslang = "INSTR($chainemulti,'[".$lang."]')";
  597. $poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
  598. $chainelang = "TRIM(SUBSTRING(".$objet.", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
  599. $posfinlang = "INSTR(".$chainelang.", '[')";
  600. $chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
  601. //$chainelang = "LEFT($chainelang,$posfinlang-1)";
  602. $retour = "(TRIM(IF($posmulti = 0 , ".
  603. " TRIM(".$objet."), ".
  604. " CONCAT( ".
  605. " $debutchaine, ".
  606. " IF( ".
  607. " $poslang = 0, ".
  608. " $chainemulti, ".
  609. " $chainelang".
  610. " ), ".
  611. " $finchaine".
  612. " ) ".
  613. "))) AS multi";
  614. return $retour;
  615. }
  616. // http://doc.spip.org/@spip_mysql_hex
  617. function spip_mysql_hex($v)
  618. {
  619. return "0x" . $v;
  620. }
  621. function spip_mysql_quote($v, $type='')
  622. {
  623. return ($type === 'int' AND !$v) ? '0' : _q($v);
  624. }
  625. function spip_mysql_date_proche($champ, $interval, $unite)
  626. {
  627. return '('
  628. . $champ
  629. . (($interval <= 0) ? '>' : '<')
  630. . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
  631. . '('
  632. . sql_quote(date('Y-m-d H:i:s'))
  633. . ', INTERVAL '
  634. . (($interval > 0) ? $interval : (0-$interval))
  635. . ' '
  636. . $unite
  637. . '))';
  638. }
  639. //
  640. // IN (...) est limite a 255 elements, d'ou cette fonction assistante
  641. //
  642. // http://doc.spip.org/@spip_mysql_in
  643. function spip_mysql_in($val, $valeurs, $not='', $serveur='',$requeter=true) {
  644. $n = $i = 0;
  645. $in_sql ="";
  646. while ($n = strpos($valeurs, ',', $n+1)) {
  647. if ((++$i) >= 255) {
  648. $in_sql .= "($val $not IN (" .
  649. substr($valeurs, 0, $n) .
  650. "))\n" .
  651. ($not ? "AND\t" : "OR\t");
  652. $valeurs = substr($valeurs, $n+1);
  653. $i = $n = 0;
  654. }
  655. }
  656. $in_sql .= "($val $not IN ($valeurs))";
  657. return "($in_sql)";
  658. }
  659. // pour compatibilite. Ne plus utiliser.
  660. // http://doc.spip.org/@calcul_mysql_in
  661. function calcul_mysql_in($val, $valeurs, $not='') {
  662. if (is_array($valeurs))
  663. $valeurs = join(',', array_map('_q', $valeurs));
  664. elseif ($valeurs[0]===',') $valeurs = substr($valeurs,1);
  665. if (!strlen(trim($valeurs))) return ($not ? "0=0" : '0=1');
  666. return spip_mysql_in($val, $valeurs, $not);
  667. }
  668. // http://doc.spip.org/@spip_mysql_cite
  669. function spip_mysql_cite($v, $type) {
  670. if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)
  671. OR (sql_test_int($type)
  672. AND (is_numeric($v)
  673. OR (ctype_xdigit(substr($v,2))
  674. AND $v[0]=='0' AND $v[1]=='x'))))
  675. return $v;
  676. else return ("'" . addslashes($v) . "'");
  677. }
  678. // Ces deux fonctions n'ont pas d'equivalent exact PostGres
  679. // et ne sont la que pour compatibilite avec les extensions de SPIP < 1.9.3
  680. //
  681. // Poser un verrou local a un SPIP donne
  682. // Changer de nom toutes les heures en cas de blocage MySQL (ca arrive)
  683. //
  684. // http://doc.spip.org/@spip_get_lock
  685. function spip_get_lock($nom, $timeout = 0) {
  686. define('_LOCK_TIME', intval(time()/3600-316982));
  687. $connexion = &$GLOBALS['connexions'][0];
  688. $prefixe = $connexion['prefixe'];
  689. $nom = "$bd:$prefix:$nom" . _LOCK_TIME;
  690. $connexion['last'] = $q = "SELECT GET_LOCK(" . _q($nom) . ", $timeout) AS n";
  691. $q = @sql_fetch(mysql_query($q));
  692. if (!$q) spip_log("pas de lock sql pour $nom");
  693. return $q['n'];
  694. }
  695. // http://doc.spip.org/@spip_release_lock
  696. function spip_release_lock($nom) {
  697. $connexion = &$GLOBALS['connexions'][0];
  698. $prefixe = $connexion['prefixe'];
  699. $nom = "$bd:$prefix:$nom" . _LOCK_TIME;
  700. $connexion['last'] = $q = "SELECT RELEASE_LOCK(" . _q($nom) . ")";
  701. @mysql_query($q);
  702. }
  703. // Renvoie false si on n'a pas les fonctions mysql (pour l'install)
  704. // http://doc.spip.org/@spip_versions_mysql
  705. function spip_versions_mysql() {
  706. charger_php_extension('mysql');
  707. return function_exists('mysql_query');
  708. }
  709. // Tester si mysql ne veut pas du nom de la base dans les requetes
  710. // http://doc.spip.org/@test_rappel_nom_base_mysql
  711. function test_rappel_nom_base_mysql($server_db)
  712. {
  713. $GLOBALS['mysql_rappel_nom_base'] = true;
  714. sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
  715. $ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
  716. if ($ok) {
  717. sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
  718. return '';
  719. } else {
  720. $GLOBALS['mysql_rappel_nom_base'] = false;
  721. return "\$GLOBALS['mysql_rappel_nom_base'] = false; ".
  722. "/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
  723. }
  724. }
  725. // http://doc.spip.org/@test_sql_mode_mysql
  726. function test_sql_mode_mysql($server_db){
  727. $res = sql_select("version() as v",'','','','','','',$server_db);
  728. $row = sql_fetch($res,$server_db);
  729. if (version_compare($row['v'],'5.0.0','>=')){
  730. define('_MYSQL_SET_SQL_MODE',true);
  731. return "define('_MYSQL_SET_SQL_MODE',true);\n";
  732. }
  733. return '';
  734. }
  735. ?>