使用thinkphp和php中的问题-preg_replace(), 链式查询
2015-07-14 14:17
609 查看
这篇又是讲一下使用thinkphp时遇到的问题:
1.关于链式查询
$post_db = D('Post');
$total = $post_db;
$total=$total->where($where1);
$total=$total->where($where2);
$list=$total->order($order)->limit($limit)->select();
$count=$total->count();
这时我们发现,$count 的值并不是我们查出来的数量,而是总量,而且表达式
$total=$total
->where($where1); 与 $total->where($where1);的效果是一样的,$total的值会改变,如果我们需要查询总数时,只能重新查询一遍,这是thinkphp里很不人性的功能;
2. php的原生函数:preg_replace()
需求:想通过preg_replace()修改文本里的特定值
最开始使用如下:(备份SQL时修改自增的起始值,为什么有这个需求呢,这牵扯到数据库备份时,备份log文件,分批备份,而此时log也一直在增加,导致自增值失配,在还原数据时有问题)
preg_replace('/AUTO_INCREMENT=(\d+)/', 'AUTO_INCREMENT='.“$1” + 2, $sql);
我们发现会被替换成 AUTO_INCREMENT= 2,而$1不被识别,
而单独使用'AUTO_INCREMENT='.“$1”,$1可以识别,
那么问题来了,看样子preg_replace() 的第二个参数如果引用了如“$1”类似的变量,变量的使用会有问题,没去查具体原因,
我的解决方法是:
if(preg_match('/AUTO_INCREMENT=(\d+)/',$sql,$matches)){
$auto_int_start = $matches[1] + (int)($count/C('DATA_BACKUP_EXPORT_LIMIT'));
}
$sql = preg_replace('/AUTO_INCREMENT=(\d+)/', 'AUTO_INCREMENT='.$auto_int_start, $sql);
那就是事先把只计算好,再替换,后面再看看具体原因吧,如果有同学知道原理,也可以留言告诉我,3Q!
1.关于链式查询
$post_db = D('Post');
$total = $post_db;
$total=$total->where($where1);
$total=$total->where($where2);
$list=$total->order($order)->limit($limit)->select();
$count=$total->count();
这时我们发现,$count 的值并不是我们查出来的数量,而是总量,而且表达式
$total=$total
->where($where1); 与 $total->where($where1);的效果是一样的,$total的值会改变,如果我们需要查询总数时,只能重新查询一遍,这是thinkphp里很不人性的功能;
2. php的原生函数:preg_replace()
需求:想通过preg_replace()修改文本里的特定值
最开始使用如下:(备份SQL时修改自增的起始值,为什么有这个需求呢,这牵扯到数据库备份时,备份log文件,分批备份,而此时log也一直在增加,导致自增值失配,在还原数据时有问题)
preg_replace('/AUTO_INCREMENT=(\d+)/', 'AUTO_INCREMENT='.“$1” + 2, $sql);
我们发现会被替换成 AUTO_INCREMENT= 2,而$1不被识别,
而单独使用'AUTO_INCREMENT='.“$1”,$1可以识别,
那么问题来了,看样子preg_replace() 的第二个参数如果引用了如“$1”类似的变量,变量的使用会有问题,没去查具体原因,
我的解决方法是:
if(preg_match('/AUTO_INCREMENT=(\d+)/',$sql,$matches)){
$auto_int_start = $matches[1] + (int)($count/C('DATA_BACKUP_EXPORT_LIMIT'));
}
$sql = preg_replace('/AUTO_INCREMENT=(\d+)/', 'AUTO_INCREMENT='.$auto_int_start, $sql);
那就是事先把只计算好,再替换,后面再看看具体原因吧,如果有同学知道原理,也可以留言告诉我,3Q!
相关文章推荐
- php -- 魔术方法、魔术常量 简单介绍
- 使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写
- PHP"类"笔记
- phpmyadmin修改文件上传大小限制
- PHP学习笔记
- php的优缺点(转)
- CI框架 .htaccess 隐藏url在index.php解决方案
- php写入数据中断解决方案
- THINKPHP 解决模块不存在时出现空页面的问题
- PHP底层的运行机制与原理
- php实现网页缓存的工具类分享
- 浅谈php错误提示及查错方法
- ThinkPHP的Auth类认证
- 浅谈php的优缺点
- smarty模板里面使用php函数
- PHP连接MySQL数据库并以json格式输出
- PHP curl 发送 json 格式数据
- php生成数字字母的验证码图片
- PHP MySQL 数据库dml语句与dql语句的操作
- php算法实例分享