Версия для печати. Взято с сайта phpsql.ru

На главную   Назад   Вперед

Улучшаем сайт

В предыдущей статье мы сделали свой первый сайт.
Рассмотрим, как его можно улучшить.

1. Подставляем заголовок
Заголовок у нас на всех страницах одинаковый, что неправильно.
Слова, заключенные в теги title, выделяются поисковыми системами и активно участвуют в seo.
Потому название статьи должно попадать в заголовок.
Итак, изменения:

в исходном шаблоне
<title>заголовок</title>

заменяем на код
<?php title();?>

а в index.php добавляем функцию

function title(){
  if(isset($_GET["id"]){
    $query = "SELECT * FROM blog WHERE id=" . $_GET["id"];
    if(($row = mysql_fetch_array($result)){
      echo "<title>",$row["anno"],"</title>";
      return;
    }
  }
  echo "<title>Мой блог</title>"; // Заголовок по умолчанию
}

Что можно улучшить. Вместе с заголовком подставлять и различные метатеги и кейворды для разных страниц. На деле они меняются редко ввиду утомительности задания их для каждой страницы и игнорирования поисковиками.

2. Добавляем разбивку по страницам.
У нас может быть много записей, и все их отображать на одной странице нерационально.
Рассмотрим, как делается разбивка по страницам.
Пусть у нас задан код
$query="SELECT * FROM base";
для разбивки по страницам добавляем фразу LIMIT в конец запроса:
$query="SELECT * FROM base LIMIT 0,10";
выведет 10 записей начиная с нулевой.
Для вывода второй страницы получим LIMIT 10,10, для третьей LIMIT 20,10 и т.п.(если выводим по 10 записей)
Т.е. нужно задать переменную номер страницы
если задана страница через переменную ?page= то делаем так:

$cnt=$_GET["page"]*10;
$query="SELECT * FROM base LIMIT $cnt,10";

Нам нужно посчитать количество страниц всего, чтобы поставить циферки внизу Страница 1 2 3 и т.п.
Для этого сначала получаем общее количество записей в базе данных:

$query = "SELECT COUNT(*) FROM base";
$row = mysql_fetch_array(mysql_query($query));
$num = $row[0];

Число страниц считаем как количество записей, поделенное на число записей на страницу, округляя до большего целого. И выводим ссылки на страницы:

$pages=(int)(($num+9)/10);
echo "Страницы: ";
for($i=0;$i<$pages;$i++){
  echo " <a href=\"?page=$i\">",$i+1,"</a>";
}

Здесь формируются ссылки вида ?page=номер. Если же нам надо передать на страницу еще какие-то параметры, то указываем их в ссылке через &, например ?page=номер&cat=тото

Что можно улучшить. Если всего одна страница, то выводить страницы вообще не нужно.

3. Добавляем дату публикации в админку и на сайт
Яндекс любит регулярно обновляемые сайты.
Лучше ложить одну статью каждый день, чем 30 раз в месяц.
А это утомительно. Для упрощения используется дата публикации статьи.
Вы заносите сразу кучу статей и задаете для каждой когда она появится на сайте.
Создается видимость постепенной работы над сайтом, столь приятная яндексу и посетителям сайта (каждый день что-то новое).

а) Сначала нужно добавить поле datepub в базу
Т.к. база у нас тестовая и пустая, то можно удалить ее всю и завести заново.
Для этого где мы создавали базы в админке правим файл install.php
Раскомментируем строку //DROP и добавляем поле в структуру базы данных
datepub DATE,
ОСТОРОЖНО с удалением!
Запускаем install, у нас новая пустая база.
Для баз с данными удобнее всего добавить поле вручную через phpmyadmin.
На хостинге он есть, а где и как зайти - вопрос к техподдержке хоста.

б) В самой админке надо в форме добавить поле под datepub и добавить его во все действия над базой: редактирование, обновление. Для этого смотрим какое-либо другое поле базы данных, и для datepub пишем все по аналогии, везде где встречается то поле.

