DESIRERY

php

FOUND_ROWS()で件数取得

MySQLで件数を取得する場合COUNT(*)で取得できる。この時にLIMITをかけた場合LIMITが上限になる。LIMITを無視した件数を取得するにはFOUND_ROWS()を使うことで実現できる。

MySQL 5.1 リファレンスマニュアル :: 11.10.3 情報関数

  1. $query = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 10");
  2. $this_rows = mysql_num_rows($query);
  3. $total_rows = mysql_query("SELECT FOUND_ROWS()");
  4. $total_rows = mysql_fetch_array($total_rows);
  5.  
  6. $per = 10;
  7. $total_page = ceil($total_rows[0] / $per) - 1;
  8.  
  9. $record = mysql_fetch_assoc($query);
  10. while($record) {
  11. $record = mysql_fetch_assoc($query);
  12. }

これでLIMITを上限10に制限していても該当件数が100件あれば100が返ってくる。LIMITなど値を動的に変えたいのであればPHPのsprintf使うと作る人は楽。

数年前MySQLネタは書いてたけどやっぱデータ全部消しちゃったのが痛い。当時でMySQLは4.0だったので今ならバージョン気にせずに使えるはず。

jQueryとPHPでJSON実装

Ajaxを使用する場合同じドメイン内であれば問題ないが別ドメインでは動かない。この場合いくつか回避策はあるが今回はJSONでの実装をメモ。環境はjQueryとPHP 5.2.x。Ajaxが別ドメインで動かない理由はセキュリティ上のことであり詳細はWikipediaの「セキュリティ上の制限」参照。

JavaScript Wikipedia

jQueryでは通常のAjaxでは上記のとおり動作しないため、JSONを使用。JSONのデータを取得したらコールバック関数が実行。Webサービスなどですでに展開されているAPIを叩く程度であればこれでデータの取得は完了。

  1. $.getJSON("http://www.t2-designing.com/?callback=?",
  2. function(obj)
  3. {
  4. //callback
  5. }
  6. );

サーバサイドも実装する場合にはJSON形式でデータを返す。PHPでは5.2以降でJSONがデフォルトで組み込まれている。出力するには必要な値を配列に入れていきjson_encode()でさっくり変換。下記は多次元配列にデータを入れた際の簡単な例。callbackを返さないとjQueryでコールバック関数が動かない。

  1. $page_meta (
  2. 'this_page' => 1,
  3. 'max_page' => 10
  4. );
  5.  
  6. $posts(
  7. 'id' => 1
  8. );
  9.  
  10. $data = array(
  11. $page_meta,
  12. $posts
  13. );
  14.  
  15. $json = json_encode($data);
  16.  
  17. header("Content-Type: application/json; charset=utf-8");
  18. echo $_GET['callback']. "(". $json. ")";

このあたりの実装方法についてはIBMのサイトにも記述されています。

JSONP によるクロスドメインの通信: 第 1 回 JSONP と jQuery を組み合わせ、強力なマッシュアップを迅速に作成する

WP Queryの中身

wpplugins

プラグインが微妙だったので自作中。というか細かいところまできっちり英語で解読とか面倒だったんで自作。JSON用のプラグインでいいのがあれば教えてください。やりたいことはWordPressがHTMLで出力している部分をすべてJSONで出力。

まずある特定の条件の場合自作テンプレを読み込むという流れ。読み込んだ後はテンプレタグの変りにWP Queryで何とかなるかなみたいな。カスタムテンプレートの読み込みはデフォルトのテンプレ読み込みの前に処理。元のソースを変更せずにプラグインとすることでWordPressのアップデートにも対処しやすいのかなと。プログラマじゃないので細かいことは知らないけど。

  1. class customTemplate {
  2. function constructor() {
  3. }
  4. }
  5.  
  6. $customTemplate = new customTemplate();
  7. add_action('template_redirect', array(&$customTemplate, 'constructor'));

