lovefuwei 发表于 2014-11-18 22:43:18

CI的一个问题,请教各位

本帖最后由 lovefuwei 于 2014-11-18 23:56 编辑

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

请看以下代码

<?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函数处理
        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;
      }



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

lovefuwei 发表于 2014-11-19 08:33:25

顶一下 希望各位开导下 以免以后再发生类似错误 少走弯路谢谢了

Closer 发表于 2014-11-19 09:24:33

少用關鍵字阿 像 insert 這種
你另外取個有意義文字吧

lovefuwei 发表于 2014-11-19 10:24:46

是因为用了关键字原因吗?

Closer 发表于 2014-11-19 13:32:12

不清楚,因為我都是避免去用它

Hex 发表于 2014-11-19 16:03:22

不要直接把 $_POST 扔进 insert 方法,这样很危险。
不做处理直接丢进去,当然容易出错了,因为URL传参会直接影响数据库的 sql 语句。

lovefuwei 发表于 2014-11-19 23:40:45

非常感谢指教,原因我以查明,是我自己的写法不够严谨造成。谢谢各位。以后技术问题还望多多指教
页: [1]
查看完整版本: CI的一个问题,请教各位