我习惯于将常规的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。
感谢
答案 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);