Архив за Октябрь 2008

Каталог продукции: сортировка + постраничная навигация

В предыдущих заметках я уже упоминал о постраничной навигации и сортировке результатов SQL-запроса. Сегодня напишем небольшой скрипт каталога продукции, который объединит в единое целое навигацию и сортировку. Поскольку все подробности уже были рассмотрены, долго разглагольстовать не буду:

<?php
$dblocation = "localhost";   // Имя сервера
$dbuser     = "root";        // Имя пользователя
$dbpswrd    = "";            // Пароль
$dbname     = "products";    // Имя базы данных

DEFINE('ITEMS_PER_PAGE', 7);

// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES cp1251' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );

// Выбираем из БД общее количество записей
$query = "SELECT COUNT(*) FROM products WHERE 1";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );
   
// Проверяем передан ли номер текущей страницы (постраничная навигация)
if ( isset($_GET['page']) ) {
  $page = (int)$_GET['page'];
  if ( $page < 1 ) $page = 1;
} else {
  $page = 1;
}

$uri = $_SERVER['PHP_SELF'].'?';
if ( $_SERVER['QUERY_STRING'] != '' ) {
  foreach( $_GET as $key => $value ) {
    if ( $key != 'page' ) $uri = $uri.$key.'='.urlencode($value).'&';
  } 
}
// Сколько всего получится страниц
$cnt_pages = ceil( $total / ITEMS_PER_PAGE );
if ( $page > $cnt_pages ) $page = $cnt_pages;
// Начальная позиция
$start = ( $page - 1 ) * ITEMS_PER_PAGE;

// По умолчанию сортировка по наименованию, по возрастанию
$orderby = 'title';
$sort = 'ASC';
if ( isset( $_GET['orderby'] ) and isset( $_GET['sort'] ) ) {
  if ( in_array( $_GET['orderby'], array( 'code', 'title', 'price' ) ) ) $orderby = $_GET['orderby'];
  if ( in_array( $_GET['sort'], array( 'ASC', 'DESC' ) ) ) $sort = $_GET['sort'];
}

$query = 'SELECT code, title, description, price
          FROM products
          ORDER BY '
.$orderby.' '.$sort.'
          LIMIT '
.$start.', '.ITEMS_PER_PAGE;
$res = mysql_query( $query );

