2012-08-08 73 views
1

我想知道這條SQL語句是否在Codeigniter活動記錄中完成。codeigniter活動記錄獲得最後10條記錄和排序ASC

SELECT * FROM (
SELECT * 
FROM chat 
WHERE (userID = $session AND toID = $friendID) 
OR (userID = $friendID AND toID = $session) 
ORDER BY id DESC 
LIMIT 10 
) AS `table` ORDER by id ASC 
+2

是的。這是如何:http://codeigniter.com/user_guide/database/active_record.html – 2012-08-08 12:57:29

回答

0

您可以使用查詢爲:

$this->db->select('SELECT * 
    FROM chat 
    WHERE (userID = $session AND toID = $friendID) 
    OR (userID = $friendID AND toID = $session) 
    ORDER BY id DESC 
    LIMIT 10') AS `table` ORDER by id ASC', FALSE); 
+1

這是不可取的,因爲它不會跳過查詢的參數。您在SQL注入中運行風險。 – 2012-08-08 13:22:30

+0

但它在codeigniter用戶指南中 http://codeigniter.com/user_guide/database/active_record.html#select – 2012-08-08 13:24:39

+1

是的,它在用戶指南中,但它不是一個好主意,將變量傳遞給未轉義的查詢。這意味着有人可以輕鬆操縱它。如果有人決定劫持$ session變量,他們可以刪除數據庫中的所有表(如果mysql用戶有權限的話)。雖然,你的例子中的變量無論如何都不會被解析,因爲你使用了單引號,所以我猜它是可以的;) – Brendan 2012-08-08 13:38:30

1

這將工作,但不是活動的記錄變種。

$this->db->query("SELECT * FROM (
    SELECT * 
    FROM chat 
    WHERE (userID = ? AND toID = ?) 
    OR (userID = ? AND toID = ?) 
    ORDER BY id DESC 
    LIMIT 10 
    ) AS `table` ORDER by id ASC", array($session, $friendID, $friendID, $session));" 
5

你必須使用活動記錄類的_compile_select()_reset_select()方法。

$this->db->select('*'); 
$this->db->from('chat'); 
$this->db->where("(userID='{$session}' AND toID='{$friendID}')"); 
$this->db->or_where("(userID='{$friendID}' AND toID='{$session}')"); 
$this->db->order_by('id', 'DESC'); 
$this->db->limit('10'); 

$subQuery = $this->db->_compile_select(); 

$this->db->_reset_select(); 

$this->db->select('*'); 
$this->db->from("{$subQuery} AS table"); 
$this->db->order_by('id', 'ASC'); 

$query = $this->db->get(); 

不幸的是,在CI 2.0+,_compile_select()_reset_select()保護方法。遊民。你必須遵循this tutorial上擴展數據庫驅動程序,您可以編寫以下方法:

function get_compiled_select() 
{ 
    return $this->db->_compile_select(); 
} 

function do_reset_select() 
{ 
    $this->db->_reset_select(); 
} 

我想花時間指出,這種類型的行動將通過連接得到更好的服務。你應該考慮改變你的數據庫結構,以便聯接可能和有效。