ということでWordPressのWP Queryオブジェクトの中身。以下はパーマリンクの場合。複数だったらpostsのほうに配列で返ってくる。

  1. object(WP_Query)#166 (41) {
  2. ["query_vars"]=>
  3. array(49) {
  4. ["p"]=>
  5. int(1)
  6. ["year"]=>
  7. int(2009)
  8. ["monthnum"]=>
  9. int(3)
  10. ["day"]=>
  11. int(22)
  12. ["error"]=>
  13. string(0) ""
  14. ["m"]=>
  15. int(0)
  16. ["post_parent"]=>
  17. string(0) ""
  18. ["subpost"]=>
  19. string(0) ""
  20. ["subpost_id"]=>
  21. string(0) ""
  22. ["attachment"]=>
  23. string(0) ""
  24. ["attachment_id"]=>
  25. int(0)
  26. ["name"]=>
  27. string(0) ""
  28. ["hour"]=>
  29. string(0) ""
  30. ["static"]=>
  31. string(0) ""
  32. ["pagename"]=>
  33. string(0) ""
  34. ["page_id"]=>
  35. int(0)
  36. ["second"]=>
  37. string(0) ""
  38. ["minute"]=>
  39. string(0) ""
  40. ["w"]=>
  41. int(0)
  42. ["category_name"]=>
  43. string(0) ""
  44. ["tag"]=>
  45. string(0) ""
  46. ["cat"]=>
  47. string(0) ""
  48. ["tag_id"]=>
  49. string(0) ""
  50. ["author_name"]=>
  51. string(0) ""
  52. ["feed"]=>
  53. string(0) ""
  54. ["tb"]=>
  55. string(0) ""
  56. ["paged"]=>
  57. int(0)
  58. ["comments_popup"]=>
  59. string(0) ""
  60. ["meta_key"]=>
  61. string(0) ""
  62. ["meta_value"]=>
  63. string(0) ""
  64. ["preview"]=>
  65. string(0) ""
  66. ["category__in"]=>
  67. array(0) {
  68. }
  69. ["category__not_in"]=>
  70. array(0) {
  71. }
  72. ["category__and"]=>
  73. array(0) {
  74. }
  75. ["post__in"]=>
  76. array(0) {
  77. }
  78. ["post__not_in"]=>
  79. array(0) {
  80. }
  81. ["tag__in"]=>
  82. array(0) {
  83. }
  84. ["tag__not_in"]=>
  85. array(0) {
  86. }
  87. ["tag__and"]=>
  88. array(0) {
  89. }
  90. ["tag_slug__in"]=>
  91. array(0) {
  92. }
  93. ["tag_slug__and"]=>
  94. array(0) {
  95. }
  96. ["caller_get_posts"]=>
  97. bool(false)
  98. ["suppress_filters"]=>
  99. bool(false)
  100. ["post_type"]=>
  101. string(4) "post"
  102. ["posts_per_page"]=>
  103. int(3)
  104. ["nopaging"]=>
  105. bool(false)
  106. ["comments_per_page"]=>
  107. string(2) "50"
  108. ["order"]=>
  109. string(4) "DESC"
  110. ["orderby"]=>
  111. string(26) "wp271_posts.post_date DESC"
  112. }
  113. ["request"]=>
  114. string(267) " SELECT   wp271_posts.* FROM wp271_posts  WHERE 1=1  AND YEAR(wp271_posts.post_date)='2009' AND MONTH(wp271_posts.post_date)='3' AND DAYOFMONTH(wp271_posts.post_date)='22' AND wp271_posts.ID = 1 AND wp271_posts.post_type = 'post'  ORDER BY wp271_posts.post_date DESC "
  115. ["post_count"]=>
  116. int(1)
  117. ["current_post"]=>
  118. int(-1)
  119. ["in_the_loop"]=>
  120. bool(false)
  121. ["post"]=>
  122. object(stdClass)#114 (26) {
  123. ["ID"]=>
  124. int(1)
  125. ["post_author"]=>
  126. string(1) "2"
  127. ["post_date"]=>
  128. string(19) "2009-03-22 08:11:36"
  129. ["post_date_gmt"]=>
  130. string(19) "2009-03-21 23:11:36"
  131. ["post_content"]=>
  132. string(2017) "p=1の本文"
  133. ["post_title"]=>
  134. string(7) "タイトル"
  135. ["post_category"]=>
  136. string(1) "0"
  137. ["post_excerpt"]=>
  138. string(0) ""
  139. ["post_status"]=>
  140. string(7) "publish"
  141. ["comment_status"]=>
  142. string(4) "open"
  143. ["ping_status"]=>
  144. string(4) "open"
  145. ["post_password"]=>
  146. string(0) ""
  147. ["post_name"]=>
  148. string(11) "hello-world"
  149. ["to_ping"]=>
  150. string(0) ""
  151. ["pinged"]=>
  152. string(0) ""
  153. ["post_modified"]=>
  154. string(19) "2009-03-22 23:48:05"
  155. ["post_modified_gmt"]=>
  156. string(19) "2009-03-22 14:48:05"
  157. ["post_content_filtered"]=>
  158. string(0) ""
  159. ["post_parent"]=>
  160. int(0)
  161. ["guid"]=>
  162. string(37) "http://www.t2-designing.com/blog/?p=1"
  163. ["menu_order"]=>
  164. int(0)
  165. ["post_type"]=>
  166. string(4) "post"
  167. ["post_mime_type"]=>
  168. string(0) ""
  169. ["comment_count"]=>
  170. string(1) "7"
  171. ["ancestors"]=>
  172. array(0) {
  173. }
  174. ["filter"]=>
  175. string(3) "raw"
  176. }
  177. ["comments"]=>
  178. NULL
  179. ["comment_count"]=>
  180. int(0)
  181. ["current_comment"]=>
  182. int(-1)
  183. ["comment"]=>
  184. NULL
  185. ["found_posts"]=>
  186. int(0)
  187. ["max_num_pages"]=>
  188. int(0)
  189. ["max_num_comment_pages"]=>
  190. int(0)
  191. ["is_single"]=>
  192. bool(true)
  193. ["is_preview"]=>
  194. bool(false)
  195. ["is_page"]=>
  196. bool(false)
  197. ["is_archive"]=>
  198. bool(false)
  199. ["is_date"]=>
  200. bool(false)
  201. ["is_year"]=>
  202. bool(false)
  203. ["is_month"]=>
  204. bool(false)
  205. ["is_day"]=>
  206. bool(false)
  207. ["is_time"]=>
  208. bool(false)
  209. ["is_author"]=>
  210. bool(false)
  211. ["is_category"]=>
  212. bool(false)
  213. ["is_tag"]=>
  214. bool(false)
  215. ["is_tax"]=>
  216. bool(false)
  217. ["is_search"]=>
  218. bool(false)
  219. ["is_feed"]=>
  220. bool(false)
  221. ["is_comment_feed"]=>
  222. bool(false)
  223. ["is_trackback"]=>
  224. bool(false)
  225. ["is_home"]=>
  226. bool(false)
  227. ["is_404"]=>
  228. bool(false)
  229. ["is_comments_popup"]=>
  230. bool(false)
  231. ["is_admin"]=>
  232. bool(false)
  233. ["is_attachment"]=>
  234. bool(false)
  235. ["is_singular"]=>
  236. bool(true)
  237. ["is_robots"]=>
  238. bool(false)
  239. ["is_posts_page"]=>
  240. bool(false)
  241. ["is_paged"]=>
  242. bool(false)
  243. ["query"]=>
  244. array(4) {
  245. ["p"]=>
  246. string(1) "1"
  247. ["year"]=>
  248. string(4) "2009"
  249. ["monthnum"]=>
  250. string(2) "03"
  251. ["day"]=>
  252. string(2) "22"
  253. }
  254. ["posts"]=>
  255. &array(1) {
  256. [0]=>
  257. object(stdClass)#114 (26) {
  258. ["ID"]=>
  259. int(1)
  260. ["post_author"]=>
  261. string(1) "2"
  262. ["post_date"]=>
  263. string(19) "2009-03-22 08:11:36"
  264. ["post_date_gmt"]=>
  265. string(19) "2009-03-21 23:11:36"
  266. ["post_content"]=>
  267. string(2017) "p=1の本文"
  268. ["post_title"]=>
  269. string(7) "タイトル"
  270. ["post_category"]=>
  271. string(1) "0"
  272. ["post_excerpt"]=>
  273. string(0) ""
  274. ["post_status"]=>
  275. string(7) "publish"
  276. ["comment_status"]=>
  277. string(4) "open"
  278. ["ping_status"]=>
  279. string(4) "open"
  280. ["post_password"]=>
  281. string(0) ""
  282. ["post_name"]=>
  283. string(11) "hello-world"
  284. ["to_ping"]=>
  285. string(0) ""
  286. ["pinged"]=>
  287. string(0) ""
  288. ["post_modified"]=>
  289. string(19) "2009-03-22 23:48:05"
  290. ["post_modified_gmt"]=>
  291. string(19) "2009-03-22 14:48:05"
  292. ["post_content_filtered"]=>
  293. string(0) ""
  294. ["post_parent"]=>
  295. int(0)
  296. ["guid"]=>
  297. string(37) "http://www.t2-designing.com/blog/?p=1"
  298. ["menu_order"]=>
  299. int(0)
  300. ["post_type"]=>
  301. string(4) "post"
  302. ["post_mime_type"]=>
  303. string(0) ""
  304. ["comment_count"]=>
  305. string(1) "7"
  306. ["ancestors"]=>
  307. array(0) {
  308. }
  309. ["filter"]=>
  310. string(3) "raw"
  311. }
  312. }
  313. }

Popular Posts

  1. WordPressカスタマイズ
  2. jQuery 何番目かを取得
  3. PHP 5
  4. jQueryとPHPでJSON実装
  5. Ajax Comments