echo '<h1>Каталог продукции</h1>'."\n";
// Выводим "шапку" таблицы
echo '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse; empty-cells: show;">'."\n";
echo '<tr>';
if ( $sort == 'ASC' ) {
  $tmp = 'DESC';
  $image = 'down.gif';
} else {
  $tmp = 'ASC';
  $image = 'up.gif';
}
if ( $orderby == 'code' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=code&sort='.$tmp.'&page='.$page.'">Код</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=code&sort=ASC&page='.$page.'">Код</a></th>';
if ( $orderby == 'title' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort='.$tmp.'&page='.$page.'">Наименование</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort=ASC&page='.$page.'">Наименование</a></th>';
echo '<th>Описание</th>';
if ( $orderby == 'price' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=price&sort='.$tmp.'&page='.$page.'">Цена</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=price&sort=ASC&page='.$page.'">Цена</a></th>';
echo '</tr>'."\n";
while( $prd = mysql_fetch_array($res) ) {
  echo '<tr>';
  echo '<td>'.$prd['code'].'</td>';
  echo '<td>'.$prd['title'].'</td>';
  echo '<td>'.$prd['description'].'</td>';
  echo '<td>'.$prd['price'].'</td>';   
  echo '</tr>'."\n";
}
echo '</table>'."\n";

// Строим постраничную навигацию
if ( $cnt_pages > 1 )
{
    echo '<div style="margin:1em 0">&nbsp;Страницы: ';
    // Проверяем нужна ли стрелка "В начало"
    if ( $page > 3 )
        $startpage = '<a href="'.$uri.'page=1"><<</a> ... ';
    else
        $startpage = '';
    // Проверяем нужна ли стрелка "В конец"
    if ( $page < ($cnt_pages - 2) )
        $endpage = ' ... <a href="'.$uri.'page='.$cnt_pages.'">>></a>';
    else
        $endpage = '';

    // Находим две ближайшие станицы с обоих краев, если они есть
    if ( $page - 2 > 0 )
        $page2left = ' <a href="'.$uri.'page='.($page - 2).'">'.($page - 2).'</a> | ';
    else
        $page2left = '';
    if ( $page - 1 > 0 )
        $page1left = ' <a href="'.$uri.'page='.($page - 1).'">'.($page - 1).'</a> | ';
    else
        $page1left = '';
    if ( $page + 2 <= $cnt_pages )
        $page2right = ' | <a href="'.$uri.'page='.($page + 2).'">'.($page + 2).'</a>';
    else
        $page2right = '';
    if ( $page + 1 <= $cnt_pages )
        $page1right = ' | <a href="'.$uri.'page='.($page + 1).'">'.($page + 1).'</a>';
    else
        $page1right = '';

    // Выводим меню
    echo $startpage.$page2left.$page1left.'<strong>'.$page.'</strong>'.$page1right.$page2right.$endpage."\n";

    echo '</div>'."\n";
}
?>

Рабочий пример можно посмотреть здесь.

Создание SQL-дампа

SQL-дамп — это текстовой файл с SQL-запросами, выполнение которых воссоздает базу данных. Основным инструментом для создания SQL-дампов в MySQL является утилита mysqldump. Для того, чтобы создать резервную копию базы данных base надо выполнить команду

C:\mysql\bin> mysqldump -u root base > base.sql

Как видите, утилита mysqldump принимает имя пользователя при помощи параметра -u. Если учетная запись защищена паролем, следует добавить параметр -p. После всех параметров указывается имя базы данных, для которой производится создание дампа. Так как вывод данных осуществляется в стандартный поток (за которым по умолчанию закреплен монитор), его следует перенаправить в файл (в нашем случае это base.sql). Перенаправление данных осуществляется при помощи оператора >. Если вместо оператора > использовать >>, то данные не будут перезаписывать уже существующий файл, а будут добавлены в конец файла.

При помощи параметра –databases (в сокращенной форме -B) можно создать дамп сразу нескольких баз данных, которые перечисляются через пробел:

C:\mysql\bin> mysqldump -u root -B base mysql > base_mysql.sql

Так мы сохраняем дампы баз данных base и mysql в файл base_mysql.sql.

Если необходимо сохранить дамп всех баз данных MySQL-сервера, следует воспользоваться параметром –all-databases или в сокращенной форме -A:

C:\mysql\bin> mysqldump -u root --all-databases > all_databases.sql

Развернуть SQL-дамп на другом сервере можно при помощи утилиты mysql в пакетном режиме.

mysql -u root test < base.sql

Здесь данные из дампа base.sql перенаправляются на стандартный вход утилиты mysql, которая размещает таблицы базы данных base в базе данных test.

Ссылки по теме:

Долевое использование web-браузеров

По данным системы статистики liveinternet.ru по состоянию за сентябрь 2008 для России:

  • Explorer 6 — 32.5%
  • Explorer 7 — 26.0%
  • Opera 9 — 16.8%
  • Firefox 3 — 9.0%
  • Opera Mini — 6.6%
  • Firefox 2 — 4.6%
  • Opera 8 — 0.7%
  • Safari 2 — 0.7%
  • Chrome — 0.6%

По данным stat.yandex.ru:

  • Internet Explorer — 59.35
  • Opera — 22.07
  • Firefox — 14.99
  • Мобильники и КПК — 1.53
  • Safari — 0.69
  • Mozilla — 0.15
  • Netscape — 0.04
  • Прочие — 1.13