PageRenderTime 574ms CodeModel.GetById 40ms RepoModel.GetById 3ms app.codeStats 0ms

/_core_/tags/spip-2.1.9/tests/sql/10_sql_insert_select.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 254 lines | 161 code | 31 blank | 62 comment | 42 complexity | 8c179c51f72272ac1e62b54c504b5acf MD5 | raw file
  1. <?php
  2. require '../test.inc';
  3. include 'inc-sql_datas.inc';
  4. include_spip('base/abstract_sql');
  5. /*
  6. * Selection/insertion de tables dans la base de donnee
  7. *
  8. */
  9. /*
  10. * Teste que le champ "maj" s'actualise bien sur les update
  11. * ainsi que les autres champs !
  12. *
  13. * utilise sql_quote, sql_getfetsel, sql_update et sql_updateq.
  14. */
  15. function test_maj_timestamp() {
  16. $table = 'spip_test_tintin';
  17. $where = 'id_tintin='.sql_quote(1);
  18. $err = $essais = array();
  19. // lecture du timestamp actuel
  20. $maj1 = sql_getfetsel('maj',$table,$where);
  21. if (!$maj1) {
  22. $err[] = "Le champ 'maj' ($maj1) n'a vraissemblablement pas recu de timestamp a l'insertion";
  23. }
  24. // update
  25. sleep(1); // sinon le timestamp ne change pas !
  26. $texte = 'nouveau texte';
  27. sql_update($table,array('un_texte'=>sql_quote($texte)),$where);
  28. // comparaison timastamp
  29. $maj2 = sql_getfetsel('maj',$table,$where);
  30. if (!$maj2 OR $maj1==$maj2) {
  31. $err[] = "Le champ 'maj' ($maj2) n'a vraissemblablement pas ete mis a jour lors de l'update";
  32. }
  33. // comparaison texte
  34. $texte2 = sql_getfetsel('un_texte',$table,$where);
  35. if (!$texte2 OR $texte2!==$texte){
  36. $err[] = "Le champ 'un_texte' ($texte2) n'est pas correctement rempli a l'update";
  37. }
  38. // idem avec updateq
  39. sleep(1); // sinon le timestamp ne change pas !
  40. $texte = 'encore un nouveau texte';
  41. sql_updateq($table,array('un_texte'=>$texte),$where);
  42. // comparaison timastamp
  43. $maj3 = sql_getfetsel('maj',$table,$where);
  44. if (!$maj3 OR $maj3==$maj2) {
  45. $err[] = "Le champ 'maj' ($maj3) n'a vraissemblablement pas ete mis a jour lors de l'updateq";
  46. }
  47. // comparaison texte
  48. $texte3 = sql_getfetsel('un_texte',$table,$where);
  49. if (!$texte3 OR $texte3!==$texte){
  50. $err[] = "Le champ 'un_texte' ($texte2) n'est pas correctement rempli a l'update";
  51. }
  52. // affichage
  53. if ($err) {
  54. return '<b>Champ maj sur update</b><dl><dd>' . join('</dd><dd>', $err) . '</dd></dl>';
  55. }
  56. }
  57. /*
  58. * Selections diverses selon criteres
  59. * -
  60. */
  61. function test_selections() {
  62. $err = $essais = array();
  63. $desc = test_sql_datas();
  64. $nb_data = count($desc['spip_test_tintin']['data']);
  65. // selection simple
  66. $res = sql_select("*","spip_test_tintin");
  67. if (($nb = sql_count($res)) != $nb_data){
  68. $err[] = "sql_count ($nb) ne renvoie pas : $nb2 elements";
  69. }
  70. // selection float
  71. $res = sql_select("*","spip_test_tintin",array("un_double>".sql_quote(3)));
  72. $elems = $desc['spip_test_tintin']['data'];
  73. $n=0;
  74. foreach($elems as $a=>$b)
  75. foreach($b as $c=>$d)
  76. if (($c == 'un_double') AND ($d > 3))
  77. $n++;
  78. if (($nb = sql_count($res)) != $n){
  79. $err[] = "sql_count ($nb) ne renvoie pas : $n elements";
  80. }
  81. // selection REGEXP
  82. // ! chiffre en dur !
  83. $res = sql_select("*","spip_test_tintin",array("un_varchar REGEXP ".sql_quote("^De")));
  84. if (($nb = sql_count($res)) != 1) {
  85. $err[] = "sql_select comprends mal REGEXP ($nb resultats au lieu de 1)";
  86. }
  87. // selection LIKE
  88. // ! chiffre en dur !
  89. $res = sql_select("*","spip_test_tintin",array("un_varchar LIKE ".sql_quote("De%")));
  90. if (($nb = sql_count($res)) != 1) {
  91. $err[] = "sql_select comprends mal LIKE ($nb resultats au lieu de 1)";
  92. }
  93. // selection array(champs)
  94. $res = sql_fetsel(array("id_tintin","un_varchar"),"spip_test_tintin");
  95. if (!isset($res['id_tintin']) OR !isset($res['un_varchar'])) {
  96. $err[] = "sql_select comprends mal une selection : array(champ1, champ2)";
  97. }
  98. // selection array(champs=>alias)
  99. $res = sql_fetsel(array("id_tintin AS id","un_varchar AS vchar"),"spip_test_tintin");
  100. if (!isset($res['id']) OR !isset($res['vchar'])) {
  101. $err[] = "sql_select comprends mal une selection : array(champ1 AS alias1, champ2 AS alias2)";
  102. }
  103. // selection avec sql_multi
  104. $res = sql_select(array("id_tintin", sql_multi("grrrr",'fr')),"spip_test_milou","","","multi");
  105. if (!(sql_count($res) == $nb_data)) {
  106. $err[] = "sql_multi mal interprete";
  107. }
  108. $rs = sql_fetch($res); $id1 = $rs['id_tintin'];
  109. $rs = sql_fetch($res); $id2 = $rs['id_tintin'];
  110. $rs = sql_fetch($res); $id3 = $rs['id_tintin'];
  111. if ($id1!=3 AND $id2!=2 AND $id3!=1){
  112. $err[] = "sql_multi order by multi rate : ordre ($id1, $id2, $id3) - attendu : (3, 2, 1)";
  113. }
  114. // le bon texte avec multi
  115. foreach (array('fr'=>'Crac','en'=>'Krack') as $lg=>$res) {
  116. $multi = sql_getfetsel(sql_multi("grrrr",$lg),"spip_test_milou","id_milou=".sql_quote(2));
  117. if (!($multi == ($res))) {
  118. $err[] = "sql_multi $lg mal rendu : retour : ".htmlentities($multi).", attendu : ".htmlentities($res);
  119. }
  120. }
  121. // le bon texte avec multi et accents
  122. foreach (array('fr'=>'Aérien','en'=>'Aérieny') as $lg=>$res) {
  123. $multi = sql_getfetsel(sql_multi("alcool",$lg),"spip_test_haddock","id_haddock=".sql_quote(2));
  124. if (!($multi == ($res))) {
  125. $err[] = "sql_multi $lg mal rendu : retour : ".htmlentities(utf8_decode($multi)).", attendu : ".htmlentities(utf8_decode($res));
  126. }
  127. }
  128. // le bon texte avec multi et debut et fin de chaine
  129. foreach (array('fr'=>'Un debut de chaine : Vinasse, et [la fin]','en'=>'Un debut de chaine : Vinassy, et [la fin]','de'=>'Un debut de chaine : Vinasse, et [la fin]',) as $lg=>$res) {
  130. $multi = sql_getfetsel(sql_multi("alcool",$lg),"spip_test_haddock","id_haddock=".sql_quote(4));
  131. if (!($multi == ($res))) {
  132. $err[] = "sql_multi $lg mal rendu : retour : ".htmlentities(utf8_decode($multi)).", attendu : ".htmlentities(utf8_decode($res));
  133. }
  134. }
  135. // affichage
  136. if ($err) {
  137. return '<b>Selections</b><dl><dd>' . join('</dd><dd>', $err) . '</dd></dl>';
  138. }
  139. }
  140. /*
  141. * Selections diverses entre plusieurs tables
  142. * -
  143. */
  144. function test_selections_entre_table() {
  145. $err = $essais = array();
  146. // selection 2 tables
  147. // ! nombre en dur !
  148. $res = sql_select(
  149. array("spip_test_tintin.id_tintin","spip_test_milou.id_milou"),
  150. array("spip_test_tintin", "spip_test_milou"),
  151. array("spip_test_milou.id_tintin=spip_test_tintin.id_tintin"));
  152. if (!($nb=sql_count($res) == 3)) {
  153. $err[] = "selection sur 2 tables avec where en echec : attendu 3 reponses, presntes : $nb";
  154. }
  155. // selection 2 tables avec alias =>
  156. // ! nombre en dur !
  157. $res = sql_select(
  158. array("a.id_tintin AS x","b.id_milou AS y"),
  159. array("a"=>"spip_test_tintin", "b"=>"spip_test_milou"),
  160. array("a.id_tintin=b.id_tintin"));
  161. if (!($nb=sql_count($res) == 3)) {
  162. $err[] = "From avec alias en echec (3 reponses attendues) - presentes : $nb";
  163. }
  164. // selection 2 tables avec alias AS
  165. // ! nombre en dur !
  166. $res = sql_select(
  167. array("a.id_tintin AS x","b.id_milou AS y"),
  168. array("spip_test_tintin AS a", "spip_test_milou AS b"),
  169. array("a.id_tintin=b.id_tintin"));
  170. if (!(($nb=sql_count($res)) == 3)) {
  171. $err[] = "From avec alias AS en echec (3 reponses attendues) - presentes : $nb";
  172. }
  173. // selection 2 tables avec INNER JOIN + ON
  174. // ! nombre en dur !
  175. $res = sql_select(
  176. array("a.id_tintin AS x","b.id_milou AS y"),
  177. array("spip_test_tintin AS a INNER JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)"));
  178. if (!(($nb=sql_count($res)) == 3)) {
  179. $err[] = "Echec INNER JOIN + ON (3 reponses attendues, presentes : $nb)";
  180. }
  181. // selection 2 tables avec LEFT JOIN + ON
  182. // ! nombre en dur !
  183. $res = sql_select(
  184. array("a.id_tintin AS x","b.id_milou AS y"),
  185. array("spip_test_tintin AS a LEFT JOIN spip_test_milou AS b ON (a.id_tintin=b.id_tintin)"));
  186. if (!(($nb=sql_count($res)) == 4)) {
  187. $err[] = "Echec LEFT JOIN + ON (4 reponses attendues, presentes : $nb)";
  188. }
  189. // selection 2 tables avec jointure INNER JOIN + USING
  190. // ! nombre en dur !
  191. // SQLite 2 se plante : il ne connait pas USING (enleve de la requete,
  192. // et du coup ne fait pas correctement la jointure)
  193. $res = sql_select(
  194. array("a.id_tintin AS x","b.id_milou AS y"),
  195. array("spip_test_tintin AS a INNER JOIN spip_test_milou AS b USING (id_tintin)"));
  196. if (!(($nb=sql_count($res)) == 3)) {
  197. $err[] = "Echec INNER JOIN + USING (3 reponses attendues, presentes : $nb)";
  198. }
  199. // affichage
  200. if ($err) {
  201. return '<b>Selections multi tables</b><dl><dd>' . join('</dd><dd>', $err) . '</dd></dl>';
  202. }
  203. }
  204. $err="";
  205. // supprimer les eventuelles tables
  206. $err .= test_drop_table();
  207. // creer les eventuelles tables
  208. $err .= test_create_table();
  209. // inserer les donnees dans la table
  210. $err .= test_insert_data();
  211. // test maj timestamp automatique (select, update, comparaison)
  212. // ! il prend 3 secondes volontairement !
  213. $err .= test_maj_timestamp();
  214. // tests de selections
  215. $err .= test_selections();
  216. // tests de selections entre 2 tables et jointures
  217. $err .= test_selections_entre_table();
  218. // supprimer les tables
  219. $err .= test_drop_table();
  220. if ($err)
  221. die($err);
  222. echo "OK";
  223. ?>