codeigniter лучший метод запроса БД и предотвращение инъекций - PullRequest
0 голосов
/ 25 ноября 2010

Я не уверен, что это лучший способ выполнить запрос к БД (или какая разница в этом отношении) между:

$this->db
 ->select('*')
 ->from('table');
$this->db->get();

и

$this->db->query($sql);

Я обнаружил, что мне нужен класс get (), потому что мне нужно иметь нумерацию страниц, и это необходимо для ограничителей .... но, может быть, другой тоже допускает нумерацию страниц?

вторая часть об SQL-инъекциях - это достаточно хорошо? если не то, что есть?

  $this->db
     ->select('*')
     ->from('table');
    $this->db->get();
 ->where('id >'.$this->db->escape(1));

спасибо.

Ответы [ 2 ]

1 голос
/ 25 ноября 2010

Следующий код реализует библиотеку ActiveRecord в CodeIgniter (хотя ActiveRecord обычно ссылается на совершенно другой способ получения значений из базы данных).

$this->db
->select('*')
->from('table');
$this->db->get();

Прямо до метода get () ActiveRecord создаст и сохранит SQL-запрос внутренне, а затем, когда вы вызываете get (), выполните этот запрос и замените его объектом результата, к которому затем можно получить доступ с помощью result ( ), result_array (), row () или row_array ().

Следующий код выполнит SQL-запрос непосредственно из заданного вами аргумента $ sql

$this->db->query($sql);

С этого момента, если вы ВЫБИРАЛИ данные из своей базы данных, вы можете сделать это:

$result = $this->db->result_array();

чтобы получить результаты этого запроса в массив.

Для нумерации страниц вы можете использовать оба способа. Это, например, получит записи для страницы 3, если у вас было 10 записей на странице:

$query = $this->db->select('*')->from('table')->limit(10, 30)->get();
if($query->num_rows())
{
    return $query->result_array();
}

return FALSE;

И, если вы используете какой-либо из методов $ this-> db () (where ()), CodeIgniter автоматически экранирует введенные в него значения:

$this->db->where('id', "'i am a nasty piece of SQL';DROP DATABASE 'my_db'");

Это было бы хорошо - CodeIgniter позаботится об этом за вас. Просто всегда помните, что то, что это сделано для вас, не означает, что в вашем коде нет других способов выявить уязвимости в безопасности.

0 голосов
/ 25 ноября 2010

Таким образом, большинство платформ, которые реализуют уровень доступа к данным и / или ORM, используют подготовленный оператор. Для большинства простых запросов, если вы используете этот интерфейс, DAL / ORM будет обрабатывать экранирование для вас. Например:

$this->db->get_where('mytable', array('id' => $id), $limit, $offset);

Используя этот метод, он свяжет переменные в массиве (array('column_name' => volumn_value')) с запросом и выполнит экранирование.

Или используя ваш пример:

  $this->db
    ->select('*')
    ->from('table')
    ->where('id ', 1)->get();

посмотрите документы, которые они должны объяснить подробно: http://codeigniter.com/user_guide/database/active_record.html

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