用户
 找回密码
 入住 CI 中国社区
搜索
查看: 65230|回复: 134
收起左侧

[模型] CI是如此的啰嗦!令人费解,还是我没有学会一个技巧?

  [复制链接]
发表于 2010-6-21 22:49:58 | 显示全部楼层 |阅读模式
CI为何必须要在操作数据库的时候写这样的代码:
PHP复制代码
                        $data = array(
                        'title'   => $this->input->post('title'),
                        'cid'     => $this->input->post('cid'),
                        'content' => $this->input->post('content'),
                        'time'    => (string) date('Y-m-j'),
                        );
                        $this->db->insert('news',$data);
                        if ($this->db->affected_rows())
                        {
                                return true;
                        }
                        else
                        {
                                return false;
                        }
复制代码

$data这个数组,如果我的后台我把表单的域的名称全部与数据库一一对应了,为何CI不能自动识别,还必须要“'title'   => $this->input->post('title'),” 这样一个个的逐个写出?这也太罗嗦了!!!
我输出 $this->input->post()的时候竟然是一片空白?

那位高手教教我。谢谢
发表于 2010-6-22 10:03:08 | 显示全部楼层
如果楼主用C++写过东西,就会发现,基于WEB层面的编程,其实已经简单多了。
另外,楼主提出的自动入库,键值对应,可能还需要等待。等待有一天,微软,或sun谁一统江湖,推出了一个全世界统一的编程标准,或者可以实现自动。
发表于 2011-2-25 13:11:13 | 显示全部楼层
1、前台的字段 也就是input的name最好不要和数据库的字段相同
2、不能直接使用$datas=$_POST; 先不说验证不验证的问题,在一个复杂的应用中,往往有很多hidden的name,他们并不需要入库,只是提供程序逻辑参考,这么写代码插入数据库就出错了。
3、其实你的想法是可以实现的,怎么实现呢?看如下:

HTML复制代码
 
<form xxxxxx>
  <input name='db_newstitle'/>
  <input name='db_newbody'/>
  <input type='hidden' name='hidden_isad' value='0'/>
</form>
 
复制代码

这里有一个新闻标题,新闻内容,是否广告三个字段,是否是广告是一个hidden值,通过页面载入或者其他js判断和改变。
你可以看到,你要入库的字段,有一个'db_'前缀,其他的字段没有这个前缀。
后台代码可以如下写:
PHP复制代码
 
$prefix='db_';
$datas=array();
foreach($_POST as $key=>$value)
{
  if(strstr($prefix,$key))
    $datas[]=array(substr($key,strlen($prefix))=>$value);
}
 
复制代码

这样处理,$datas数组里面就有一个title  一个 body。
至于提交数据库前的验证,这里可以使用CI的验证类,具体怎么验证自己看验证类吧。

点评

不错!  发表于 2012-7-16 20:16

评分

参与人数 1威望 +5 收起 理由
Hex + 5 非常赞成!!

查看全部评分

