Z-PHP_v4


db类进阶

<h3>获取当前db使用的pdo对象</h3> <pre><code>$pdo = $db-&gt;PDO;</code></pre> <h3>获取查询句柄</h3> <p><strong>返回的是查询结果的pdo句柄</strong></p> <pre><code>$h = $db-&gt;where($where)-&gt;Fetch(); while($row = $h-&gt;fetch(\PDO::FETCH_ASSOC)){ // 遍历每行数据... }</code></pre> <h3>事务处理</h3> <ul> <li>开始事务处理 <pre><code>$db-&gt;Begin();</code></pre></li> <li>提交事务 <pre><code>$db-&gt;Commit();</code></pre></li> <li>回滚事务 <pre><code>$db-&gt;Rollback();</code></pre></li> </ul> <h3>子查询 SubQuery()</h3> <pre><code>// 跟 Select() 的用法相同,只是返回构造好的sql语句 $sql = $db-&gt;Where($where)-&gt;SubQuery('uid'); $where['uid IN'] = $sql; //Where条件中加入子查询 $data = $db-&gt;Where($where)-&gt;Select();</code></pre> <h3>合并查询 Merge()</h3> <pre><code>$s1 = $db-&gt;Table($table)-&gt;Where($where)-&gt;SubQuery(); $s2 = $db-&gt;Table($table)-&gt;Where($where)-&gt;SubQuery(); // 合并结果集,默认去除重复行 $data = $db-&gt;Table($table)-&gt;Where($where)-&gt;Merge([$s1, $s2])-&gt;Select(); // 第二个参数 'ALL',不去除重复行 $data = $db-&gt;Table($table)-&gt;Where($where)-&gt;Merge([$s1, $s2], 'ALL')-&gt;Select();</code></pre> <h3>从结果集中再查询 Tmp()</h3> <p><strong>此处Tmp()类似于Table()</strong></p> <pre><code>$tmp = $db-&gt;Table('user')-&gt;Where(['uid &gt;'=&gt;10])-&gt;SubQuery(); $data = $db-&gt;Tmp($tmp)-&gt;Where(['uid &lt;'=&gt;15])-&gt;Select(); // 第二个参数指定别名 $data = $db-&gt;Tmp($tmp, 'a')-&gt;Where(['a.uid &lt;'=&gt;15])-&gt;Select();</code></pre> <h3>查询缓存 Cache()</h3> <p><strong>缓存方式在配置文件DB的 cache_mod 字段</strong></p> <pre><code>$data = $db-&gt;Where($where)-&gt;Cache(60)-&gt;Select(); //缓存60秒 //支持分页缓存,分页参数是固定的,否则也就没必要缓存了 $conf = ['num' =&gt; $num, 'p' =&gt; $p, 'return' =&gt; true]; $data = $db-&gt;Where($where)-&gt;Page($conf)-&gt;Cache(60)-&gt;Select(); $page = $db-&gt;GetPage();</code></pre> <h3>清理缓存 CleanCache()</h3> <pre><code>$db-&gt;CleanCache($db_name, $table); // 删除$db_name库的$table表的缓存($table必须是带有前缀的完整表名,如果为空则是删除$db_name下的所有缓存)</code></pre> <h1>数据库结构文件(包含自动验证,写入回调等)</h1> <p><strong><font color=red>此配置只针对 db类操作有效</font></strong> <strong>自动验证需要用到数据库结构文件(数据库名.base.php),文件位置请参见项目结构</strong></p> <pre><code>return [ /**user表的配置**/ 'user'=&gt;[ /**主键名,建议添加此字段,可以优化查询**/ 'prikey'=&gt;'id', /** * 可操作字段 * 此配置影响 插入,修改,以及不指定查询字段的操作 * 不在此数组中字段无法添加和修改 * 查询数据时未指定Field或Field为*则只返回此数组中的字段 */ 'columns'=&gt;['id', 'uid', 'username', 'passwd', 'regtime'], // 可操作字段 /** * 字段别名 * 此配置影响查询返回的字段名 * 格式是 实际字段名 =&gt; 要返回的字段名 */ 'alias'=&gt;['userid'=&gt;'uid','username'=&gt;'name','password'=&gt;'passwd'], /** * 自动验证规则 * '!'字段(感叹号)是返回时机: * 为null或者留空:需要调用Valid方法执行验证 * 1(默认):某一个条件不满足时就返回 * 2:某一个字段不满足时返回 * 其它:验证完全部字段后返回 */ 'valid'=&gt;[ '!'=&gt;2, 'username'=&gt;[ 'must'=&gt;true, // 不管是否有此字段都要验证 'when'=&gt;'both', //验证时机 'notnull'=&gt;'账号不能空', 'unique'=&gt;'该账号已被注册', function($val, $data, $db){ // 自定义回调函数验证 return $val === filter_var($val, FILTER_SANITIZE_EMAIL) ? 0 : '账号不可含有特殊字符'; } ], 'passwd'=&gt;[ 'length'=&gt;[ 'value'=&gt;[6, 16], 'msg'=&gt;'密码长度在6-16位之间', ], function($val, &amp;$data, $db){ // 注意此处是引用方式使用 $data,以便修改待入库的数据 if(isset($data['repasswd'])){ if($val !== $data['repasswd']) return '确认密码不正确'; unset($data['repasswd']); // 删除字段以便入库 } $data['passwd'] = md5($data['passwd']); //加密密码以便入库 } ] ], /** * 数据库执行写入操作后的回调 * 可接收 $params, $db 两个参数 * $params 参数根据操作不同,会包含[result, data, sql, bind, where]等字段 * $db 是当前的 db 对象 */ 'call'=&gt;[ 'update'=&gt;function($params, $db){ $id = $db-&gt;getWhereByKey('id'); // 获取本次操作数据行的主键 // 执行操作... }, 'insert'=&gt;function($params, $db){ // 执行操作... }, 'delete'=&gt;function($params, $db){ // 执行操作... }, ], ], /**其他数据表**/ 'other'=&gt;[ ... ], ]</code></pre> <h3>规则格式</h3> <ul> <li><strong>没有参数的规则格式: 规则名称 =&gt; 错误信息</strong></li> <li><strong>有参数的规则格式:规则名称 =&gt; [value =&gt; 参数值, msg =&gt; 错误信息, invert =&gt; 此值为真的话验证结果取反]</strong></li> </ul> <h3>支持的规则:</h3> <table> <thead> <tr> <th>名称</th> <th>参数</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>must</td> <td>bool</td> <td>为真时不管是否有此字段都要验证</td> </tr> <tr> <td>when</td> <td>string</td> <td>该字段的验证时机,insert:插入数据时验证,update:更新数据时验证,both:两者都要验证</td> </tr> <tr> <td>notnull</td> <td>无</td> <td>不能空</td> </tr> <tr> <td>unique</td> <td>无</td> <td>唯一</td> </tr> <tr> <td>number</td> <td>无</td> <td>数字</td> </tr> <tr> <td>ip</td> <td>无</td> <td>ip地址</td> </tr> <tr> <td>url</td> <td>无</td> <td>url地址</td> </tr> <tr> <td>email</td> <td>无</td> <td>email地址</td> </tr> <tr> <td>phone</td> <td>无</td> <td>手机号码</td> </tr> <tr> <td>preg</td> <td>string(正则表达式)</td> <td>正则</td> </tr> <tr> <td>int</td> <td>int,array</td> <td>数字范围</td> </tr> <tr> <td>length</td> <td>int,array</td> <td>长度范围</td> </tr> <tr> <td>filter</td> <td>传递给filter_var的参数</td> <td>调用php的 filter_var</td> </tr> <tr> <td>function</td> <td>无</td> <td>函数验证,可接收参数:<br>(待验证的值,原始的数据数组,当前db对象)<br>返回值不为假视作验证失败的提示信息,<br>返回假或无返回视作验证通过</td> </tr> </tbody> </table> <h3>手动执行验证 Valid()</h3> <pre><code>$db-&gt;Valid($data, 'insert', 1); // 成功返回数据$data, 失败返回 false $err = $db-&gt;getError(); // 获取错误信息 // $data 是待验证的数据 // 第二个参数是验证时机:insert 或 update // 第三个参数是返回时机 </code></pre>

页面列表

ITEM_HTML