Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_k_ekzamenu_po_BD (2).docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
951 Кб
Скачать
☆

69.Укажите особенности построения sql-запросов.

Для большинства задач MaxSite CMS предлагает уже готовые решения. Но иной раз встречаются задачи, которые требуют своих особых выборок из базы данных. Например в шаблоне вывести заголовки каких-то определенных записей; или при создании виджета под свою задачу.

Данные задачи решаются с помощью SQL. То есть вы создаете SQL-запрос, выполняете его, а полученные данные выводите в нужном виде.

Для работы с базой данных MaxSite CMS использует возможности CodeIgniter. С его помощью работа с БД значительно облегчается.

Одним из важных инструментов является т.н. Active Record. Особенностью Active Record является то, что SQL-запрос формируется пошагово. Давайте рассмотрим несколько примеров.

Предположим нам нужно получить все записи из таблицы «page» с полями «page_title» и «page_id».

$CI->db->select('page_title, page_id');

$query = $CI->db->get('page');

Данный код сформирует и выполнит такой SQL-запрос:

SELECT page_title, page_id FROM mso_page

Для начала отметим две достопримечательности Active Record. Первая - автоматически формируются имена таблиц с учетом префикса («mso_»). Вторая - автоматическое экранирование запросов на предмет уязвимостей и прочих нехороших вещей.

Функция $CI->db->get осуществляет саму выборку. Обратите внимание на переменную $CI. Эта переменная служит для доступа к «главному» классу CodeIgniter. Впрочем, если строго, то это может быть и любая другая переменная, но в MaxSite CMS я стараюсь придерживаться именно такого именования.

Я хочу привести полный рабочий пример, с тем чтобы вам стало понятно о чем идет речь. Комментирование я ставлю прямо в код - так будет легче разобраться.

$CI = & get_instance(); // вот здесь мы и получаем доступ к CodeIgniter

 

// формируем наш SQL

$CI->db->select('page_id, page_title'); // SELECT page_id, page_title

 

$CI->db->where('page_status', 'publish'); // WHERE 'page_status'='publish'

 

$CI->db->where('page_date_publish<', date('Y-m-d H:i:s')); // AND 'page_date_publish'<'дата'

 

$CI->db->order_by('page_date_publish', 'desc'); // ORDER BY page_date_publish DESC

 

$CI->db->limit('5'); // последние 5 записей

 

$query = $CI->db->get('page'); // FROM mso_page + выполнение запроса

// В итоге у нас вот такой SQL сформировался

//    SELECT page_id, page_title

//    WHERE 'page_status'='publish' AND 'page_date_publish'<'дата'

//    FROM mso_page

//    ORDER BY page_date_publish DESC

//    LIMIT 5

 

 

// проверяем сколько получено записей

if ($query->num_rows() > 0) // больше нуля, можно работать

{   

    $out = '';

    foreach ($query->result_array() as $page) // обходим в цикле

    {

        // формируем вывод - просто пример

        $out .= '<p>' . $page['page_id'] . ': ' . $page['page_title'] . '</p>';

    }

    echo $out; // выводим

}

Как вы уже поняли, этим кодом мы получаем последние пять опубликованных страниц. Главное удобство Active Record в том, что при формировании SQL можно указывать какие-то изменяемые параметры, например если вынести в админ-панель количество записей, то мы в $CI->db->limit пишем полученное значение. Другие же части SQL для нас не меняются.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]