ThinkPHP 自动验证与自动填充无效可能的原因(转)

自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析。

create()

ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关。

create 方法语法如下:

create(mixed data, string type)

data 表示接受的数据,type 表示本次的具体操作(写入还是更新数据)。两个参数都可省略,data 参数省略的情况下默认为接受 $_POST 数据,而 type 默认情况下由系统自动识别。

但系统自动识别 type 是有缺陷的,当传入的字段有主键字段时,系统就识别为更新操作,否则就是写入操作。所以当主键字段非自动增长而是需要 SQL 写入时,那么自动验证和自动填充都可能无效。

例如添加数据记录时,如果表单中有主键字段或者系统中产生了主键字段(如录入设备编号),那么 ThinkPHP 就认为本次操作为更新操作,对于例如下面设定的自动验证和填充都会略过:

protected $_validate = array(
// 新增时验证标题唯一
array('title','','标题已经存在!',0,'unique',1),
}; // 自动填充
protected $_auto = array(
// 新增时填充时间戳
array('pubtime','time',1,'function'),
);

尽管在操作中,执行了 add() 操作将数据写入了数据表,但这时会发现自动验证与自动填充无效。

出现这种情况时,只需将操作类型显式的传入 create() 方法即可,即 create($_POST,1),告诉系统本次操作为写入数据。另外如果传入的数据不是 $_POST ,也要将数据当作参数传入,如 create($_GET)。

字段未对应

由于粗心,未对应好表单字段与数据表字段。

数据表字段做了更改

在开发过程中,更改了表字段名称,而缓存未及时更新,导致系统判断为无效字段而被 unset 掉。所以在更改了表字段名称之后,及时将 Runtime/Data 下的数据表缓存清除。

Model 命名错误

M方法中使用自动验证与自动完成

数据库格式不正确,有可能不是UTF-8

最后一种可能性是model类的成员方法变为私有或保护,应为public

--------------------------------------------

解决ThinkPHP的Create方法失效而没有提示错误信息的问题(转)

ThinkPHP中的数据创建Create方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显)
但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示错误信息
这个时候你就要好好仔细下你的代码了,因为很有可能你写的代码不规范或是其他原因
以下是我因为自己的粗心而出现的问题:Create方法失效而没有提示错误信息
 
/**
* 编辑数据
* @Author NETFOX-HTL
* @Email huangyuan413026@163.com
* @DateTime 2015-10-30T17:00:29+0800
*/
function edit_post(){
if(IS_POST){ print_r($this->org_model);
if ($this->org_model->create()) {
//code
echo $this->org_model->_sql();//最后一条执行的Sql die ("create");
} else {
echo $this->org_model->_sql();//最后一条执行的Sql
die($this->org_model->getError());
}
}
}
浏览器发出的POST请求数据
ThinkPHP 自动验证与自动填充无效可能的原因(转)
edit_post打印的信息
  1. Think\Model Object
  2. (
  3. ***
  4. ***
  5. )
  6. SHOW COLUMNS FROM `table1`
好像上面的都没有什么问题,最主要的是得到了数据库信息(在Mysql里可以正常执行)但就是if(create()){}里的代码没有执行
说明create方法并未按照预期执行,该问题我找了半个小时在网络上也看了别人的一些经历都没有解决
然后我就看了下数据库表结构,我似乎明白了什么于是我把表字段的全部更改成小写然后再执行就解决了
ThinkPHP 自动验证与自动填充无效可能的原因(转)
问题原因:Html元素的值跟数据库存在大小写差异
参考网络上的经验总结下以下规则可解决以上问题:
  1. HTML中的元素是否指定了name属性且name的值跟数据库中的值完全一致(区分大小写)
  2. 确认HTML表单中的数据正确发送了出去
  3. Model 命名是否错误能否找到对应的表(能否打印了Model对象)
  4. Model类及其成员方法是否是私用或受保护
  5. Model的getError()方法是否有错误
  6. 方法能否接收到POST的值,POST接收到的值跟请求的值是否一致(注意大小写)
  7. 确认遵守了ThinkPHP的开发规范
如果以上还没有解决你的问题,那要考虑下你的rp了
参考:
上一篇:POJ 2513 trie树+并查集判断无向图的欧拉路


下一篇:Python基础(reduce,filter,map函数)