自动验证与自动填充是在使用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请求数据
edit_post打印的信息

  1. Think\Model Object
  2. (
  3. ***
  4. ***
  5. )
  6. SHOW COLUMNS FROM `table1`
好像上面的都没有什么问题,最主要的是得到了数据库信息(在Mysql里可以正常执行)但就是if(create()){}里的代码没有执行
说明create方法并未按照预期执行,该问题我找了半个小时在网络上也看了别人的一些经历都没有解决
然后我就看了下数据库表结构,我似乎明白了什么于是我把表字段的全部更改成小写然后再执行就解决了
问题原因:Html元素的值跟数据库存在大小写差异
参考网络上的经验总结下以下规则可解决以上问题:
  1. HTML中的元素是否指定了name属性且name的值跟数据库中的值完全一致(区分大小写)
  2. 确认HTML表单中的数据正确发送了出去
  3. Model 命名是否错误能否找到对应的表(能否打印了Model对象)
  4. Model类及其成员方法是否是私用或受保护
  5. Model的getError()方法是否有错误
  6. 方法能否接收到POST的值,POST接收到的值跟请求的值是否一致(注意大小写)
  7. 确认遵守了ThinkPHP的开发规范
如果以上还没有解决你的问题,那要考虑下你的rp了
参考:

ThinkPHP 自动验证与自动填充无效可能的原因(转)的更多相关文章

  1. ThinkPHP 自动验证与自动填充无效可能的原因

    原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...

  2. ThinkPHP 自动创建数据、自动验证、自动完成详细例子介绍(十九)

    原文:ThinkPHP 自动创建数据.自动验证.自动完成详细例子介绍(十九) 1:自动创建数据 //$name=$_POST['name']; //$password=$_POST['password ...

  3. thinkphp自动验证和自动完成

    tp验证码的自动验证小案例 模板文件 <form action="" method="post"> <p> User: <inpu ...

  4. 把myeclipse的自动验证和自动构建都关掉

    关闭自动构建: project - -build  automatically  的勾去掉,如下图: 关闭自动验证:window - preferences-- myeclipse -- valida ...

  5. <转>thinkphp自动验证无效的问题

    新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...

  6. thinkphp自动验证无效的问题

    新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...

  7. ThinkPHP - 自动创建 + 自动验证 + 自动完成

    自动创建:创建数据模型. $User->create(); 自动验证:验证提交的表单数据. protected $_validate = array( array('verify','requi ...

  8. thinkphp在模型中自动完成session赋值

    相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比 如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码:clas ...

  9. ThinkPhp 3.2 自动验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 数据验证有两种方式: 静态方式:在模型类里面通过$_validate属性定义验证规则 ...

随机推荐

  1. mysql的事务处理与锁表

    数据库的事务处理可以保证一组处理结果的正确性.mysql中只有INNODB和BDB引擎的数据表才支持事务处理,对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现相同的功能. mysql的 ...

  2. NBOJv2 1034 Salary Inequity(DFS序+线段树区间更新区间(最值)查询)

    Problem 1034: Salary Inequity Time Limits:  10000 MS   Memory Limits:  200000 KB 64-bit interger IO ...

  3. div居中(内容+元素:水平+垂直)

    内容水平居中 text-align: center; 内容垂直居中 /*第一种 行内垂直居中*/ height: 43px; line-height:43px; /*我们将行距增加到和整个div一样高 ...

  4. 【翻译】口袋妖怪X/Y 制作技法

    口袋妖怪X/Y [口袋妖怪]系列最终的全3D化     再现图像风格的制作技法   完成系列最初的全3D化的本作,在手掌游戏机的性能和容量的限制中,把杉森建氏的公式设定图风格用Toon Shading ...

  5. mysql安装tcmalloc

    TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多, ...

  6. 每个配置xml的含义作用

    参考链接 web.xml xxx-servlet.xml(例如:dispatcher-servlet.xml)是Spring MVC里的,控制器,拦截url,转发view,对应的是controller ...

  7. SMS模型格网转换为MIKE21的格网源代码

    program main !sms网格转换成mike21网格 DIMENSION X(),Y(),H(),NDNN(,),ncbd() dimension NBS(),NOBD(,),NSED(,), ...

  8. 【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)

    本文将给大家阐述一个因未设置系统环境变量ORACLE_SID导致ORA-12162错误的案例.希望大家有所思考. 1.获得有关ORA-12162报错信息的通用表述信息 [oracle@asdlabdb ...

  9. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  10. svn截图

        一.合并一个范围的版本 此类型应用最为广泛,主要是把分支中的修改合并到主干上来.在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本.合并的源URL填写的是要合并的分支的URL,待合 ...