active_record.html 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8" lang="utf-8">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0" />
  6. <title>Active Record 模式 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档</title>
  7. <link rel="shortcut icon" href="http://codeigniter.org.cn/user_guide/../images/design/favicon.ico" type="image/x-icon" />
  8. <link rel="stylesheet" type="text/css" media="all" href="../userguide.css" />
  9. <link rel="search" href="http://codeigniter.org.cn/user_guide/../CodeIgniterSearch.xml" type="application/opensearchdescription+xml" title="CodeIgniter 搜索"/>
  10. <link rel="canonical" href="http://codeigniter.org.cn/user_guide/database/active_record.html" />
  11. <script type="text/javascript" src="../nav/mootools.js-ver=20130324.js"></script>
  12. <script type="text/javascript" src="../nav/mootools-more.js-ver=20130324.js"></script>
  13. <script type="text/javascript" src="../nav/nav.js-ver=20130324.js"></script>
  14. <script type="text/javascript" src="../nav/user_guide_menu.js-ver=20130324.js"></script>
  15. <meta name="robots" content="all" />
  16. <meta name="author" content="ExpressionEngine Dev Team" />
  17. <meta name="description" content="CodeIgniter 中文手册, CodeIgniter 用户指南, CodeIgniter User Guide, Wiki 文档" />
  18. </head>
  19. <body>
  20. <!-- START NAVIGATION -->
  21. <div id="nav">
  22. <div id="nav_inner">
  23. <script type="text/javascript">create_menu('../');</script>
  24. </div>
  25. </div>
  26. <script type="text/javascript">_setNavigation();</script>
  27. <div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="切换目录" alt="切换目录" /></a></div>
  28. <div id="masthead" class="clearfix">
  29. <div class="topbar-hd"><h1>CodeIgniter 用户指南 版本 2.2.0</h1></div>
  30. <div class="topbar-tip">编辑文档、查看近期更改请 <a href="#">登录</a> 或 <a href="#">注册</a>  <a href="#">找回密码</a></div> <div id="breadcrumb_right"><a href="../toc.html">目录页</a></div>
  31. </div>
  32. <!-- END NAVIGATION -->
  33. <!-- START BREADCRUMB -->
  34. <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
  35. <tr>
  36. <td id="breadcrumb">
  37. <a href="#" target="_blank">CodeIgniter 中国首页</a>&nbsp;&#8250;&nbsp;
  38. <a href="../index.html">用户指南首页</a>&nbsp;&#8250;&nbsp;<a href="index.html">数据库类</a>&nbsp;&#8250;&nbsp;Active Record 模式 </td>
  39. <td id="searchbox">
  40. <form method="get" action="http://www.google.com.hk/search" target="google_window">
  41. <input type="hidden" name="client" value="pub-0176846097796333"></input>
  42. <input type="hidden" name="forid" value="1"></input>
  43. <input type="hidden" name="ie" value="UTF-8"></input>
  44. <input type="hidden" name="oe" value="UTF-8"></input>
  45. <input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.org.cn/user_guide/" />
  46. 搜索用户指南&nbsp;
  47. <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />
  48. &nbsp;
  49. <input type="submit" class="submit" name="sa" value="Go" />
  50. </form>
  51. </td>
  52. </tr>
  53. </table>
  54. <!-- END BREADCRUMB -->
  55. <div style="clear:both;text-align:right;padding: 6px 40px 0 0;">
  56. <a href="#" target="_blank">查看原文</a>
  57. </div>
  58. <!--<br clear="all" />--><!-- START CONTENT -->
  59. <div id="content">
  60. <h1>Active Record 类</h1>
  61. <p>CodeIgniter 使用的是修改过的 Active Record 数据库模式。
  62. 这种模式是以较少的程序代码来实现信息在数据库中的获取,插入,更改。
  63. 有时只用一两行的代码就能完成对数据库的操作。
  64. CodeIgniter 不需要每一个数据库表拥有自己的类。它提供了一个更简单的接口。</p>
  65. <p>不只是简单,使用 Active Record 的一个主要的优点是允许你创建独立的数据库应用程序,因为查询语法是由数据库的适配器来产生的。它可以进行更安全的查询,因为系统会自动的对所有的输入值进行转义。</p>
  66. <p class="important"><strong>注意:</strong> 你如果想要写自己的查询表达式,可以在数据库配置文件中禁止这个类。同时相比 Active Record,使用核心数据库类库和适配器将会使用更少资源。<br /></p>
  67. <ul>
  68. <li><a href="#select">选择数据</a></li>
  69. <li><a href="#insert">插入数据</a></li>
  70. <li><a href="#update">更新数据</a></li>
  71. <li><a href="#delete">删除数据</a></li>
  72. <li><a href="#chaining">链式方法</a></li>
  73. <li><a href="#caching">Active Record 缓存</a></li>
  74. </ul>
  75. <a name="select">&nbsp;</a>
  76. <h1>选择数据</h1>
  77. <p>下面的函数帮助你构建 SQL <strong>SELECT</strong>语句。</p>
  78. <p><strong>备注:如果你正在使用 PHP5,你可以在复杂情况下使用链式语法。本页面底部有具体描述。</strong></p>
  79. <h2>$this-&gt;db-&gt;get();</h2>
  80. <p>运行选择查询语句并且返回结果集。可以获取一个表的全部数据。</p>
  81. <code>$query = $this-&gt;db-&gt;get('mytable');<br />
  82. <br />
  83. // Produces: SELECT * FROM mytable</code>
  84. <p>第二和第三个参数允许你设置一个结果集每页纪录数(limit)和结果集的偏移(offset)</p>
  85. <code>$query = $this-&gt;db-&gt;get('mytable', 10, 20);<br />
  86. <br />
  87. // Produces: SELECT * FROM mytable LIMIT 20, 10 (MySQL语法. 其他数据库在语法上略有不同)</code>
  88. <p>注意:第二参数是每页纪录数,第三个参数是偏移</p>
  89. <p>你会注意到上面的函数由一个变量<kbd>$query</kbd>执行,这个<kbd>$query</kbd>可以用来显示结果集。</p>
  90. <code>$query = $this-&gt;db-&gt;get('mytable');<br />
  91. <br />
  92. foreach ($query-&gt;result() as $row)<br />
  93. &#123;<br />
  94. &nbsp;&nbsp;&nbsp;&nbsp;echo $row-&gt;title;<br />
  95. &#125;</code>
  96. <p>请访问<a href="results.html">查询结果</a>页查看详细的生成结果的方法。</p>
  97. <h2>$this-&gt;db-&gt;get_where();</h2>
  98. <p>跟上面的函数一样,只是它允许你在函数的第二个参数那里添加一个 where 从句,从而不用使用 db-&gt;where() 这个函数:</p>
  99. <code>$query = $this-&gt;db-&gt;get_where('mytable', array('id' => $id), $limit, $offset);</code>
  100. <p>请阅读下面的 where 函数了解更多。</p>
  101. <p class="important">注意: get_where() 在以前的版本中写作 getwhere(),这是已经过时的用法,现已从代码中移除 getwhere()。</p>
  102. <h2>$this-&gt;db-&gt;select();</h2>
  103. <p>允许你在SQL查询中写 SELECT 部分:</p>
  104. <p><code>
  105. $this-&gt;db-&gt;select('title, content, date');<br />
  106. <br />
  107. $query = $this-&gt;db-&gt;get('mytable');<br />
  108. <br />
  109. // Produces: SELECT title, content, date FROM mytable</code></p>
  110. <p class="important"><strong>注意:</strong> 如果你要查询表中的所有列,你可以不用写这个函数。省略后,CodeIgniter 会认为你要查询
  111. 全部列(SELECT *)。</p>
  112. <p>$this-&gt;db-&gt;select() 可接受一个可选的第二个参数。如果你把它设为FALSE, CodeIgniter 将不会使用反引号保护你的字段或者表名
  113. 。这在进行复合查询时很有用。</p>
  114. <p><code>$this-&gt;db-&gt;select("('SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid", FALSE); <br />
  115. $query = $this-&gt;db-&gt;get('mytable');<br />
  116. </code></p>
  117. <h2>$this-&gt;db-&gt;select_max();</h2>
  118. <p>为你的查询编写一个 "SELECT MAX(field)"。你可以选择性的给出第二个参数,以便重命名结果字段名。</p>
  119. <p><code>
  120. $this-&gt;db-&gt;select_max('age');<br />
  121. $query = $this-&gt;db-&gt;get('members');<br />
  122. // Produces: SELECT MAX(age) as age FROM members<br />
  123. <br />
  124. $this-&gt;db-&gt;select_max('age', 'member_age');<br />
  125. $query = $this-&gt;db-&gt;get('members');<br />
  126. // Produces: SELECT MAX(age) as member_age FROM members</code></p>
  127. <h2>$this-&gt;db-&gt;select_min();</h2>
  128. <p>为你的查询编写一个 "SELECT MIN(field)" 。与 <dfn>select_max()</dfn> 相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。</p>
  129. <p><code>
  130. $this-&gt;db-&gt;select_min('age');<br />
  131. $query = $this-&gt;db-&gt;get('members');<br />
  132. // 生成: SELECT MIN(age) as age FROM members</code></p>
  133. <h2>$this-&gt;db-&gt;select_avg();</h2>
  134. <p>为你的查询编写一个 "SELECT AVG(field)" 。与 <dfn>select_max()</dfn> 相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。</p>
  135. <p><code>
  136. $this-&gt;db-&gt;select_avg('age');<br />
  137. $query = $this-&gt;db-&gt;get('members');<br />
  138. // 生成: SELECT AVG(age) as age FROM members</code></p>
  139. <h2>$this-&gt;db-&gt;select_sum();</h2>
  140. <p>为你的查询编写一个 "SELECT SUM(field)" 。与 <dfn>select_max()</dfn> 相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。</p>
  141. <p><code>
  142. $this-&gt;db-&gt;select_sum('age');<br />
  143. $query = $this-&gt;db-&gt;get('members');<br />
  144. // 生成: SELECT SUM(age) as age FROM members</code></p>
  145. <h2>$this-&gt;db-&gt;from();</h2>
  146. <p>允许你编写查询中的FROM部分:</p>
  147. <code>
  148. $this-&gt;db-&gt;select('title, content, date');<br />
  149. $this-&gt;db-&gt;from('mytable');<br />
  150. <br />
  151. $query = $this-&gt;db-&gt;get();<br />
  152. <br />
  153. // 生成: SELECT title, content, date FROM mytable</code>
  154. <p class="important">说明: 正如前面所说,查询中的FROM部分可以在 <dfn>$this-&gt;db-&gt;get()</dfn> 函数中指定,所以你可以根据自己的喜好来选择使用哪个方法。</p>
  155. <h2>$this-&gt;db-&gt;join();</h2>
  156. <p>允许你编写查询中的JOIN部分:</p>
  157. <code>
  158. $this-&gt;db-&gt;select('*');<br />
  159. $this-&gt;db-&gt;from('blogs');<br />
  160. $this-&gt;db-&gt;join('comments', 'comments.id = blogs.id');<br />
  161. <br />
  162. $query = $this-&gt;db-&gt;get();<br />
  163. <br />
  164. // 生成: <br />
  165. // SELECT * FROM blogs<br />
  166. // JOIN comments ON comments.id = blogs.id<br />
  167. </code>
  168. <p>如果你想要在查询中使用多个连接,可以多次调用本函数。</p>
  169. <p>如果你需要指定 JOIN 的类型,你可以通过本函数的第三个参数来指定。可选项包括:left, right, outer, inner, left outer, 以及 right outer.</p>
  170. <code>
  171. $this-&gt;db-&gt;join('comments', 'comments.id = blogs.id', <strong>'left'</strong>);<br />
  172. <br />
  173. // 生成: LEFT JOIN comments ON comments.id = blogs.id</code>
  174. <h2>$this-&gt;db-&gt;where();</h2>
  175. <p>本函数允许你使用四种方法中的一种来设置 <strong>WHERE</strong> 子句:</p>
  176. <p class="important"><strong>说明:</strong> 传递给本函数的所有值都会被自动转义,以便生成安全的查询。</p>
  177. <ol>
  178. <li><strong>简单的 key/value 方法:</strong>
  179. <code>$this-&gt;db-&gt;where('name', $name);
  180. <br /><br />// 生成: WHERE name = 'Joe'
  181. </code>
  182. <p>请注意等号已经为你添加。</p>
  183. <p>如果你多次调用本函数,那么这些条件会被 <var>AND</var> 连接起来:</p>
  184. <code>$this-&gt;db-&gt;where('name', $name);<br />
  185. $this-&gt;db-&gt;where('title', $title);<br />
  186. $this-&gt;db-&gt;where('status', $status);
  187. <br /><br />// WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
  188. </code>
  189. </li>
  190. <li><strong>自定义 key/value 方法:</strong>
  191. <p>你可以在第一个参数中包含一个运算符,以便控制比较:</p>
  192. <code>$this-&gt;db-&gt;where('name !=', $name);<br />
  193. $this-&gt;db-&gt;where('id <', $id);
  194. <br /><br />// 生成: WHERE name != 'Joe' AND id < 45</code></li>
  195. <li><strong>关联数组方法:</strong>
  196. <code>
  197. $array = array('name' => $name, 'title' => $title, 'status' => $status);<br /><br />
  198. $this-&gt;db-&gt;where($array);
  199. <br /><br />// 生成: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
  200. </code>
  201. <p>使用这个方法时你也可以包含运算符:</p>
  202. <code>
  203. $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);<br /><br />
  204. $this-&gt;db-&gt;where($array);</code>
  205. </li>
  206. <li><strong>自定义字符串:</strong>
  207. <p>你可以手动的编写子句:</p>
  208. <code>
  209. $where = "name='Joe' AND status='boss' OR status='active'";<br /><br />
  210. $this-&gt;db-&gt;where($where);</code>
  211. </li>
  212. </ol>
  213. <p>$this-&gt;db-&gt;where() 接受可选的第三个参数。如果你将它设置为 FALSE, CodeIgniter 将不会为你那些包含反勾号的字段名或表名提供保护。</p>
  214. <p><code> $this-&gt;db-&gt;where('MATCH (field) AGAINST (&quot;value&quot;)', NULL, FALSE);<br />
  215. </code></p>
  216. <h2>$this-&gt;db-&gt;or_where();</h2>
  217. <p>本函数与上面的那个几乎完全相同,唯一的区别是本函数生成的子句是用 OR 来连接的:</p>
  218. <code>
  219. $this-&gt;db-&gt;where('name !=', $name);<br />
  220. $this-&gt;db-&gt;or_where('id >', $id);
  221. <br />
  222. <br />// 生成: WHERE name != 'Joe' OR id > 50</code>
  223. <p class="important">说明: or_where() 以前被叫作 orwhere(), 后者已经过时,现已从代码中移除 orwhere()。</p>
  224. <h2>$this-&gt;db-&gt;where_in();</h2>
  225. <p>生成一段 WHERE field IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来。</p>
  226. <p><code>
  227. $names = array('Frank', 'Todd', 'James');<br />
  228. $this-&gt;db-&gt;where_in('username', $names);<br />
  229. // 生成: WHERE username IN ('Frank', 'Todd', 'James')</code></p>
  230. <h2>$this-&gt;db-&gt;or_where_in();</h2>
  231. <p>生成一段 WHERE field IN ('item', 'item') 查询语句,如果合适的话,用 OR 连接起来。</p>
  232. <p><code>
  233. $names = array('Frank', 'Todd', 'James');<br />
  234. $this-&gt;db-&gt;or_where_in('username', $names);<br />
  235. // 生成: OR username IN ('Frank', 'Todd', 'James')</code></p>
  236. <h2>$this-&gt;db-&gt;where_not_in();</h2>
  237. <p>生成一段 WHERE field NOT IN ('item', 'item') 查询语句,如果合适的话,用 AND 连接起来。</p>
  238. <p><code>
  239. $names = array('Frank', 'Todd', 'James');<br />
  240. $this-&gt;db-&gt;where_not_in('username', $names);<br />
  241. // 生成: WHERE username NOT IN ('Frank', 'Todd', 'James')</code></p>
  242. <h2>$this-&gt;db-&gt;or_where_not_in();</h2>
  243. <p>生成一段 WHERE field NOT IN ('item', 'item') 查询语句,如果合适的话,用 OR 连接起来。</p>
  244. <p><code>
  245. $names = array('Frank', 'Todd', 'James');<br />
  246. $this-&gt;db-&gt;or_where_not_in('username', $names);<br />
  247. // 生成: OR username NOT IN ('Frank', 'Todd', 'James')</code></p>
  248. <h2>$this-&gt;db-&gt;like();</h2>
  249. <p>本函数允许你生成 <strong>LIKE</strong> 子句,在做查询时非常有用。</p>
  250. <p class="important"><strong>说明:</strong> 传递给本函数的所有值都会被自动转义。</p>
  251. <ol>
  252. <li><strong>简单 key/value 方式:</strong>
  253. <code>$this-&gt;db-&gt;like('title', 'match');
  254. <br /><br />// 生成: WHERE title LIKE '%match%' </code>
  255. <p>如果你多次调用本函数,那么这些条件将由 <var>AND</var> 连接起来:</p>
  256. <code>$this-&gt;db-&gt;like('title', 'match');<br />
  257. $this-&gt;db-&gt;like('body', 'match');
  258. <br /><br />
  259. // WHERE title LIKE '%match%' AND body LIKE '%match%'</code>
  260. 如果你想要控制通配符(%)所出现的位置,你可以使用可选的第三个参数。可用的选项是 'before', 'after' 以及 'both' (这是默认值)。
  261. <code>$this-&gt;db-&gt;like('title', 'match', 'before');
  262. <br />
  263. // 生成: WHERE title LIKE '%match' <br />
  264. <br />
  265. $this-&gt;db-&gt;like('title', 'match', 'after'); <br />
  266. // 生成: WHERE title LIKE 'match%' <br />
  267. <br />
  268. $this-&gt;db-&gt;like('title', 'match', 'both'); <br />
  269. // 生成: WHERE title LIKE '%match%' </code> </li>
  270. 如果你不想使用百分号(%),你可以给第三个可选的参数传递一个'none'。
  271. <code>
  272. $this-&gt;db-&gt;like('title', 'match', 'none'); <br />
  273. // Produces: WHERE title LIKE 'match'
  274. </code>
  275. <li><strong>关联数组方式:</strong>
  276. <code>
  277. $array = array('title' => $match, 'page1' => $match, 'page2' => $match);<br /><br />
  278. $this-&gt;db-&gt;like($array);
  279. <br /><br />// WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'</code></li>
  280. </ol>
  281. <h2>$this-&gt;db-&gt;or_like();</h2>
  282. <p>本函数与上面那个函数几乎完全相同,唯一的区别是多个实例之间是用 OR 连接起来的:</p>
  283. <code>
  284. $this-&gt;db-&gt;like('title', 'match');<br />
  285. $this-&gt;db-&gt;or_like('body', $match);
  286. <br />
  287. <br />// WHERE title LIKE '%match%' OR body LIKE '%match%'</code>
  288. <p class="important">说明: or_like() 曾经被称为 orlike(), 后者已经过时,现已从代码中移除 orlike()。</p>
  289. <h2>$this-&gt;db-&gt;not_like();</h2>
  290. <p>本函数与 <strong>like()</strong> 几乎完全相同,唯一的区别是它生成 NOT LIKE 语句:</p>
  291. <code> $this-&gt;db-&gt;not_like('title', 'match');<br />
  292. <br />
  293. // WHERE title NOT LIKE '%match%</code>
  294. <h2>$this-&gt;db-&gt;or_not_like();</h2>
  295. <p>本函数与 <strong>not_like()</strong> 几乎完全相同,唯一的区别是多个实例之间是用 OR 连接起来的:</p>
  296. <code> $this-&gt;db-&gt;like('title', 'match');<br />
  297. $this-&gt;db-&gt;or_not_like('body', 'match'); <br />
  298. <br />
  299. // WHERE title LIKE '%match%' OR body NOT LIKE '%match%'</code>
  300. <h2>$this-&gt;db-&gt;group_by();</h2>
  301. <p>允许你编写查询语句中的 GROUP BY 部分:</p>
  302. <code>$this-&gt;db-&gt;group_by("title");
  303. <br /><br />// 生成: GROUP BY title
  304. </code>
  305. <p>你也可以把多个值作为数组传递过去:</p>
  306. <code>$this-&gt;db-&gt;group_by(array("title", "date"));
  307. <br />
  308. <br />// 生成: GROUP BY title, date</code>
  309. <p class="important">说明: group_by() 曾经被称为 groupby(), 后者已经过时,现已从代码中移除 groupby()。</p>
  310. <h2> $this-&gt;db-&gt;distinct();<br />
  311. </h2>
  312. <p>为查询语句添加 &quot;DISTINCT&quot; 关键字:</p>
  313. <p><code>$this-&gt;db-&gt;distinct();<br />
  314. $this-&gt;db-&gt;get('table');<br />
  315. <br />
  316. // 生成: SELECT DISTINCT * FROM table</code></p>
  317. <h2>$this-&gt;db-&gt;having();</h2>
  318. <p>允许你为你的查询语句编写 HAVING 部分。有两种语法形式,一个或两个参数都可以:</p>
  319. <code>$this-&gt;db-&gt;having('user_id = 45');
  320. <br />
  321. // 生成: HAVING user_id = 45<br />
  322. <br />
  323. $this-&gt;db-&gt;having('user_id', 45); <br />
  324. // 生成: HAVING user_id = 45<br />
  325. <br />
  326. </code>
  327. <p>你也可以把多个值通过数组传递过去:</p>
  328. <p><code>$this-&gt;db-&gt;having(array('title =' => 'My Title', 'id &lt;' =&gt; $id)); <br />
  329. <br />
  330. // 生成: HAVING title = 'My Title' AND id < 45</code></p>
  331. <p>如果你正在使用一个由CodeIgniter进行转义保护的数据库,为了避免内容转义,你可以传递可选的第三个参数,并将其设置为FALSE。</p>
  332. <p><code>$this-&gt;db-&gt;having('user_id', 45); <br />
  333. // 生成: HAVING `user_id` = 45 (在诸如MySQL等数据库中)
  334. <br />
  335. $this-&gt;db-&gt;having('user_id', 45, FALSE); <br />
  336. // 生成: HAVING user_id = 45</code></p>
  337. <h2>$this-&gt;db-&gt;or_having();</h2>
  338. <p>与 having() 函数几乎完全一样,唯一的区别是多个子句之间是用 &quot;OR&quot; 分隔的。</p>
  339. <h2>$this-&gt;db-&gt;order_by();</h2>
  340. <p>帮助你设置一个 ORDER BY 子句。第一个参数是你想要排序的字段名。第二个参数设置结果的顺序,可用的选项包括 <kbd>asc</kbd> (升序)或 <kbd>desc</kbd>(降序), 或 <kbd>random</kbd>(随机)。</p>
  341. <code>$this-&gt;db-&gt;order_by("title", "desc");
  342. <br />
  343. <br />// 生成: ORDER BY title DESC
  344. </code>
  345. <p>你也可以在第一个参数中传递你自己的字符串:</p>
  346. <code>$this-&gt;db-&gt;order_by('title desc, name asc');
  347. <br />
  348. <br />// 生成: ORDER BY title DESC, name ASC
  349. </code>
  350. <p>或者,多次调用本函数就可以排序多个字段。</p>
  351. <p><code>$this-&gt;db-&gt;order_by("title", "desc");<br />
  352. $this-&gt;db-&gt;order_by("name", "asc"); <br />
  353. <br />
  354. // 生成: ORDER BY title DESC, name ASC
  355. </code></p>
  356. <p class="important">说明: order_by() 曾经被称为 orderby(), 后者已经过时,现已从代码中移除 orderby()。</p>
  357. <p class="important">说明: 目前 Oracle 和 MSSQL 的驱动还不支持随机排序,将被默认设置为 'ASC'(升序)。</p>
  358. <h2>$this-&gt;db-&gt;limit();</h2>
  359. <p>限制查询所返回的结果数量:</p>
  360. <code>
  361. $this-&gt;db-&gt;limit(10);<br />
  362. <br />
  363. // 生成: LIMIT 10</code>
  364. <p>第二个参数设置的是结果偏移量。</p>
  365. <code>
  366. $this-&gt;db-&gt;limit(10, 20);<br />
  367. <br />
  368. // 生成: LIMIT 20, 10 (仅限MySQL中。其它数据库有稍微不同的语法)</code>
  369. <h2>$this-&gt;db-&gt;count_all_results();</h2>
  370. <p>允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。范例:</p>
  371. <code>echo $this-&gt;db-&gt;count_all_results('<var>my_table</var>');<br />
  372. // 生成一个整数,例如 25<br />
  373. <br />
  374. $this-&gt;db-&gt;like('title', 'match');<br />
  375. $this-&gt;db-&gt;from('<var>my_table</var>');<br />
  376. echo $this-&gt;db-&gt;count_all_results();<br />
  377. // 生成一个整数,例如 17 </code>
  378. <a name="insert">&nbsp;</a>
  379. <h1>插入数据</h1>
  380. <h2>$this-&gt;db-&gt;insert();</h2>
  381. <p>生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 <strong>数组</strong> 或一个 <strong>对象</strong>。下面是一个使用数组的例子:</p>
  382. <code>
  383. $data = array(<br />
  384. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'My title' ,<br />
  385. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'My Name' ,<br />
  386. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'My date'<br />
  387. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
  388. <br />
  389. $this-&gt;db-&gt;insert('mytable', $data);
  390. <br /><br />
  391. // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')</code>
  392. <p>第一个参数包含表名,第二个是一个包含数据的关联数组。</p>
  393. <p>下面是一个使用对象的例子:</p>
  394. <code>
  395. /*<br />
  396. &nbsp;&nbsp;&nbsp;&nbsp;class Myclass &#123;<br />
  397. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $title = 'My Title';<br />
  398. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $content = 'My Content';<br />
  399. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $date = 'My Date';<br />
  400. &nbsp;&nbsp;&nbsp;&nbsp;&#125;<br />
  401. */<br />
  402. <br />
  403. $object = new Myclass;<br />
  404. <br />
  405. $this-&gt;db-&gt;insert('mytable', $object);
  406. <br /><br />
  407. // Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')</code>
  408. <p>第一个参数包含表名,第二个是一个对象。</p>
  409. <p class="important"><strong>注意:</strong> 所有的值已经被自动转换为安全查询。</p>
  410. <h2>$this-&gt;db-&gt;insert_batch();</h2>
  411. <p>生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 <strong>数组</strong> 或一个 <strong>对象</strong>。下面是一个使用数组的例子:</p>
  412. <code>
  413. $data = array(<br/>
  414. &nbsp;&nbsp;&nbsp;array(<br />
  415. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'My title' ,<br />
  416. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'My Name' ,<br />
  417. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'My date'<br />
  418. &nbsp;&nbsp;&nbsp;),<br />
  419. &nbsp;&nbsp;&nbsp;array(<br />
  420. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'Another title' ,<br />
  421. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'Another Name' ,<br />
  422. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'Another date'<br />
  423. &nbsp;&nbsp;&nbsp;)<br/>
  424. );<br />
  425. <br />
  426. $this-&gt;db-&gt;insert_batch('mytable', $data);
  427. <br /><br />
  428. //生成: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')</code>
  429. <p>第一个参数包含表名,第二个是一个包含数据的关联数组。</p>
  430. <p class="important"><strong>注意:</strong> 所有的值已经被自动转换为安全查询。</p>
  431. <h2>$this-&gt;db-&gt;set();</h2>
  432. <p>本函数使您能够设置<dfn>inserts</dfn>(插入)或<dfn>updates</dfn>(更新)值。</p>
  433. <p><strong>它可以用来代替那种直接传递数组给插入和更新函数的方式:</strong> </p>
  434. <code>$this-&gt;db-&gt;set('name', $name);
  435. <br />
  436. $this-&gt;db-&gt;insert('mytable');
  437. <br /><br />
  438. // 生成: INSERT INTO mytable (name) VALUES ('&#123;$name&#125;')</code>
  439. <p>如果你多次调用本函数,它们会被合理地组织起来,这取决于你执行的是插入操作还是更新操作:</p>
  440. <code>$this-&gt;db-&gt;set('name', $name);<br />
  441. $this-&gt;db-&gt;set('title', $title);<br />
  442. $this-&gt;db-&gt;set('status', $status);<br />
  443. $this-&gt;db-&gt;insert('mytable'); </code>
  444. <p><strong>set()</strong> 也接受可选的第三个参数($escape),如果此参数被设置为 FALSE,就可以阻止数据被转义。为了说明这种差异,这里将对 包含转义参数 和 不包含转义参数 这两种情况的 set() 函数做一个说明。</p>
  445. <p><code>$this-&gt;db-&gt;set('field', 'field+1', FALSE);<br />
  446. $this-&gt;db-&gt;insert('mytable'); <br />
  447. // 得到 INSERT INTO mytable (field) VALUES (field+1)<br />
  448. <br />
  449. $this-&gt;db-&gt;set('field', 'field+1');<br />
  450. $this-&gt;db-&gt;insert('mytable'); <br />
  451. // 得到 INSERT INTO mytable (field) VALUES ('field+1')</code></p>
  452. <p>你也可以将一个关联数组传递给本函数:</p>
  453. <code>
  454. $array = array('name' => $name, 'title' => $title, 'status' => $status);<br /><br />
  455. $this-&gt;db-&gt;set($array);<br />
  456. $this-&gt;db-&gt;insert('mytable');
  457. </code>
  458. <p>或者一个对象也可以:</p>
  459. <code>
  460. /*<br />
  461. &nbsp;&nbsp;&nbsp;&nbsp;class Myclass &#123;<br />
  462. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $title = 'My Title';<br />
  463. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $content = 'My Content';<br />
  464. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $date = 'My Date';<br />
  465. &nbsp;&nbsp;&nbsp;&nbsp;&#125;<br />
  466. */<br />
  467. <br />
  468. $object = new Myclass;<br />
  469. <br />
  470. $this-&gt;db-&gt;set($object);<br />
  471. $this-&gt;db-&gt;insert('mytable');
  472. </code>
  473. <a name="update">&nbsp;</a>
  474. <h1>更新数据</h1>
  475. <h2>$this-&gt;db-&gt;update();</h2>
  476. <p>根据你提供的数据生成并执行一条update(更新)语句。你可以将一个<strong>数组</strong>或者<strong>对象</strong>传递给本函数。这里是一个使用数组的例子:</p>
  477. <code>
  478. $data = array(<br />
  479. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => $title,<br />
  480. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => $name,<br />
  481. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => $date<br />
  482. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
  483. <br />
  484. $this-&gt;db-&gt;where('id', $id);<br />
  485. $this-&gt;db-&gt;update('mytable', $data);
  486. <br /><br />
  487. // 生成:<br />
  488. // UPDATE mytable <br />
  489. // SET title = '&#123;$title&#125;', name = '&#123;$name&#125;', date = '&#123;$date&#125;'<br />
  490. // WHERE id = $id</code>
  491. <p>或者你也可以传递一个对象:</p>
  492. <code>
  493. /*<br />
  494. &nbsp;&nbsp;&nbsp;&nbsp;class Myclass &#123;<br />
  495. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $title = 'My Title';<br />
  496. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $content = 'My Content';<br />
  497. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $date = 'My Date';<br />
  498. &nbsp;&nbsp;&nbsp;&nbsp;&#125;<br />
  499. */<br />
  500. <br />
  501. $object = new Myclass;<br />
  502. <br />
  503. $this-&gt;db-&gt;where('id', $id);<br />
  504. $this-&gt;db-&gt;update('mytable', $object);
  505. <br />
  506. <br />
  507. // 生成:<br />
  508. // UPDATE mytable <br />
  509. // SET title = '&#123;$title&#125;', name = '&#123;$name&#125;', date = '&#123;$date&#125;'<br />
  510. // WHERE id = $id</code>
  511. <p class="important"><strong>说明:</strong> 所有值都会被自动转义,以便生成安全的查询。</p>
  512. <p>你会注意到 <dfn>$this-&gt;db-&gt;where()</dfn> 函数的用法,它允许你设置 WHERE 子句。你可以有选择性地将这一信息直接以字符串的形式传递给 update 函数:</p>
  513. <code>$this-&gt;db-&gt;update('mytable', $data, "id = 4");</code>
  514. <p>或者是一个数组:</p>
  515. <code>$this-&gt;db-&gt;update('mytable', $data, array('id' => $id));</code>
  516. <p>在进行更新时,你还可以使用上面所描述的 <dfn>$this-&gt;db-&gt;set()</dfn> 函数。</p>
  517. <h2>$this-&gt;db-&gt;update_batch();</h2>
  518. <p>生成一条update命令是以你提供的数据为基础的,并执行查询。你可以传递一个数组或对象的参数给update_batch()函数。下面是一个使用一个数组作为参数的示例:Generates an update string based on the data you supply, and runs the query. You can either pass an
  519. <strong>array</strong> or an <strong>object</strong> to the function. Here is an example using an array:</p>
  520. <code>
  521. $data = array(<br/>
  522. &nbsp;&nbsp;&nbsp;array(<br />
  523. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'My title' ,<br />
  524. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'My Name 2' ,<br />
  525. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'My date 2'<br />
  526. &nbsp;&nbsp;&nbsp;),<br />
  527. &nbsp;&nbsp;&nbsp;array(<br />
  528. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'Another title' ,<br />
  529. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'Another Name 2' ,<br />
  530. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'Another date 2'<br />
  531. &nbsp;&nbsp;&nbsp;)<br/>
  532. );<br />
  533. <br />
  534. $this-&gt;db-&gt;update_batch('mytable', $data, 'title');
  535. <br /><br />
  536. // Produces: <br />
  537. // UPDATE `mytable` SET `name` = CASE<br />
  538. // WHEN `title` = 'My title' THEN 'My Name 2'<br />
  539. // WHEN `title` = 'Another title' THEN 'Another Name 2'<br />
  540. // ELSE `name` END,<br />
  541. // `date` = CASE <br />
  542. // WHEN `title` = 'My title' THEN 'My date 2'<br />
  543. // WHEN `title` = 'Another title' THEN 'Another date 2'<br />
  544. // ELSE `date` END<br />
  545. // WHERE `title` IN ('My title','Another title')</code>
  546. <p>参数1:表名 参数2:如上所示的二维数组 参数3:键名.</p>
  547. <p class="important"><strong>提示:</strong> 所有的值都会自动进行安全性过滤.</p>
  548. <a name="delete">&nbsp;</a>
  549. <h1>删除数据</h1>
  550. <h2>$this-&gt;db-&gt;delete();</h2>
  551. <p>生成并执行一条DELETE(删除)语句。</p>
  552. <code>
  553. $this-&gt;db-&gt;delete('mytable', array('id' => $id));
  554. <br /><br />
  555. // 生成:<br />
  556. // DELETE FROM mytable <br />
  557. // WHERE id = $id</code>
  558. <p>第一个参数是表名,第二个参数是where子句。你可以不传递第二个参数,使用 <dfn>where()</dfn> 或者 <dfn>or_where()</dfn> 函数来替代它:</p>
  559. <p><code> $this-&gt;db-&gt;where('id', $id);<br />
  560. $this-&gt;db-&gt;delete('mytable'); <br />
  561. <br />
  562. // 生成:<br />
  563. // DELETE FROM mytable <br />
  564. // WHERE id = $id</code></p>
  565. <p>如果你想要从一个以上的表中删除数据,你可以将一个包含了多个表名的数组传递给delete()函数。</p>
  566. <p><code>$tables = array('table1', 'table2', 'table3');<br />
  567. $this-&gt;db-&gt;where('id', '5');<br />
  568. $this-&gt;db-&gt;delete($tables);</code></p>
  569. <p>如果你想要删除表中的全部数据,你可以使用 <dfn>truncate()</dfn> 函数,或者 <dfn>empty_table()</dfn> 函数。</p>
  570. <p class="important"><strong>说明:</strong>delete方法貌似现在没有办法接收排序参数</p>
  571. <p>假设我想删除早期的用户登录日志信息,我的语法可能会是根据登录时间正序排列,然后跟上limit已经有的总日志条数减去想保留的条数,delete方法没有这个参数用来接收,那么我只能直接使用query传递我的sql了</p>
  572. <h2>$this-&gt;db-&gt;empty_table();</h2>
  573. <p>生成并执行一条DELETE(删除)语句。<code> $this-&gt;db-&gt;empty_table('mytable'); <br />
  574. <br />
  575. // 生成<br />
  576. // DELETE FROM mytable</code></p>
  577. <h2>$this-&gt;db-&gt;truncate();</h2>
  578. <p>生成并执行一条TRUNCATE(截断)语句。</p>
  579. <code> $this-&gt;db-&gt;from('mytable'); <br />
  580. $this-&gt;db-&gt;truncate(); <br />
  581. // 或 <br />
  582. $this-&gt;db-&gt;truncate('mytable'); <br />
  583. <br />
  584. // 生成:<br />
  585. // TRUNCATE TABLE mytable <br />
  586. </code>
  587. <p class="important"><strong>说明:</strong> 如果 TRUNCATE 命令不可用,truncate() 将会以 &quot;DELETE FROM table&quot; 的方式执行。</p>
  588. <h1><a name="chaining">&nbsp;</a>链式方法</h1>
  589. <p>链式方法允许你以连接多个函数的方式简化你的语法。考虑一下这个范例:</p>
  590. <code>
  591. <dfn>$this-&gt;db</dfn><kbd>-&gt;</kbd><var>select</var>('title')<kbd>-&gt;</kbd><var>from</var>('mytable')<kbd>-&gt;</kbd><var>where</var>('id', $id)<kbd>-&gt;</kbd><var>limit</var>(10, 20);<br />
  592. <br />
  593. $query = $this-&gt;db-&gt;get();</code>
  594. <p class="important"><strong>说明:</strong> 链式方法只能在PHP 5下面运行。</p>
  595. <p>&nbsp;</p>
  596. <h1><a name="caching">&nbsp;</a>Active Record 缓存</h1>
  597. <p>尽管不是 &quot;真正的&quot; 缓存,Active Record 允许你将查询的某个特定部分保存(或&quot;缓存&quot;)起来,以便在你的脚本执行之后重用。一般情况下,当一次Active Record调用结束,所有已存储的信息都会被重置,以便下一次调用。如果开启缓存,你就可以使信息避免被重置,方便你进行重用。</p>
  598. <p>缓存调用是累加的。如果你调用了两次有缓存的 select(),然后再调用两次没有缓存的 select(),这会导致 select() 被调用4次。有三个可用的缓存函数:</p>
  599. <h2>$this-&gt;db-&gt;start_cache()</h2>
  600. <p>本函数必须被用来开启缓存。所有类型正确的(下面给出了支持的查询类型) Active Record 查询都会被存储起来供以后使用。</p>
  601. <h2>$this-&gt;db-&gt;stop_cache()</h2>
  602. <p>本函数可以被用来停止缓存。</p>
  603. <h2>$this-&gt;db-&gt;flush_cache()</h2>
  604. <p>本函数从Active Record 缓存中删除全部项目。</p>
  605. <p>这里是一个使用范例:</p>
  606. <p><code>$this-&gt;db-&gt;start_cache();<br />
  607. $this-&gt;db-&gt;select('field1');<br />
  608. $this-&gt;db-&gt;stop_cache();<br /><br />
  609. $this-&gt;db-&gt;get('tablename');<br />
  610. <br />
  611. //Generates: SELECT `field1` FROM (`tablename`)<br />
  612. <br />
  613. $this-&gt;db-&gt;select('field2');<br />
  614. $this-&gt;db-&gt;get('tablename');<br />
  615. <br />
  616. //Generates: SELECT `field1`, `field2` FROM (`tablename`)<br />
  617. <br />
  618. $this-&gt;db-&gt;flush_cache();<br />
  619. <br />
  620. $this-&gt;db-&gt;select('field2');<br />
  621. $this-&gt;db-&gt;get('tablename');<br />
  622. <br />
  623. //Generates: SELECT `field2` FROM (`tablename`)</code></p>
  624. <p class="important"> <strong>说明:</strong> 下列语句能够被缓存: select, from, join, where, like, group_by, having, order_by, set</p><p>&nbsp;</p>
  625. <div id="Contributors">
  626. 翻译贡献者:
  627. atans, aykirk, Drice, Fanbin, guapibai, Hex, houlianshan, huanxiangwu, imjie, k7gxn56, localtest, loiynet, longjianghu, ripen, thankwsx, yinzhili, zhangminghua218</div>
  628. <div id="DocDate">
  629. 最后修改: 2014-01-26 23:35:03</div>
  630. </div>
  631. <!-- END CONTENT -->
  632. <div id="footer">
  633. <p>
  634. 上一个主题:&nbsp;&nbsp;<a href="helpers.html">查询辅助函数</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a href="#top">页首</a>
  635. &nbsp;&middot;&nbsp;&nbsp;<a href="../index.html">用户指南首页</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;下一个主题:&nbsp;&nbsp;<a href="transactions.html">事务</a> </p>
  636. <p><a href="#">CodeIgniter</a> &nbsp;&middot;&nbsp; 版权所有 &#169; 2006-2013 &nbsp;&middot;&nbsp; <a href="#">Ellislab, Inc.</a></p>
  637. <p>中文化: <a href="#">CodeIgniter 中国</a> &nbsp;&middot;&nbsp; 制作: Hex &nbsp;&middot;&nbsp; 版本: 1.30 &nbsp;&middot;&nbsp; 鸣谢: 子非鱼</p>
  638. </div>
  639. </body>
  640. </html>