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: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;
}
所以第二处错误请自己找自己原因
顶一下 希望各位开导下 以免以后再发生类似错误 少走弯路谢谢了 少用關鍵字阿 像 insert 這種
你另外取個有意義文字吧 是因为用了关键字原因吗? 不清楚,因為我都是避免去用它 不要直接把 $_POST 扔进 insert 方法,这样很危险。
不做处理直接丢进去,当然容易出错了,因为URL传参会直接影响数据库的 sql 语句。 非常感谢指教,原因我以查明,是我自己的写法不够严谨造成。谢谢各位。以后技术问题还望多多指教
页:
[1]