Есть ли способ передать аргументы в запрос в CodeIgniter * без * с помощью ActiveRecord? - PullRequest
0 голосов
/ 09 октября 2008

Это то, что я хотел бы сделать, но это не представляется возможным: (редактировать: заменить одинарные на двойные кавычки)

function get_archives($limit, $offset) 
{
    $query = $this->db->query("
        SELECT  archivalie.id, 
                archivalie.signature, 
                type_of_source.description AS type_of_source_description, 
                media_type.description AS media_type_description,
                origin.description AS origin_description

        FROM    archivalie, 
                type_of_source, 
                media_type,
                origin

        WHERE   archivalie.type_of_source_id = type_of_source.id                                                        
        AND     type_of_source.media_type_id = media_type.id  
        AND     archivalie.origin_id = origin.id                                                                     

        ORDER BY    archivalie.id ASC
        LIMIT       $limit, $offset
    "); 


    // etc...

}

выдает эту ошибку: (изменить: новое сообщение об ошибке с использованием двойных кавычек и с номером смещения, переданным в URL)

ERROR: LIMIT #,# syntax is not supported HINT: Use separate LIMIT and OFFSET clauses.

Это работает, только если вы передаете переменные в формате ActiveRecord:

$this->db->select('archivalie.id, archivalie.signature, etc, etc');
// from, where, etc.
$this->db->limit($limit, $offset);        
$query = $this->db->get();

Ответы [ 4 ]

2 голосов
/ 14 октября 2012
$query = $this->db->query('
SELECT  archivalie.id, 
        archivalie.signature, 
        type_of_source.description AS type_of_source_description, 
        media_type.description AS media_type_description,
        origin.description AS origin_description
FROM    archivalie, 
        type_of_source, 
        media_type,
        origin
WHERE   archivalie.type_of_source_id = type_of_source.id                                                        
AND     type_of_source.media_type_id = media_type.id  
AND     archivalie.origin_id = origin.id                                                                     
ORDER BY    archivalie.id ASC
LIMIT       ?
OFFSET      ?',array($limit,$offset));
1 голос
/ 10 октября 2008

Это сработало:

$query = $this->db->query("
    SELECT  archivalie.id, 
            archivalie.signature, 
            type_of_source.description AS type_of_source_description, 
            media_type.description AS media_type_description,
            origin.description AS origin_description

    FROM    archivalie, 
            type_of_source, 
            media_type,
            origin

    WHERE   archivalie.type_of_source_id = type_of_source.id                                                        
    AND     type_of_source.media_type_id = media_type.id  
    AND     archivalie.origin_id = origin.id                                                                     

    ORDER BY    archivalie.id ASC
    LIMIT       $limit
    OFFSET      $offset
");

Но требуется проверка, чтобы назначить значение по умолчанию, если в URL нет смещения. С моего контроллера:

# Check/assign an offset
$offset = (!$this->uri->segment(3)) ? 0 : $this->uri->segment(3);

# Get the data
$archives = $this->archive->get_archives($config['per_page'], $offset);
0 голосов
/ 07 декабря 2016

Это связано с типом данных параметра. Если вы не хотите, чтобы codeigniter добавлял одинарные кавычки, убедитесь, что вы передаете целое число.

$page = '10'; // for some reason this arrives as a string
$sql = "select * from customers limit 10 offset ?";
$result = $this->db->query($sql, array(intval($page));
0 голосов
/ 09 октября 2008

Если бы вы использовали двойные кавычки вместо одинарных кавычек, это сработало бы, но вы были бы открыты для инъекционной атаки, если переменные не были должным образом очищены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...