数据写入
thinkphp的数据写入操作使用add方法,使用示例如下:
$User = M("User"); // 实例化User对象
$data['name'] = 'ThinkPHP';
$data['email'] = '[email protected]';
$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'] = '[email protected]';
$sql = $User->fetchSql(true)->add($data);
echo $sql;
// 输出结果类似于
// INSERT INTO think_user (name,email) VALUES ('ThinkPHP','[email protected]')
字段过滤
如果写入了数据表中不存在的字段数据,则会被直接过滤,例如:
$data['name'] = 'thinkphp';
$data['email'] = '[email protected]';
$data['test'] = 'test';
$User = M('User');
$User->data($data)->add();
其中test字段是不存在的,所以写入数据的时候会自动过滤掉。
在3.2.2版本以上,如果开启调试模式的话,则会抛出异常,提示:
非法数据对象:[test=>test]
如果在add方法之前调用field方法,则表示只允许写入指定的字段数据,其他非法字段将会被过滤,例如:
$data['name'] = 'thinkphp';
$data['email'] = '[email protected]';
$data['test'] = 'test';
$User = M('User');
$User->field('name')->data($data)->add();
最终只有name字段的数据被允许写入,email和test字段直接被过滤了,哪怕email也是数据表中的合法字段。
字段内容过滤
通过filter方法可以对数据的值进行过滤处理,例如:
$data['name'] = '<b>thinkphp</b>';
$data['email'] = '[email protected]';
$User = M('User');
$User->data($data)->filter('strip_tags')->add();
写入数据库的时候会把name字段的值转化为
thinkphp
。
filter方法的参数是一个回调类型,支持函数或者闭包定义。
批量写入
在某些情况下可以支持数据的批量写入,例如:
// 批量添加数据
$dataList[] = array('name'=>'thinkphp','email'=>'[email protected]');
$dataList[] = array('name'=>'onethink','email'=>'[email protected]');
$User->addAll($dataList);
该功能需要3.2.3以上版本,3.2.3以下版本仅对mysql数据库支持