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()的时候竟然是一片空白?
那位高手教教我。谢谢 如果楼主用C++写过东西,就会发现,基于WEB层面的编程,其实已经简单多了。
另外,楼主提出的自动入库,键值对应,可能还需要等待。等待有一天,微软,或sun谁一统江湖,推出了一个全世界统一的编程标准,或者可以实现自动。 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的验证类,具体怎么验证自己看验证类吧。 楼上几位朋友都稍微注意一下,我想大家都是没有恶意的,就事论事就可以了。
另外,我觉得直接用 $_POST 入库,在一些不是很复杂的场合是很不错的,但是,这样会造成前端页面和数据库耦合性的增强,不利于解耦。在复杂应用的情况下会是个噩梦,呵呵。 这个问题我把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);
}
}
CI全智能啦 那程序员 岂不是当傻子啦? $_POST直接入库?!写这类代码的人太不负责任,偷工减料 本帖最后由 上善若水 于 2010-6-22 06:42 编辑
{:3_55:}
把框架想得太神了吧.....................
比如插入订单的时候,创建时间,订单初始状态等等,都应该是必填字段
这些都应该是用php生成的吧,按你这个方法插入数据库怎么判断?你不会觉得应该CI也给你补上吧
如果要用隐藏字段来表示的话,会不会更啰嗦,或者sql 默认? 如果以上的代码能写成:$data = $this->input->post(); 这样就完美了,可是这样能行吗? $data =$_POST; 这个东西,我觉得不能太简单了,直接把 $_POST 入库?我觉得这样编程不严谨,最起码要做一些字段限制,不能随随便便的就和数据库直接打交道。
虽然 ci 是会对 $_POST 做过滤的(如果打开了全局 xss 过滤的话) 把框架想得太神了吧.....................
比如插入订单的时候,创建时间,订单初始状态等等, ...
上善若水 发表于 2010-6-22 06:36 http://codeigniter.org.cn/forums/images/common/back.gif
你忘记了,$_POST只是一个数组!而$data也是个数组,只不过这两个数组之间前者较之后者缺少了一些item,那么为什么你就不能 运用数组的计算方法把它们补足呢?
这样可以省下很多很多的代码的!
至于HEX老大提到的编程的严谨 上,这个倒是不足取,但是如果这个系统的应用很受限制,安全性方面几乎没有什么需要特别要求的话,为什么不这样做呢?
再说在model中操作数据库 之时已经经过controller中的数据合法性校验了。 如果楼主用C++写过东西,就会发现,基于WEB层面的编程,其实已经简单多了。
另外,楼主提出的自动入库,键 ...
spt119 发表于 2010-6-22 10:03 http://codeigniter.org.cn/forums/images/common/back.gif
另外,楼主提出的自动入库,键值对应,可能还需要等待。
是吗?你肯定?要等到oracle或者MS一统江湖的一天?你out了! 这个东西,我觉得不能太简单了,直接把 $_POST 入库?我觉得这样编程不严谨,最起码要做一些字段限制,不能 ...
Hex 发表于 2010-6-21 22:59 http://codeigniter.org.cn/forums/images/common/back.gif
我觉得在model中操作之前,我就在controller中做了数据的合法性校验了,这样做可以节省很多的代码,我添加的内容有很多项,这样做逐个赋值,会极大的耗费系统的性能,而且代码冗长。 这个对于 CI 来说,很容易扩展成 $_POST 直接入库,但是 CI 官方不可能写出这样的功能的。
第三方类库在这里就要发挥价值了。