2011-12-04 55 views
1

我習慣編寫正PDO語句到PHP我如何能繼續這樣做,而不必學習活動記錄或使用任何其他方法存在CI如何在CI使用常規PDO

我做了這樣的事情

$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我也許可以用$這個 - > URI->段() 它希望通過這個工程...

我看着活動記錄和看起來像一個巨大的壞主意,我不知道Ellislab在想什麼。不知道如何複雜的查詢可以進入他們。我是一個從nettuts學習的新手,我可能是錯的,請告訴我,如果我是。只是從我迄今爲止所瞭解的情況來談。

書面查詢statments的otherway如

$查詢= $這個 - > DB->查詢(「我的sql語句」)我將不得不逃離我與codeigniters逃生方法或只使用查詢每個值mysql_real_escape_string。這是我在潛入mvc世界之前所能做的事情,但我選擇了pdo,因爲它的功能已經很好。

我怎麼能實現什麼,我已經習慣了?我不介意修改核心文件,希望最終能夠學習所有的類來逆向工程,但直到那一天,我將有希望寫我自己的mvc。

感謝

+1

如果你不願意學習CI使用的方法,那麼沒有它可能會更好。 MVC框架和它們的數據庫處理通常是如此緊密地聯繫在一起,試圖應用自己的問題只是在整個過程中尋求麻煩。 – JJJ

+0

你能解釋一下它可能會如何麻煩嗎?不能我只是將我的查詢添加到一個方法,並將其添加到控制器的某個地方? –

+0

稍後,當遇到錯誤或問題時,您無法確定是因爲您的自定義DB處理程序還是其他原因。當您不使用標準設置時,很難再提供建議。另外,正如答案評論中提到的,框架爲您做了很多工作,所以從長遠來看,您將節省時間和精力。 – JJJ

回答

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_ *什麼是重要的,而不是活動記錄類。您的查詢沒有阻止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驅動程序。

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); 
+0

活動記錄看起來像很多額外的工作時,當我必須寫10個或更多的查詢行。我已嘗試使用pdo本地進入它,它沒有工作。我習慣於使用:類型而不是其他類型。你提供的例子我仍然必須逃脫,修剪,以及其他任何必要的獲取和帖子。 –

+1

ActiveRecord會在所有字段周圍放置滴答滴答,輸入類將會XSS過濾,你所要做的就是修剪()。聽起來對我來說很少工作;)。新是可怕的,但值得在這裏努力。 – landons

+0

新是可怕的只是額外的東西學習,希望及時不適應它,並感謝您的意見。順便說一句,我的朋友剛剛創建了一個類似於CI的MVC,他用我的問題中描述的相同方式使用Pdo。你認爲從長遠來看,它會導致問題嗎? –