CI框架表单验证 is_unique 的一点bug

问题:

is_unique 方法在编辑更新的时候验证会包含当前记录,这是CI框架的一个bug,需要修改Form_validation.php is_unique 方法:

public function is_unique($str, $field)
   {
        if(isset($_POST['id'])){
            $id = $_POST['id'];
        }elseif(isset($_GET['id'])){
            $id = $_GET['id'];
        }
        list($table, $field)=explode('.', $field);
        $this->CI->db->from($table);
        $this->CI->db->limit(1);
        $this->CI->db->where($field,$str);
        if(isset($id)){
            $this->CI->db->where('id !=', $id);
        }
        $query = $this->CI->db->get();
        return $query->num_rows() === 0;
    }

CI框架对一张图片裁切成不同的尺寸

/**
 *商品图片上传处理
 *@see goods_upload()
 *@author zrp <zouruiping@infoclouds.net>
 *@version 2013年11月28日16:22:48
 */
 public function goods_upload(){
 //echo ROOTPATH.'static/uploads';die;
 //初始定义
 $pic = '';
 $spic = '';
 //设置图片保存路径
 $config['upload_path'] = ROOTPATH.'static/uploads';
 //图片类型
 $config['allowed_types'] = 'gif|jpg|png';
 //大小
 $config['max_size'] = '1024000';
 $config['encrypt_name'] = true;
 //宽高不限
 $config['max_width'] = '0';
 $config['max_height'] = '0';
 $this->load->library('upload', $config); 
 if ($this->upload->do_upload('pic1')){
 $data = $this->upload->data();
 $name = $data['file_name'];
 $hz = array_pop(explode('.',$name)); 
 $raw_name = $data['raw_name'];
 $config['image_library'] = 'gd2';
 $config['source_image'] = ROOTPATH.'static/uploads'.'/'.$name;
 //保留原图跟处理后的图片
 $config['create_thumb'] = TRUE;
 $config['maintain_ratio'] = TRUE;
 //大图
 $config['new_image'] = $raw_name.'_big'.'.'.$hz;
 //设置宽高,0表示不限制
 $config['width'] = 640;
 $config['height'] = 320;
 $this->load->library('image_lib', $config); 
 $res = $this->image_lib->resize();
 if($res){
 //设置图片保存路径
 $config2['upload_path'] = ROOTPATH.'static/uploads';
 //图片类型
 $config2['allowed_types'] = 'gif|jpg|png';
 //大小
 $config2['max_size'] = '1024000';
 $config2['encrypt_name'] = true;
 //宽高不限
 $config2['max_width'] = '0';
 $config2['max_height'] = '0';
 //第二次加载upload类,不能$this->load->library('upload', $config); 得下面这样
 $this->upload->initialize($config2);
 if ($this->upload->do_upload('pic1')){ 
 $data = $this->upload->data();
 $name = $data['file_name'];
 //$hz = array_pop(explode('.',$name)); 
 $raw_name2 = $data['raw_name'];
 $config2['image_library'] = 'gd2';
 $config2['source_image'] = ROOTPATH.'static/uploads'.'/'.$name;
 //保留原图及处理后的图片
 $config2['create_thumb'] = TRUE;
 $config2['maintain_ratio'] = TRUE;
 //小图,(大图设置了此项,小图也需要设置)
 $config2['new_image'] = $raw_name2.'_small'.'.'.$hz;
 //设置宽高,0表示不限制
 $config2['width'] = 200;
 $config2['height'] = 100;
 //第二次加载image_lib类,不能$this->load->library('image_lib', $config2); 得下面这样
 $this->image_lib->initialize($config2);
 $res2 = $this->image_lib->resize();
 if($res2){
 $spic = base_url('static/uploads').'/'.$raw_name2.'_small_thumb'.'.'.$hz;
 $pic = base_url('static/uploads').'/'.$raw_name.'_big_thumb'.'.'.$hz;
 } 
 }
 }
 }
 echo "<script>parent.callback('".$pic."','".$spic."')</script>";
 }
