Blog
网页中的字符串的处理[输入篇]
发布时间: 2009-01-19 14:08
对于每一个程序,我一般都会使用一些特殊字符去检验其对字符串的处理能力。
比如在提交JavaScript,提交类似 ,'','',''这种字符串。完美的结果应该是,字符串的输入、编辑、显示三种界面应该保持一致。
那么,在ThinkPHP中,怎么进行处理呢。昨天我大致总结了一下,并重新修正了input.class.php。
测试表单:
- <form action="/Blog/save" method="POST">
- title:<input type="text" name="title" /><br>
- content:<textarea rows="10" cols="30" name="content"></textarea><br>
- <input type="submit">
- form>
[separator]
测试model:
- class testModel extends Model
- {
- var $tableName = 'test';
- }
- ?>
测试表
- CREATE TABLE `ta_test` (
- `id` int(11) unsigned NOT NULL auto_increment,
- `title` varchar(255) default NULL,
- `content` text,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
测试环境:
Thinkphp可正常运行环境
magic_quotes = on
mysql
测试过程开始:
title中填写:
ThinkPHP's Code
content 中填写:
I like ThinkPHP.
me too!
it's good!
我们简单地create操作一下:
- public function save()
- {
- $model = D('test');
- $vo = $model->create();
- dump($vo);
- }
输出为:
- array(2) {
- ["title"] => string(16) "ThinkPHP\'s Code"
- ["content"] => string(67) "I like ThinkPHP.
- <b>me too!b>
- it\'s good!"
- }
现在修改为:
- public function save()
- {
- import('Think.Util.Input');
- Input::noGPC();
- $model = D('test');
- $vo = $model->create();
- dump($vo);
- }
输出为:
- array(2) {
- ["title"] => string(15) "ThinkPHP's Code"
- ["content"] => string(66) "I like ThinkPHP.
- <b>me too!b>
- it's good!"
- }
这样就得到的是原样的输入,但是一般不建议使用Input::noGPC();,因为它将所有$_POST,$_GET进行了sripslashes_deep操作。最好是用到哪个就使用Input::getVar($_POST['title']);
然后,我们将dump($vo);修改为$model->add();,再提交一次。
内容被原样保存到数据库了。可见ThinkPHP's Code中的引号没有产生影响。
我们进行分析一下:
数据create之后是上面所说的样子,add() 将数据传送到 _create(),然后是其中的一句:
$result = $this->db->add($data,$table,$multi)
而这个$this->db就是DbMysql这个类。其中add()是继承的Db类。
我们最终在Db.class.php找到了这个函数。
而转义的处理,就是在 $val = $this->fieldFormat($val);这一句。
我们单独把这个函数提取来:
- protected function fieldFormat($value,$asString=true,$multi=false)
- {
- if ($multi == true) {
- $asString = true;
- }
- if(is_int($value)) {
- $value = intval($value);
- }elseif(is_float($value)) {
- $value = floatval($value);
- }elseif(!$asString){
- $value = $this->escape_string($value);
- }elseif(is_string($value)) {
- $value = '\''.$this->escape_string($value).'\'';
- }elseif(is_null($value)){
- $value = 'null';
- }
- return $value;
- }
看到了吧,ThinkPHP在这里对每个字段都进行了处理。所以,你需要做的,就是按照输入的样子原样传递给ThinkPHP,不要自己再转义。
下面不使用create呢:
- public function save()
- {
- import('Think.Util.Input');
- Input::magicQuotes();
- $model = D('test');
- $model->find(1);
- $model->title = 'sdadsa\d\ds\'\'';
- $model->save();
- }
上面的代码正确地插入了数据。
- public function save()
- {
- import('Think.Util.Input');
- $model = D('test');
- $data = array(
- 'title' => Input::getVar($_POST['title']),
- 'content' => Input::getVar($_POST['content']),
- );
- $model->add($data);
- }
上面的代码正确地插入了数据。
看到这里应该明白了吧。
我们总结一下,ThinkPHP保存数据的时候的原则:传送给ThinkPHP一个干净的数据。
