ThinkPHP官网首页

ENGLISH

Blog

网页中的字符串的处理[输入篇]

发布时间: 2009-01-19 14:08

对于每一个程序,我一般都会使用一些特殊字符去检验其对字符串的处理能力。

比如在提交JavaScript,提交类似 ,'','',''这种字符串。完美的结果应该是,字符串的输入、编辑、显示三种界面应该保持一致。

那么,在ThinkPHP中,怎么进行处理呢。昨天我大致总结了一下,并重新修正了input.class.php。

测试表单:

XML/HTML代码
  1. <form action="/Blog/save" method="POST">    
  2. title:<input type="text" name="title" /><br>  
  3. content:<textarea rows="10" cols="30" name="content"></textarea><br>  
  4. <input type="submit">  
  5. form>  

[separator]

测试model:

PHP代码
  1. class testModel extends Model   
  2. {   
  3.    var $tableName = 'test';     
  4. }   
  5. ?>  

测试表

SQL代码
  1. CREATE TABLE `ta_test` (   
  2.   `id` int(11) unsigned NOT NULL auto_increment,   
  3.   `title` varchar(255) default NULL,   
  4.   `content` text,   
  5.   PRIMARY KEY  (`id`)   
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  

 

测试环境:
Thinkphp可正常运行环境
magic_quotes = on
mysql

测试过程开始:

title中填写:
ThinkPHP's Code

content 中填写:
I like ThinkPHP.
me too!
it's good!

我们简单地create操作一下:

PHP代码
  1. public function save()   
  2. {   
  3.     $model = D('test');   
  4.     $vo = $model->create();   
  5.  dump($vo);   
  6. }  


   
输出为:

XML/HTML代码
  1. array(2) {   
  2.   ["title"] => string(16) "ThinkPHP\'s Code"   
  3.   ["content"] => string(67) "I like ThinkPHP.   
  4. <b>me too!b>  
  5. it\'s good!"   
  6. }  

现在修改为:

PHP代码
  1. public function save()   
  2. {   
  3.  import('Think.Util.Input');   
  4.  Input::noGPC();   
  5.     $model = D('test');   
  6.     $vo = $model->create();   
  7.     dump($vo);   
  8. }  

输出为:

XML/HTML代码
  1. array(2) {   
  2.   ["title"] => string(15) "ThinkPHP's Code"   
  3.   ["content"] => string(66) "I like ThinkPHP.   
  4. <b>me too!b>  
  5. it's good!"   
  6. }  

这样就得到的是原样的输入,但是一般不建议使用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);这一句。
 
 我们单独把这个函数提取来: 
 

PHP代码
  1. protected function fieldFormat($value,$asString=true,$multi=false)   
  2. {   
  3.     if ($multi == true) {   
  4.         $asString = true;   
  5.     }   
  6.     if(is_int($value)) {   
  7.         $value = intval($value);   
  8.     }elseif(is_float($value)) {   
  9.         $value = floatval($value);   
  10.     }elseif(!$asString){   
  11.         $value = $this->escape_string($value);   
  12.     }elseif(is_string($value)) {   
  13.         $value = '\''.$this->escape_string($value).'\'';   
  14.     }elseif(is_null($value)){   
  15.         $value   =  'null';   
  16.     }   
  17.     return $value;   
  18. }   


看到了吧,ThinkPHP在这里对每个字段都进行了处理。所以,你需要做的,就是按照输入的样子原样传递给ThinkPHP,不要自己再转义。

下面不使用create呢:

PHP代码
  1. public function save()   
  2. {   
  3.  import('Think.Util.Input');   
  4.  Input::magicQuotes();   
  5.     $model = D('test');   
  6.     $model->find(1);   
  7.     $model->title = 'sdadsa\d\ds\'\'';   
  8.     $model->save();   
  9. }   

 上面的代码正确地插入了数据。

PHP代码
  1. public function save()   
  2. {   
  3.  import('Think.Util.Input');   
  4.     $model = D('test');   
  5.     $data = array(   
  6.         'title' => Input::getVar($_POST['title']),   
  7.         'content' => Input::getVar($_POST['content']),   
  8.     );   
  9.     $model->add($data);   
  10. }   

上面的代码正确地插入了数据。

看到这里应该明白了吧。

我们总结一下,ThinkPHP保存数据的时候的原则:传送给ThinkPHP一个干净的数据。

最新动态