codeigniter最佳数据库查询方法&注射预防

时间:2010-11-25 01:44:53

标签: php database codeigniter

我不确定哪个是运行数据库查询的最佳方法(或者这个问题的区别是什么) 之间:

$this->db
 ->select('*')
 ->from('table');
$this->db->get();

$this->db->query($sql);

我发现我需要get()类,因为我需要有分页,而限制器需要它......但也许另一个允许分页?

关于SQL注入的第二部分是否足够好?如果不是什么?

  $this->db
     ->select('*')
     ->from('table');
    $this->db->get();
 ->where('id >'.$this->db->escape(1));
谢谢。

2 个答案:

答案 0 :(得分:1)

以下代码在CodeIgniter中实现ActiveRecord库(尽管ActiveRecord通常指的是从数据库中获取值的一种完全不同的方式)。

$this->db
->select('*')
->from('table');
$this->db->get();

直到get()方法,ActiveRecord将在内部构建并存储SQL查询,然后,当您调用get()时,执行该查询并将其替换为结果对象,然后您可以使用结果访问该结果对象( ),result_array(),row()或row_array()。

以下代码将直接从您提供的$ sql参数执行SQL查询

$this->db->query($sql);

从那时起,如果您从数据库中选择数据,则可以执行以下操作:

$result = $this->db->result_array();

将该查询的结果导入数组。

对于分页,您可以使用两种方式。例如,如果每页有10条记录,则会获得第3页的记录:

$query = $this->db->select('*')->from('table')->limit(10, 30)->get();
if($query->num_rows())
{
    return $query->result_array();
}

return FALSE;

而且,如果您使用任何$ this-> db方法()(where()),CodeIgniter将自动转义您放入其中的值:

$this->db->where('id', "'i am a nasty piece of SQL';DROP DATABASE 'my_db'");

那很好 - CodeIgniter会为你处理它。只要始终注意,仅仅因为它已经为您完成,并不意味着没有其他方法可以在您的代码中暴露安全漏洞。

答案 1 :(得分:0)

因此,实现数据访问层和/或ORM的大多数框架都使用预准备语句。对于大多数简单查询,如果使用此接口,DAL / ORM将为您处理转义。例如:

$this->db->get_where('mytable', array('id' => $id), $limit, $offset);

使用此方法,它会将数组中的变量(array('column_name' => volumn_value'))参数绑定到查询中,并对它们执行转义。

或使用您的示例:

  $this->db
    ->select('*')
    ->from('table')
    ->where('id ', 1)->get();

查看他们应该帮助详细解释的文档:http://codeigniter.com/user_guide/database/active_record.html