- Введение в реализацию подготовленных отчетов Joomla 4
- Причина реализации подготовленных отчетов в Joomla 4
- Реализация подготовленных отчетов через
JDatabaseDriver
Введение в реализацию подготовленных отчетов Joomla 4
В Joomla 4 вы увидите, как Joomla постепенно переходит к использованию подготовленных инструкций для всех наших запросов. Цель этой статьи — объяснить, почему и как мы это делаем.
Причина реализации подготовленных отчетов в Joomla 4
В PHP 5.3 введена концепция подготовленных операторов. В Joomla 4 мы собираемся начать использовать их в своих интересах. Основное преимущество подготовленных операторов состоит в том, чтобы уменьшить подверженность базы кода атакам SQL-инъекций, отправляя запрос и данные отдельно. Вы можете представить, как PHP отправляет запрос следующим образом:
Prepared Statements
Query: SELECT foobar FROM bar WHERE foo = ?
Data: [? = 'bar']
После этого сама база данных выполнит тяжелую работу по разбору вашего заявления. Поскольку база данных отвечает за разбор запроса, это снижает сложность кодовой базы Joomla, а также снижает вероятность ошибок в кодировании, приводящих к каким-либо ошибкам.
Реализация подготовленных отчетов через JDatabaseDriver
Реализация подготовленных заявлений в Joomla очень проста и является кроссплатформенной. Например, вот простой запрос Joomla 3.x из плагина аутентификации Joomla.
$query = $this->db->getQuery(true)
->select($this->db->quoteName(array('id', 'password')))
->from($this->db->quoteName('#__users'))
->where($this->db->quoteName('username') . '=' . $this->db->quote($credentials['username']));
Чтобы преобразовать его в подготовленный оператор, мы вместо имени пользователя заменим именованное значение, а затем свяжем наши реальные данные с запросом.
$query = $this->db->getQuery(true)
->select($this->db->quoteName(array('id', 'password')))
->from($this->db->quoteName('#__users'))
->where($this->db->quoteName('username') . ' = :username')
->bind(':username', $credentials['username']);
Как вы можете видеть, добавляя еще одну строку в запрос, нам больше не нужно указывать данные — мы позволяем нашей базе данных mysql/postgresql обрабатывать это за нас, что значительно облегчает чтение кода и управление им.
Некоторые функции в JDatabaseDriver
будут автоматически использовать подготовленные инструкции. Например, whereIn() и whereNotIn() автоматически будут использовать значения и добавлять подготовленные операторы в запрос.
$query = $this->db->getQuery(true)
->select($this->db->quoteName(array('id, password')))
->from($this->db->quoteName('#__users'))
->whereIn($this->db->quoteName('id'), [ 1, 2, 3 ]);
Этот запрос будет преобразован в подготовленную инструкцию sql.
SELECT
`id`, `password`
FROM
`#__users`
WHERE
`id` IN (
:preparedArray1,
:preparedArray2,
:preparedArray3
);
Заполнители :preparedArray1-3
будут заполнены 1,2,3
при выполнении.
Следующие функции принимают массивы, чтобы уменьшить накладные расходы на вызов функций.
- bind()
- bindArray()
- whereIn()
- whereNotIn()
Везде, где возможно, вам следует использовать подготовленные инструкции.
Перевод с английского официальной документации Joomla 4:
https://docs.joomla.org/J4.x:Moving_Joomla_To_Prepared_Statements
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)