发表于 2010-6-23 09:40:48 | 显示全部楼层
楼上几位朋友都稍微注意一下,我想大家都是没有恶意的,就事论事就可以了。
另外,我觉得直接用 $_POST 入库,在一些不是很复杂的场合是很不错的,但是,这样会造成前端页面和数据库耦合性的增强,不利于解耦。在复杂应用的情况下会是个噩梦,呵呵。
发表于 2010-9-15 16:40:25 | 显示全部楼层
这个问题我把input扩展了一下,还是一样要指定接收哪个字段,只是POST可以传入数组,大家给点意见:
PHP复制代码
 
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Input extends CI_Input {
        /**
        * Fetch items from the GET array
        *
        * @access       public
        * @param        mixed
        * @param        bool
        * @return       string
        */

        function get($index = '', $xss_clean = FALSE)
        {
                if(is_array($index))
                {
                        $rt = array();
                        foreach ($index as $key)
                                $rt[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean);
                        return $rt;
                }
                else
                        return $this->_fetch_from_array($_GET, $index, $xss_clean);
        }
 
        // --------------------------------------------------------------------
 
        /**
        * Fetch items from the POST array
        *
        * @access       public
        * @param        mixed
        * @param        bool
        * @return       string
        */

        function post($index = '', $xss_clean = FALSE)
        {
                if(is_array($index))
                {
                        $rt = array();
                        foreach ($index as $key)
                                $rt[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
                        return $rt;
                }
                else
                        return $this->_fetch_from_array($_POST, $index, $xss_clean);
        }
}
 
复制代码

点评

bob
收藏代码  发表于 2014-5-20 11:11

评分

参与人数 1威望 +2 收起 理由
Hex + 2 支持!

查看全部评分

发表于 2010-6-24 21:28:44 | 显示全部楼层
CI全智能啦 那程序员 岂不是当傻子啦?
发表于 2010-6-24 21:01:49 | 显示全部楼层
$_POST直接入库?!写这类代码的人太不负责任,偷工减料
发表于 2010-6-22 06:36:32 | 显示全部楼层
本帖最后由 上善若水 于 2010-6-22 06:42 编辑



把框架想得太神了吧.....................

比如插入订单的时候,创建时间,订单初始状态等等,都应该是必填字段
这些都应该是用php生成的吧,按你这个方法插入数据库怎么判断?你不会觉得应该CI也给你补上吧

如果要用隐藏字段来表示的话,会不会更啰嗦,或者sql 默认? 
 楼主| 发表于 2010-6-21 22:51:06 | 显示全部楼层
如果以上的代码能写成:$data = $this->input->post(); 这样就完美了,可是这样能行吗?
 楼主| 发表于 2010-6-21 22:56:10 | 显示全部楼层
$data =$_POST;

点评

同上  发表于 2012-12-14 09:42
发表于 2010-6-21 22:59:48 | 显示全部楼层
这个东西,我觉得不能太简单了,直接把 $_POST 入库?我觉得这样编程不严谨,最起码要做一些字段限制,不能随随便便的就和数据库直接打交道。
虽然 ci 是会对 $_POST 做过滤的(如果打开了全局 xss 过滤的话)
 楼主| 发表于 2010-6-22 13:49:34 | 显示全部楼层
把框架想得太神了吧.....................

比如插入订单的时候,创建时间,订单初始状态等等, ...
上善若水 发表于 2010-6-22 06:36

你忘记了,$_POST只是一个数组!而$data也是个数组,只不过这两个数组之间前者较之后者缺少了一些item,那么为什么你就不能 运用数组的计算方法把它们补足呢?
这样可以省下很多很多的代码的!

至于HEX老大提到的编程的严谨 上,这个倒是不足取,但是如果这个系统的应用很受限制,安全性方面几乎没有什么需要特别要求的话,为什么不这样做呢?
再说在model中操作数据库 之时已经经过controller中的数据合法性校验了。
 楼主| 发表于 2010-6-22 13:50:56 | 显示全部楼层
如果楼主用C++写过东西,就会发现,基于WEB层面的编程,其实已经简单多了。
另外,楼主提出的自动入库,键 ...
spt119 发表于 2010-6-22 10:03



    另外,楼主提出的自动入库,键值对应,可能还需要等待。
是吗?你肯定?要等到oracle或者MS一统江湖的一天?你out了!
 楼主| 发表于 2010-6-22 13:53:09 | 显示全部楼层
这个东西,我觉得不能太简单了,直接把 $_POST 入库?我觉得这样编程不严谨,最起码要做一些字段限制,不能 ...
Hex 发表于 2010-6-21 22:59



    我觉得在model中操作之前,我就在controller中做了数据的合法性校验了,这样做可以节省很多的代码,我添加的内容有很多项,这样做逐个赋值,会极大的耗费系统的性能,而且代码冗长。
发表于 2010-6-22 15:01:17 | 显示全部楼层
这个对于 CI 来说,很容易扩展成 $_POST 直接入库,但是 CI 官方不可能写出这样的功能的。
第三方类库在这里就要发挥价值了。

本版积分规则