function callback(pic,spic) 
 { 
 if(pic == '' || spic == ''){
 alert('图片上传失败!');
 }else{
 document.getElementById("pic").src = pic; 
 document.getElementById("goods_pic").value = pic; 
 document.getElementById("goods_spic").value = spic;
 } 
 }

CI框架常识

1.有两种方法来加载自定义配置文件(如enums.php):

<?php 
if (! defined('BASEPATH')) exit('No direct script access allowed');

$config['enums']['memcache'] = array(

    array('host' => '192.168.1.1', 'port' => 11211)

);

$config['enums']['test'] = array(

    array('one' => '192.168.1.1', 'two' => 11211)

);

 

(1)手动加载:

$this->load->config(‘enums’);//注config()另外还可以有两个参数,一个是避免冲突,另一个是屏蔽不存在这个文件而出现的报错。

$res = $this->config->config[‘enums’];

返回的结果:

Array

(

    [memcache] => Array

        (

            [0] => Array

                (

                    [host] => 192.168.1.1

                    [port] => 11211

                )

 

        )

 

    [test] => Array

        (

            [0] => Array

                (

                    [one] => 192.168.1.1

                    [two] => 11211

                )

 

        )

 

)

如果想只返回test对应的数组:

$res = $this->config->item(‘test’,’enums’);

返回结果:

Array

(

    [0] => Array

        (

            [one] => 192.168.1.1

            [two] => 11211

        )

 

)

如果你想动态设置/改变一个现有的配置元素,你可以使用:

$this->config->set_item(‘enums’,array(‘good’,’haha’));

(2)自动加载:

写入application/config/autoload.php文件中。

2.调试错误时写入cache:

先在/www/cache/下建一个名为file的文件夹,并给这个file文件夹有写的权限。

$this->load->helper(‘common’);
cache_set($key,$value);

3.CI 的 load 都有规避机制:

第二次 load->library 无效。
第二次 load->library 改成

$this->upload->initialize($config);

对CI 所有需要传配置的类库通用。

CI学习总结

1.CI自定义配置文件:

如:config/test.php

<?php
$config['test']['good'] = array('aa','bb');

在控制器中这样调用:

<?php
$this->load->config('test');
$res = $this->config->item('good','test');
print_r($res);//输出array('aa','bb');
 2.CI大小写问题:
控制器:
   类名必须以大写字母开头 
   EX:   class  User      extends  CI_Controller{ }    
   文件名: user.php      【小写】
模型:
   class  Model_name  extends  CI_Model {}              
   文件名  : model_name  【小写】

第三方类库:

文件名首字母大写. 例如:  Myclass.php

类声明首字母大写. 例如:   class Myclass

类的名字和文件名应符合.

引用  $this->load->library('someclass');【小写】
3.导入数据库配置:
(1)默认数据库配置
    $this->load->database();
  $query = $this->db->query($sql);
(2)自定义数据库配置
    $this->dbs = $this->load->database('mydb',true);
    $query = $this->dbs->query($sql);

CI去掉 URL 中的 index.php

首先,你要清楚自己的 Web 服务器是 Apache,支持 mod_rewrite

查找httpd.conf中是否开启了mod_rewrite.so

然后,在 CI 根目录下新建立一个配置文件,命名为: .htaccess
在里面这样写:

RewriteEngine on   
RewriteCond $1 !^(index\.php|images|robots\.txt)   
RewriteRule ^(.*)$ ./index.php/$1 [L]

就可以去掉 index.php 了。要注意 ./index.php/$1 要根据你目录(Web 目录,比如 http://www.domain.com/index.php)的实际情况来定,比如网站根目录是 /ci/index.php 则要写成 /ci/index.php/$1

RewriteCond $1 !^(index\.php|images|robots\.txt)

上面的代码意思是排除某些目录或文件,使得这些目录不会 rewrite 到 index.php 上,这一般用在图片、js、css 等外部资源上。也就是说非 PHP 代码都要排除出去。(这里我排除了 images 目录和 robots.txt 文件,当然 index.php 也应该被排除)
哦,对了,还要修改 config.php 这个文件中的下列内容:

/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = "index.php";

把其中的 “index.php” 改成 “” 就可以了。