в) Заполняем несколько тестовых примеров в базу, используя админку.
Ставим в них дату публикации формата ГГГГ-ММ-ДД год месяц день

г) В коде сайта учитываем дату публикации, добавляя в запросы проверку
WHERE datepub<=CURDATE() или AND datepub<=CURDATE() если условие WHERE уже есть.
например
$query="SELECT * FROM base WHERE datepub<=CURDATE()";

4. Дата редактирования записи.
В mysql есть удобный тип поля TIMESTAMP, автоматически сохраняющий дату последнего изменения записи. Позволяет следить когда данная запись менялась/добавлялась. Удобно для учета обновлений.
Попробуем добавим поле в базу, как описано выше
times TIMESTAMP,

Что можно улучшить. Если задать второе поле TIMESTAMP, то при записи в него значения NULL оно будет сохранять текущее время, что очень удобно для учета различных событий. А первое поле TIMESTAMP обновляется само при редактировании записи.

5. Упорядовачиваем записи.
Раз мы добавили дату обновления статьи в поле типа TIMESTAMP, то попробуем более новые статьи выводить первыми, т.к. в блоге они будут больше интересовать пользователей.

Для этого добавляем в запрос слово ORDER BY times DESC
DESC здесь означает в порядке убывания, т.е. самое новое первое.

6. !empty() вместо isset()
Для проверки параметров мы использовали функцию isset вида
if(isset($_GET['id'])){
она верна для пустых параметров вида ?id=
или ?page=0
что часто неудобно, т.к. параметр хоть и есть, но не задан
Потому лучше использовать функцию !empty вида
if(!empty($_GET['id'])){
имеющую смысл "непустое" значение

7. Делаем поиск на сайте.
Что за сайт без поиска? А если нам нужно что-либо найти? Исправляем.

а) добавляем поисковую форму

<form action="" method="post">
<input name="find" size="20" type="text"> 
<input value="Поиск" type="submit">
</form>

б) обрабатываем поисковый запрос

if(isset($_POST("find"))){ // Если задан поиск
  $q = $_POST("find");
  $query = "SELECT * FROM blog WHERE text LIKE `%".$q."%`";
  //...
}

Можно использовать method="get", тогда значение будет сооветственно в $_GET("find") и будет отображаться в адресе страницы браузера.
Обращаем внимание, что используется оператор LIKE неполное соответствие. LIKE `%текст%` где % означает любые символы после текста и до. Одиночная кавычка обязательна!

Что можно улучшить.
Для поиска вхождений нескольких слов можно подправить
$q=implode(`%`,explode(` `,$_POST("find")));
Таким образом преобразовываем запрос в слово1%слово2%слово3

Наш поиск весьма коряв, не учитывает окончаний и далек от совершенства.
Используйте гугловский поиск по сайту.

8. Отключаем отображение ошибок
Хакеры используют сообщения об ошибках как обратную связь при взломе сайта.
Потому НИКАКИХ сообщений по завершению отладки проекта.
Лучше включайте только пока правите код и выключайте как только закончили.

Правим файл .htaccess лежащий в папке где наш код

Для отключения ошибок пишем
php_value display_errors 0
php_value error_reporting 1

Для вывода всех сообщений (при отладке кода) меняем на
php_value display_errors 1
php_value error_reporting -1

9. Добавляем разделы на сайт
Что за блог без разделов, где все свалено в одном месте?
Плохо, когда все данные выводятся в одном месте.
Блог может относиться к разным темам. Добавим их.

По идее под разделы мы должны сделать отдельную базу разделов, под нее админку, а в нашей админке при задании статьи выбирать раздел из списка. Но т.к. у нас свой тестовый блог, мы можем сделать проще и поместить разделы в уже имеющуюся базу и админку. Для этого давайте добавим в базу поле по аналогии как делали выше:
raz INT,

Первые 10 записей, отведем, например, под разделы, а остальные (статьи) будут содержать номер раздела.
При обработке записей мы проверяем следующие условия:
raz=0 значит список разделов
raz!=0 статьи
raz=раздел статьи из раздела

