ThinkPHP中M方法生成语句where条件自动多加了Id

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP中M方法生成语句where条件自动多加了Id相关的知识,希望对你有一定的参考价值。

遇到了诡异的问题,服务器端从凌晨突然发生:
Thinkphp中M方法生成语句where条件自动多加了Id
主要语句如下:
$where = array();
$where['status'] = 1;
M('speed_log')->where($where)->limit(1)->getField('user');
$sql = M('speed_log')->getLastSql();
mylog('sql = ' . $sql);
这样得到的SQL居然会有一个自增主键id的条件:
SELECT `user` FROM `qg_speed_log` WHERE `id` = 16383 AND `status` = 1 LIMIT 1
请教可能原因是什么?

参考技术A 挺多ThinkPHP访问数据库的问题是缓存引起的。清掉Runtime/data/_fields试试。本回答被提问者采纳 参考技术B $sql = M('speed_log')->where($where)->limit(1)->fetchSql(); // 看看生成的 sql 语句是什么 参考技术C 楼主 应该是ID=array(1,2,3,4...) where id=ID就行了 在Thinkphp中多个都是用数组表示的。追问

您好,问题是不需要添加这个id的条件它却自动加上了,导致逻辑错误。

ThinkPHP中查询数据库where()中的条件必须包含主键值吗

大神们,如下,求解:

代码:
$curcate=$catemodel->where(array('id'=>$_GET['id']))->find();
$catemodel->where('pid=%d',$_GET['id'])->select();

数据表:
字段为 id,name,pid,path,其中id为primary key,其中pid不是数据表的主键.

结果:
第一条语句查询返回为结果集.
第二条代码查询返回值为null.

操作:
尝试将第二条代码中的pid改为主键id,则查询返回结果集.

问题:
1.使用where时,其中条件必须包含主键么?
2.如果使用非主键的字段作为查询条件,可以使用TP实现不?

不用的哈,用什么PHP框架,就要多看这个框架的手册。

http://document.thinkphp.cn/manual_3_2.html#where,

就如此题来说,你传递过来的id值,就是表的主键。

pid一般是为父键的意思,$catemodel->where('pid=%d',$_GET['id'])->select();

查询的是这个id所对应子集的。

楼上所说这种,有点曲解楼主的意思。楼主的意思,估计就是子集没数据的缘故。

参考技术A 不需要
先说一个基本的sql语句:select field from table join table2 in table2.fieldx match tabe.fieldy where field match value and/or field2 match value2 order by order_field desc
在TP中,首先通过D或者M函数,获得一个table的对应类如$user
然后,定义你想要的字段 $query = $user->field(array)
然后,定义where条件 $query->where(条件数组)
然后,定义额外的内容,如排序,$query->order(排序条件数组),如表关联$query->join(关联条件数组)
最后,执行查询操作,$query->select()

另外,对于已知主键的查询,TP中可以使用find函数,如$user->find(1),查找主键为1的user。当然前提是表的默认主键符合TP规定,一般是id,可以通过在model中将$primary(好像是这个属性)设定为表中的主键来更改默认值
参考技术B

楼主可以看下tp的数据库操作类

$catemodel->where('pid=%d',$_GET['id'])->select(); 这样写 sql的操作语句是这样的

select *from catemodel where 'pid' = xxx;(貌似有出入,具体的忘了,你也可以dump一下);

如果$_GET的东西不规范可能就查询不到,建议使用如下方式

    $catemodel->where("'pid'='".$_GET['id']."'")->select(); 

    $data['pid'] = $_GET['id']; $list = $catemodel->where($data)->select(); 

本回答被提问者和网友采纳
参考技术C ThinkPHP中的WHERE不需要包含主键,查询过程跟普通查询中的WHERE一样的。 参考技术D 主键查询 更快,其他也可以进行查询,数据量大可以加索引改善,主要还看SQL和数据库表结构的建立

以上是关于ThinkPHP中M方法生成语句where条件自动多加了Id的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp中查询数据库具体的使用方法

thinkphp 中where条件怎么使用or

ThinkPHP可以支持直接使用字符串作为查询条件

thinkphp 里sql 语句如何解读????

ThinkPHP中查询数据库where()中的条件必须包含主键值吗

ThinkPhpSQL方式