ThinkPHP的数据写入操作使用**add方法**,使用示例如下: ~~~ $User = M("User"); // 实例化User对象 $data['name'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $User->add($data); ~~~ 如果是Mysql数据库的话,还可以支持在数据插入时允许更新操作: ~~~ add($data='',$options=array(),$replace=false) ~~~ 其中add方法增加$replace参数(是否添加数据时允许覆盖),true表示覆盖,默认为false 或者使用data方法连贯操作 ~~~ $User = M("User"); // 实例化User对象 $User->data($data)->add(); ~~~ 如果在add之前已经创建数据对象的话(例如使用了create或者data方法),add方法就不需要再传入数据了。 使用create方法的例子: ~~~ $User = M("User"); // 实例化User对象 // 根据表单提交的POST数据创建数据对象 if($User->create()){ $result = $User->add(); // 写入数据到数据库 if($result){ // 如果主键是自动增长型 成功后返回值就是最新插入的值 $insertId = $result; } } ~~~ > create方法并不算是连贯操作,因为其返回值可能是布尔值,所以必须要进行严格判断。 ## 支持的连贯操作 在执行add方法之前,我们可以调用相关的连贯操作方法,配合完成数据写入操作。 写入操作支持的连贯操作方法包括: | 连贯操作 | 作用 | 支持的参数类型 | |-----|-----|-----| | table | 用于定义要操作的数据表名称 | 字符串和数组 | | data | 用于指定要写入的数据对象 | 数组和对象 | | field | 用于定义要写入的字段 | 字符串和数组 | | relation | 用于关联查询(需要关联模型支持) | 字符串 | | validate | 用于数据自动验证 | 数组 | | auto | 用于数据自动完成 | 数组 | | filter | 用于数据过滤 | 字符串 | | scope | 用于命名范围 | 字符串、数组 | | bind | 用于数据绑定操作 | 数组 | | token | 用于令牌验证 | 布尔值 | | comment | 用于SQL注释 | 字符串 | | fetchSql | 不执行SQL而只是返回SQL | 布尔值 | 可以支持不执行SQL而只是返回SQL语句,例如: ~~~ $User = M("User"); // 实例化User对象 $data['name'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $sql = $User->fetchSql(true)->add($data); echo $sql; // 输出结果类似于 // INSERT INTO think_user (name,email) VALUES ('ThinkPHP','ThinkPHP@gmail.com') ~~~ ##### 字段过滤 如果写入了数据表中不存在的字段数据,则会被直接过滤,例如: ~~~ $data['name'] = 'thinkphp'; $data['email'] = 'thinkphp@gmail.com'; $data['test'] = 'test'; $User = M('User'); $User->data($data)->add(); ~~~ 其中test字段是不存在的,所以写入数据的时候会自动过滤掉。 > 在3.2.2版本以上,如果开启调试模式的话,则会抛出异常,提示:`非法数据对象:[test=>test]` 如果在add方法之前调用field方法,则表示只允许写入指定的字段数据,其他非法字段将会被过滤,例如: ~~~ $data['name'] = 'thinkphp'; $data['email'] = 'thinkphp@gmail.com'; $data['test'] = 'test'; $User = M('User'); $User->field('name')->data($data)->add(); ~~~ 最终只有name字段的数据被允许写入,email和test字段直接被过滤了,哪怕email也是数据表中的合法字段。 ##### 字段内容过滤 通过filter方法可以对数据的值进行过滤处理,例如: ~~~ $data['name'] = '<b>thinkphp</b>'; $data['email'] = 'thinkphp@gmail.com'; $User = M('User'); $User->data($data)->filter('strip_tags')->add(); ~~~ 写入数据库的时候会把name字段的值转化为`thinkphp`。 > filter方法的参数是一个回调类型,支持函数或者闭包定义。 ## 批量写入 在某些情况下可以支持数据的批量写入,例如: ~~~ // 批量添加数据 $dataList[] = array('name'=>'thinkphp','email'=>'thinkphp@gamil.com'); $dataList[] = array('name'=>'onethink','email'=>'onethink@gamil.com'); $User->addAll($dataList); ~~~ > **该功能需要3.2.3以上版本,3.2.3以下版本仅对mysql数据库支持**