收藏本站 Archiver
    请 后使用快捷导航
    没有账号?入住 CI 中国社区
    查看: 70372|回复: 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 过滤的话)
    7
    楼主| 发表于 2010年6月22日 13:49:34 | 只看该作者
    把框架想得太神了吧.....................

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

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

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



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



    我觉得在model中操作之前,我就在controller中做了数据的合法性校验了,这样做可以节省很多的代码,我添加的内容有很多项,这样做逐个赋值,会极大的耗费系统的性能,而且代码冗长。
    10
    发表于 2010年6月22日 15:01:17 | 只看该作者
    这个对于 CI 来说,很容易扩展成 $_POST 直接入库,但是 CI 官方不可能写出这样的功能的。
    第三方类库在这里就要发挥价值了。
    下一页 »
    12 3 4 5 6 7 8 9 10 ... 13 下一页
    返回列表
    您需要登录后才可以回帖 登录 | 入住 CI 中国社区

    本版积分规则

    AltStyle によって変換されたページ (->オリジナル) /