Отображаем список разделов
$query="SELECT * FROM blog WHERE raz=0";
Ищем статьи для раздела $n
$query="SELECT * FROM blog WHERE raz=$n";

Тут нам надо добавить на стр еще параметр номера раздела,
сделать ссылку вида ?raz=
Отобразить такие для каждого раздела
и обработать проверкой типа
if(isset($_GET["raz"])){
и тут найти все статьи для данного раздела и вывести их

Что можно улучшить.
В форму админки добавим список выбора раздела статьи.
Для этого используем конструкцию списка select name и option и перед выводом формы заполняем ее значениями из базы, теми, где раздел=0.

10. Избавляемся от ?id= в названии страниц
Некрасиво для каждой страницы читать ее адрес www.site.ru/index.php?id=123
куда приятнее www.site.ru/123.html

Как делаются такие адреса страниц?
С помощью магического mod_rewrite

Принцип: сервер апач заменяет страницы вида 123.html на ?id=123
анализируя правила, заданные в файле .htaccess
Добавляем в .htaccess следующие строки

RewriteEngine On
RewriteRule ^([0-9]+)\.html$ ?id=$1

Читаем про регулярные выражения. Разбираемся. Экспериментируем.
Они не так сложны, как кажутся.

Разумеется, мы должны поменять отображаемые ссылки на сайте с ?id=число
на число.html
Те, что мы выводили в echo.
Так мы маскируем динамические страницы в статические. :)

Что можно улучшить.
Задавать еще разделы и номера страниц, предусмотреть конструкции для них,
что-нибудь вида
RewriteRule ^([0-9]+)-([0-9]+)\.html$ ?raz=$1&page=$2

11. Удобочитаемые адреса страниц.
Избавляемся от циферек в адресах страницы.

Эти циферки очень не любит гугл. PR на таких страницах Вам не видать.
Кроме того, английские слова в адресах страниц имеют такой же вес в seo,
как и текст в title, что полезно для продвижения.
Потому вместо циферек у Вас везде должен быть англ. текст.

Называется ЧПУ - человекоподобные юрлы.

а) Что делаем? Конечно же, добавляем поле к базе данных.
url VARCHAR(32),
INDEX(url),
(ДОСТАЛО уже ее менять, потому желательно продумывать структуру базы заранее и делать резервные поля, чтобы не лезть с правкой каждый раз, когда чего-то не хватает!)

Вторая строка INDEX(url) означает, что создаем индекс для данного поля,
т.к. по нему часто будет проводиться поиск. Это необязательно.

б) Далее, после правки формы и кучи команд INSERT, UPDATE в админке,
получаем готовое поле, куда для каждой статьи заносим англ. текст любого вида,
желательно покороче, можно с разделителями _- например
about-blog
howto
Это будут адреса страниц вида www.site.ru/about-blog
Заполняем несколько тестовых записей.

в) Правим .htaccess
RewriteRule ^([0-9a-zA-Z_-]+)$ ?name=$1

г) Правим код сайта
везде где был поиск по id статьи меняем на поиск по строке name
$query = "SELECT * FROM blog WHERE name=" . $_GET["name"];

д) Соответственно меняем ссылки с id на name
было
"?id=",$row["id"]
стало
$row["name"];
ну и там a href= перед, кавычки и скобки угловые.

Что можно улучшить.
Одинаковые имена у нас не проверяются. Поле сделать как UNIQUE, но тогда для всех записей придется задавать эти имена.
Если имя может отсутствовать, то тогда перед выводом ссылки проверяем, пустое ли поле, и если да, то выводим ссылку по id по старому виду. Уникальность проверяем в админке.

12. А безопасен ли наш сайт от взлома? Нет, конечно же. Любой школьник взломает его и уничтожит Ваш долгий труд. Потому смотрим статью по безопасности (что нужно подправить в коде) ТУТ.

 
Предыдущая   На главную   Следующая