如何在CI中使用常规pdo

时间:2011-12-04 09:24:21

标签: php codeigniter pdo

我习惯于将常规的pdo语句写入php如何在不学习活动记录或使用CI中的任何其他方法的情况下继续这样做

我做了类似这样的事情

$sql = "select column1,column2 from table where column_id = :column_id and column_2 = :something"
$query = $db->query($sql);
$query->bindParam(":column_id", $_GET['value'], PDO::PARAM_INT);
$query->bindParam(":something", $_GET['something'], PDO::PARAM_STR);
$query->execute();

while($row = $query->fetch(PDO::FETCH_OBJ)
{
   print $row->data;
}

而不是使用$ _GET我可以使用$ this-> uri-> segment() 希望能与之合作...

我查看了活动记录,这看起来像一个很糟糕的主意,我不知道Ellislab在想什么。不知道复杂的查询如何进入它们。我是netbuts的新手学习我可能是错的,请告诉我,如果我。只是从我到目前为止所学到的东西说起。

以其他方式编写查询语句,例如

$ query = $ this-> db-> query(“我的sql语句”)我将不得不转义我使用codeigniters转义方法查询的每个值,或者只使用mysql_real_escape_string。这是我在潜入mvc世界之前可以做的事情,但我之所以选择pdo是因为它已经运作良好。

我怎样才能实现我已经习惯的东西?我不介意修改核心文件,生病有希望最终学习所有课程以进行逆向工程,但直到那一天到来我才有希望写出我自己的mvc。

感谢

2 个答案:

答案 0 :(得分:2)

抱歉,我看不出这是怎么回事:

$query = $this->db->select('column1,column2')
                 ->from('table')
                 ->where('column_id',$this->input->get('value'))
                 ->where('column_2',$this->input->get('something'))
                 ->get();
return $query->results();

“看起来像很多额外的工作”而不是这个:

$sql = "select column1,column2 from table where column_id = :column_id and column_2 = :something"
$query = $db->query($sql);
$query->bindParam(":column_id", $_GET['value'], PDO::PARAM_INT);
$query->bindParam(":something", $_GET['something'], PDO::PARAM_STR);
$query->execute();

请记住,AR 会自动转义,因此您不必担心SQL注入。

如果您更习惯于查询绑定,也可以执行

$sql = "select column1,column2 from table where column_id = ? and column_2 = ?";
$query = $this->db->query($sql, array($this->uri->segment(3), $something);

并利用参数化,而不使用Active Record类。

没有什么能阻止你使用PDO,甚至mysql_ *来代替Active Record类。并且您的查询没有任何阻止CI使用它 - 除了您必须启用的$_GET数组,但可以轻松地用$this->input->get()替换或手动获取URI段或将其自动传递给控制器方法,通常发生。

你说“我是一个从nettuts学习的新手”,但仍然说Ellislabs不知道它在做什么;轻量级,远非完美的CI有一个坚实的社区,积极发展,其普遍的共识是相当高的;如果它决定以活动记录的方式进行,那就有一个原因。

另外,请考虑其他更合适且真实的ORM,如Propel或Doctrine,在运行查询时使用类似的样式(如果您愿意,也可以使用它们而不是AR),利用PHP5连接。从推进器的正面看一个例子:

$books = BookQuery::create()  // retrieve all books...
  ->filterByPublishYear(2009) // ... published in 2009
  ->orderByTitle()            // ... ordered by title
  ->joinWith('Book.Author')   // ... with their author
  ->find();

所以我认为CI的Active Record实现或结构化的方式并不奇怪。如果您的代码没有运行,请提供更多详细信息,例如错误代码等,以便我们真正了解为什么它无效。

重要:

我刚看过最新版本的changelog;尝试下载它(版本2.10),因为他们声明:

  

为数据库驱动程序添加了PDO驱动程序。

答案 1 :(得分:0)

如果您没有使用ActiveRecord或其他功能,则无法使用CI的DB类获取任何内容。为什么不直接使用PDO?

顺便说一下,你可以这样做:

$result = $this->db->
    select(array('column1', 'column2'))->
    where(array(
        'column1' => $this->input->get('value'),
        'column2' => $this->input->get('something')
    ))->get('table')->result();

print_r($result);