snllll 发表于 2010-6-21 22:49:58

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

CI为何必须要在操作数据库的时候写这样的代码:
                        $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()的时候竟然是一片空白?

那位高手教教我。谢谢

spt119 发表于 2010-6-22 10:03:08

如果楼主用C++写过东西,就会发现,基于WEB层面的编程,其实已经简单多了。
另外,楼主提出的自动入库,键值对应,可能还需要等待。等待有一天,微软,或sun谁一统江湖,推出了一个全世界统一的编程标准,或者可以实现自动。

小维 发表于 2011-2-25 13:11:13

1、前台的字段 也就是input的name最好不要和数据库的字段相同
2、不能直接使用$datas=$_POST; 先不说验证不验证的问题,在一个复杂的应用中,往往有很多hidden的name,他们并不需要入库,只是提供程序逻辑参考,这么写代码插入数据库就出错了。
3、其实你的想法是可以实现的,怎么实现呢?看如下:


<form xxxxxx>
<input name='db_newstitle'/>
<input name='db_newbody'/>
<input type='hidden' name='hidden_isad' value='0'/>
</form>

这里有一个新闻标题,新闻内容,是否广告三个字段,是否是广告是一个hidden值,通过页面载入或者其他js判断和改变。
你可以看到,你要入库的字段,有一个'db_'前缀,其他的字段没有这个前缀。
后台代码可以如下写:

$prefix='db_';
$datas=array();
foreach($_POST as $key=>$value)
{
if(strstr($prefix,$key))
    $datas[]=array(substr($key,strlen($prefix))=>$value);
}

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

Hex 发表于 2010-6-23 09:40:48

楼上几位朋友都稍微注意一下,我想大家都是没有恶意的,就事论事就可以了。
另外,我觉得直接用 $_POST 入库,在一些不是很复杂的场合是很不错的,但是,这样会造成前端页面和数据库耦合性的增强,不利于解耦。在复杂应用的情况下会是个噩梦,呵呵。

kevinchen 发表于 2010-9-15 16:40:25

这个问题我把input扩展了一下,还是一样要指定接收哪个字段,只是POST可以传入数组,大家给点意见:

<?phpif ( ! 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);
        }
}

277850318 发表于 2010-6-24 21:28:44

CI全智能啦 那程序员 岂不是当傻子啦?

doutu 发表于 2010-6-24 21:01:49

$_POST直接入库?!写这类代码的人太不负责任,偷工减料

上善若水 发表于 2010-6-22 06:36:32

本帖最后由 上善若水 于 2010-6-22 06:42 编辑

{:3_55:}

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

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

如果要用隐藏字段来表示的话,会不会更啰嗦,或者sql 默认? 

snllll 发表于 2010-6-21 22:51:06

如果以上的代码能写成:$data = $this->input->post(); 这样就完美了,可是这样能行吗?

snllll 发表于 2010-6-21 22:56:10

$data =$_POST;

Hex 发表于 2010-6-21 22:59:48

这个东西,我觉得不能太简单了,直接把 $_POST 入库?我觉得这样编程不严谨,最起码要做一些字段限制,不能随随便便的就和数据库直接打交道。
虽然 ci 是会对 $_POST 做过滤的(如果打开了全局 xss 过滤的话)

snllll 发表于 2010-6-22 13:49:34

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

比如插入订单的时候,创建时间,订单初始状态等等, ...
上善若水 发表于 2010-6-22 06:36 http://codeigniter.org.cn/forums/images/common/back.gif
你忘记了,$_POST只是一个数组!而$data也是个数组,只不过这两个数组之间前者较之后者缺少了一些item,那么为什么你就不能 运用数组的计算方法把它们补足呢?
这样可以省下很多很多的代码的!

至于HEX老大提到的编程的严谨 上,这个倒是不足取,但是如果这个系统的应用很受限制,安全性方面几乎没有什么需要特别要求的话,为什么不这样做呢?
再说在model中操作数据库 之时已经经过controller中的数据合法性校验了。

snllll 发表于 2010-6-22 13:50:56

如果楼主用C++写过东西,就会发现,基于WEB层面的编程,其实已经简单多了。
另外,楼主提出的自动入库,键 ...
spt119 发表于 2010-6-22 10:03 http://codeigniter.org.cn/forums/images/common/back.gif


    另外,楼主提出的自动入库,键值对应,可能还需要等待。
是吗?你肯定?要等到oracle或者MS一统江湖的一天?你out了!

snllll 发表于 2010-6-22 13:53:09

这个东西,我觉得不能太简单了,直接把 $_POST 入库?我觉得这样编程不严谨,最起码要做一些字段限制,不能 ...
Hex 发表于 2010-6-21 22:59 http://codeigniter.org.cn/forums/images/common/back.gif


    我觉得在model中操作之前,我就在controller中做了数据的合法性校验了,这样做可以节省很多的代码,我添加的内容有很多项,这样做逐个赋值,会极大的耗费系统的性能,而且代码冗长。

Hex 发表于 2010-6-22 15:01:17

这个对于 CI 来说,很容易扩展成 $_POST 直接入库,但是 CI 官方不可能写出这样的功能的。
第三方类库在这里就要发挥价值了。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: CI是如此的啰嗦!令人费解,还是我没有学会一个技巧?