🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 创建数据 [上一页](63.html "上一页")[下一页](65.html "下一页") 在进行数据操作之前,我们往往需要手动创建需要的数据,例如对于提交的表单数据:`// 获取表单的POST数据<br class="calibre5"></br>$data['name'] = $_POST['name'];<br class="calibre5"></br>$data['email'] = $_POST['email'];<br class="calibre5"></br>// 更多的表单数据值获取<br class="calibre5"></br>//……`然而ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显。 很简单的例子:`// 实例化User模型<br class="calibre5"></br>$User = M('User');<br class="calibre5"></br>// 根据表单提交的POST数据创建数据对象<br class="calibre5"></br>$User->create();<br class="calibre5"></br>// 把创建的数据对象写入数据库<br class="calibre5"></br>$User->add();`Create方法支持从其它方式创建数据对象,例如,从其它的数据对象,或者数组等 `$data['name'] = 'ThinkPHP';<br class="calibre5"></br>$data['email'] = 'ThinkPHP@gmail.com';<br class="calibre5"></br>$User->create($data);`甚至还可以支持从对象创建新的数据对象`// 从User数据对象创建新的Member数据对象<br class="calibre5"></br>$User = M("User");<br class="calibre5"></br>$User->find(1);<br class="calibre5"></br>$Member = M("Member");<br class="calibre5"></br>$Member->create($User);`而事实上,create方法所做的工作远非这么简单,在创建数据对象的同时,完成了一系列的工作,我们来看下create方法的工作流程就能明白:步骤 说明 返回 1 获取数据源(默认是POST数组) 2 验证数据源合法性(非数组或者对象会过滤) 失败则返回false 3 检查字段映射 4 判断提交状态(新增或者编辑 根据主键自动判断) 5 数据自动验证 失败则返回false 6 表单令牌验证 失败则返回false 7 表单数据赋值(过滤非法字段和字符串处理) 8 数据自动完成 9 生成数据对象(保存在内存) 因此,我们熟悉的令牌验证、自动验证和自动完成(我们会在后面看到相关的用法)功能,其实都必须通过create方法才能生效。Create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add或者save方法才会真正写入数据库。 因此在没有调用add或者save方法之前,我们都可以改变create方法创建的数据对象,例如:`$User = M('User');<br class="calibre5"></br>$User->create(); //创建User数据对象<br class="calibre5"></br>$User->status = 1; // 设置默认的用户状态<br class="calibre5"></br>$User->create_time = time(); // 设置用户的创建时间<br class="calibre5"></br>$User->add(); // 把用户对象写入数据库`如果只是想简单创建一个数据对象,并不需要完成一些额外的功能的话,可以使用data方法简单的创建数据对象。 使用如下:`// 实例化User模型<br class="calibre5"></br>$User = M('User');<br class="calibre5"></br>// 创建数据后写入到数据库<br class="calibre5"></br>$data['name'] = 'ThinkPHP';<br class="calibre5"></br>$data['email'] = 'ThinkPHP@gmail.com';<br class="calibre5"></br>$User->data($data)->add();`Data方法也支持传入数组和对象,使用data方法创建的数据对象不会进行自动验证和过滤操作,请自行处理。但在进行add或者save操作的时候,数据表中不存在的字段以及非法的数据类型(例如对象、数组等非标量数据)是会自动过滤的,不用担心非数据表字段的写入导致SQL错误的问题。**安全提示:** create方法如果没有传值,默认取$_POST数据,如果用户提交的变量内容,含有可执行的html代码,请进行手工过滤。`$_POST['title'] = "<script>alert(1);</script>";`非法html代码可以使用htmlspecialchars进行编码,以防止用户提交的html代码在展示时被执行,以下是两种安全处理方法。`$_POST['title'] = htmlspecialchars($_POST['title']);<br class="calibre5"></br>M('User')->create();``$data['title'] = $this->_post('title', 'htmlspecialchars');<br class="calibre5"></br>M('User')->create($data);`如果要对全局变量进行修改,请参考本手册14.4 输入过滤(VAR_FILTERS参数)和 [TP入门系列之安全设置](http://www.thinkphp.cn/info/184.html) [上一页](63.html "上一页")[下一页](65.html "下一页")