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

[HELP] CI的一个问题,请教各位

[复制链接]
发表于 2014-11-18 22:43:18 | 显示全部楼层 |阅读模式
本帖最后由 lovefuwei 于 2014-11-18 23:56 编辑

最近用CI开发一个音乐站,这也是我第一次用CI写一个项目,使用起来感觉CI很简单非常不错,但是有几个问题我就有点不太明白。

请看以下代码
PHP复制代码
 
<?php
class Singer extends CI_Controller
{
public function add()
{
$post = $this -> input -> post();
$this -> load -> model('singer_model');
$rs = $this -> singer_model -> insert($post);
}
}
 
复制代码



然后模型中间使用CI的文档中的写法$this -> db -> insert($data);

固然 一般是不会出错都可以写入数据库,但是有几种情况很疑惑

1. 在配置文件中开启全局的XSS过滤 但是我在提交的表单中只要有* / \ 一些特殊符号,数据库就报错1064语法错误,全局这个没有做相应的过滤的么?
这回自己图快没辙一个个修改成 $post['singer_name'] = $this -> input -> post('singer_name',true);的形式。

2. 修改以后与修改前还会出一个问题,就是修改数据也是用官方的$this -> db -> update()来操作,某种情况是没问题,但是有的时候报语法错误,1064,奇怪仔细一看 $update['singer_info'] = $this -> input -> post('singer_info',true); 这里在SQL语句中间SET `singer_info` = xxx居然没引号了,难道CI在拼接SQL语句的时候这方面不做处理? $update['created_at'] = date('Y-m-d H:i:s');这个也是提示1064 一看是没引号,没辙改成$update['created_at'] = "'".date('Y-m-d H:i:s)."'"这样的形式两边加个引号,才不报错,我很纳闷,新手求解答!
发表于 2014-11-19 20:15:28 | 显示全部楼层
本帖最后由 一叶扁舟 于 2014-11-19 20:25 编辑

1,AR模型主要负责SQL拼接,数据检测什么的功能毕竟有限,所以数据必须要经过自己验证再进行数据库操作,不想写数据验证的话CI提供的有验证类
2,再用update函处理set部分时候,数据value都会经过escape函数处理
PHP复制代码
 
        public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
        {
                // Combine any cached components with the current statements
                $this->_merge_cache();
 
                if ( ! is_null($set))
                {
                        $this->set($set);
                }
       。。。。
     public function set($key, $value = '', $escape = TRUE)
        {
                $key = $this->_object_to_array($key);
 
                if ( ! is_array($key))
                {
                        $key = array($key => $value);
                }
 
                foreach ($key as $k => $v)
                {
                        if ($escape === FALSE)
                        {
                                $this->ar_set[$this->_protect_identifiers($k)] = $v;
                        }
                        else
                        {
                                $this->ar_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v);
                        }
                }
 
                return $this;
        }
     。。。。
        function escape($str)
        {
                if (is_string($str))
                {
                        $str = "'".$this->escape_str($str)."'";
                }
                elseif (is_bool($str))
                {
                        $str = ($str === FALSE) ? 0 : 1;
                }
                elseif (is_null($str))
                {
                        $str = 'NULL';
                }
 
                return $str;
        }
 
 
复制代码


所以第二处错误请自己找自己原因

 楼主| 发表于 2014-11-19 08:33:25 | 显示全部楼层
顶一下 希望各位开导下 以免以后再发生类似错误 少走弯路谢谢了
发表于 2014-11-19 09:24:33 | 显示全部楼层
少用關鍵字阿 像 insert 這種
你另外取個有意義文字吧
 楼主| 发表于 2014-11-19 10:24:46 | 显示全部楼层
是因为用了关键字原因吗?
发表于 2014-11-19 13:32:12 | 显示全部楼层
不清楚,因為我都是避免去用它
发表于 2014-11-19 16:03:22 | 显示全部楼层
不要直接把 $_POST 扔进 insert 方法,这样很危险。
不做处理直接丢进去,当然容易出错了,因为URL传参会直接影响数据库的 sql 语句。
 楼主| 发表于 2014-11-19 23:40:45 | 显示全部楼层
非常感谢指教,原因我以查明,是我自己的写法不够严谨造成。谢谢各位。以后技术问题还望多多指教

本版积分规则