Pull to refresh

Пишем движок блога: часть первая

В данной статье я попытаюсь помочь начинающим программистам создать свой первый проект. Сегодня мы будем писать самый простой и быстрый движок блога.

Начнем с базы данных. Я считаю, что самым оптимальным вариантом будет mysql. Создадим через phpmyadmin новую таблицу со следующими полями: id (уникальный номер статьи), title (заголовок статьи), date (дата добавления статьи), content (текст статьи). Чтобы Вы не теряли время, я собрал sql запрос:
CREATE TABLE  `blog` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` CHAR( 200 ) NOT NULL ,
`date` DATE NOT NULL ,
`content` TEXT NOT NULL
) ENGINE = MYISAM ;

Давайте теперь добавим несколько записей для того, чтобы в дальнейшем мы смогли проверить работоспособность скрипта.
INSERT INTO `blog` (`id`, `title`, `date`, `content`) VALUES
(1, 'Моя первая статья', '2011-09-01', '<p>Первая статья.</p>'),
(2, 'Вторая статья', '2011-09-08', '<p>Вот и вторая статья</p>'),
(3, 'Третья статья', '2011-09-09', '<p>Третья статья.</p>'),
(4, 'Четвертая статья', '2011-09-20', '<p>Да, это четвертая статья.</p>');

В первой части мы напишем скрипт, который будет выводит главную страницу со свежими статьями и сделаем постраничную навигацию.
Создадим конфигурационный файл, чтобы в будущем Вы всегда смогли изменить настройки блога. Я буду использовать ini файл т.к. такой способ оказался быстрым и удобным. Подробнее о файлах настроек Вы можете прочитать в интересной статье «Самые быстрые настройки для PHP-скриптов». Наш файл будет содержать следующие строки:
#Настройки базы данных
mysql_host = localhost
mysql_user = root
mysql_password = 12345
mysql_database = blog
#Количество статей на страницу
pp = 5

Сохраняем файл и даем ему произвольное название, я назвал просто — config.ini.
Приступаем к написанию главной страницы блога. Сначала нам предстоит собрать html каркас. За одно создадим файл стилей.

index.php
<!DOCTYPE html>
<html lang="ru">
    <head>
        <meta charset="utf-8" />
        <title>Мой блог</title>
        <link rel="stylesheet" href="style.css" />
    </head>
    <body>
 	<header>
 		<!-- шапка блога -->
 	</header>
 	<article> 
 		<!-- content -->
 		
 	</article>
    <body>
</html>

style.css
* {
font-family: Arial, Helvetica, sans-serif;
}

/* Блоки */
header {
width:850px;
height:200px;
margin:5px auto;
border-radius:6px;
background:white url('i/bg.jpg') no-repeat top left; /* можете скачать картинку в интернете */
}

article {
width:850px;
height:auto;
margin:auto;
}

article section {
border-bottom:1px dashed #BDECFE;
}

article section h2 {
color:#41738A;
font-size:17pt;
}

article section p {
font-size:10pt;
}

article section p.date {
font-size:9pt;
color:#516168;
text-align:right;
margin-bottom:0px;
padding-bottom:0px;
}


Создадим еще один файл, в котором будет прописано подключение к базе данных, дадим ему имя con.php.
<?php
$conf = parse_ini_file('config.ini');

mysql_connect($conf['mysql_host'],$conf['mysql_user'],$conf['mysql_password']) or die('Ошибка подключения к базе данных');
mysql_select_db($conf['mysql_database']) or die('Ошибка подключения к базе данных');

?>

Теперь к индексному файлу подключим con.php и начнем писать запрос к базе данных для выборки свежих новостей.
$otvet = mysql_query('SELECT * FROM `blog` ORDER BY `date` DESC LIMIT '. $conf['pp']);

Как вы уже заметили, мы и тут использовали наш файл настроек.
Теперь займемся выводом полученной информации. В нужном месте шаблона прописываем цикл:
while($row = mysql_fetch_assoc($otvet)){
 			echo "<section>
 			<h2>{$row['title']}</h2>
 			{$row['content']}
 			<p class=\"date\">{$row['date']}</p>
 			</section>";
}


Настало время попробовать сделать постраничную навигацию.

Вверху index.php, после подключения con.php, следует вставить следующие строки для того, чтобы узнать количество статей на сайте и общее количество страниц:
$counter = mysql_query('SELECT COUNT(`id`) FROM `blog`');
$counter = mysql_fetch_array($counter);
//Теперь у нас в $counter[0] количество статей на сайте
$pages = (int) ($counter[0] - 1) / $conf['pp']) + 1; // количество страниц
 

Проверяем, не передавал ли пользователь номер страницы и переделываем наш запрос.
if( isset($_GET['page'])) {
// Да, пользователь что-то передал
$page = (int) $_GET['page'];
	if ( $page > 0 && $page <= $pages ) {
	// Если переданное значение больше нуля и не привышает общее количество страниц
		// Вычисляем с какого номера статьи надо начинать выводить
		$start = $page * $conf['pp'] - $conf['pp'];
		$sql = "SELECT * FROM `blog` ORDER BY `date` DESC LIMIT {$start}, {$conf['pp']}";
	}
	else { 
		$sql = 'SELECT * FROM `blog` ORDER BY `date` DESC LIMIT '. $conf['pp']; 
		$page = 1;
	}
}
else {
$sql = 'SELECT * FROM `blog` ORDER BY `date` DESC LIMIT '. $conf['pp'];
$page = 1;
}
$otvet = mysql_query($sql);

Для проверки данного скрипта, вы можете в файле настроек заменить pp = 5 на pp = 1, чтобы на страницу выводилась только одна статья.

Осталось добавить кнопки навигации. Сразу после тега article пропишем:
<nav>
<?php
if( $page > 1 ) echo '<a href="index.php?page='.($page-1).'">← туда</a>';
if( $page < $pages ) echo '<a href="index.php?page='.($page+1).'">туда →</a>';
?>
</nav>


И не забудьте добавить стиль для данных ссылок. Давайте сделаем их в виде кнопок:

nav {
width:850px;
height:auto;
margin:10px auto;
text-align:center;
}

nav a {
padding:2px;
background-color:#EFEFEF;
border:1px solid #D5C2C2;
text-decoration:none;
color:black;
font-size:10pt;
margin:2px;
border-radius:5px;
}


Для тех, кто не разобрался в коде главной страницы, выкладываю его сюда:
<?php
require_once dirname(__FILE__).'/con.php';

$counter = mysql_query('SELECT COUNT(`id`) FROM `blog`');
$counter = mysql_fetch_array($counter);
$pages = intval( ($counter[0] - 1) / $conf['pp']) + 1;


if( isset($_GET['page'])) {
// Да, пользователь что-то передал
$page = (int) $_GET['page'];
	if ( $page > 0 && $page <= $pages ) {
		// Вычисляем с какого номера статьи надо начинать выводить
		$start = $page * $conf['pp'] - $conf['pp'];
		$sql = "SELECT * FROM `blog` ORDER BY `date` DESC LIMIT {$start}, {$conf['pp']}";
	}
	else { 
		$sql = 'SELECT * FROM `blog` ORDER BY `date` DESC LIMIT '. $conf['pp']; 
		$page = 1;
	}
}
else {
$sql = 'SELECT * FROM `blog` ORDER BY `date` DESC LIMIT '. $conf['pp'];
$page = 1;
}
$otvet = mysql_query($sql);
?>
<!DOCTYPE html>
<html lang="ru">
    <head>
        <meta charset="utf-8" />
        <title>Мой блог</title>
        <link rel="stylesheet" href="style.css" />
    </head>
    <body>
 	<header>
 		<!-- шапка блога -->
 	</header>
 	<article> 
 		<!-- content -->
 		<?php
 		while($row = mysql_fetch_assoc($otvet)){
 			echo "<section>
 			<h2>{$row['title']}</h2>
 			{$row['content']}
 			<p class=\"date\">{$row['date']}</p>
 			</section>";
 		
 		}
 		?>
 	</article>
<nav>
<?php
if( $page > 1 ) echo '<a href="index.php?page='.($page-1).'">← туда</a>';
if( $page < $pages ) echo '<a href="index.php?page='.($page+1).'">туда →</a>';
?>
</nav>
    <body>
</html>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.