Prosty system newsów w PHP – to nie takie trudne 38

Logo PHPW dzisiejszym artykule przedstawię Wam, jak stworzyć bardzo prosty, lecz mocno konfigurowalny system newsów PHP. A dlaczego PHP? Właśnie dlatego, że łatwiej się modyfikuje wygląd i układ strony, a do tego nie trzeba ruszać się z przeglądarki, aby dodać nowy artykuł! Nie jest to trudna rzecz, zwłaszcza gdy mamy serwer PHP z MySQL i trochę wiedzy dotyczącej PHP, MySQL i trochę HTML-a  i CSS-a.

Teraz wytłumaczę działanie strony. Do tego stworzymy pliki:

  • news.php – tutaj zostanie wyświetlony cały artykuł;
  • nowe.php – lista kilku najnowszych newsów na stronie wraz z krótkim wstępem;
  • archiwum.php  – lista wszystkich artykułów na stronie;
  • dodaj.php – skrypt dodający artykuł do bazy danych;
  • polacz.php – łączymy się z bazą oddzielnie dla uniknięcia problemów (wszystko w jednym pliku).

Musimy zacząć od stworzenia bazy danych, czyli w tym wypadku wystarczy jedna tabelka. Otwieramy PhpMyAdmin i tworzymy nową bazę danych – newsy, artykuly, nazwij jak Ci się podoba. Moja nazwa to news. Pamiętaj o zmianie rozpoznawania znaków na utf-8 polish. Teraz robimy nową tabelę. Musimy się zastanowić, jakie pola będą w naszej bazie. Na sam początek oferuję:

  • id (obowiązkowo);
  • nazwa;
  • autor;
  • data;
  • treść.

Wiadomo, później w ramach modyfikacji możesz dodać inne przydatne, ale na razie się nie rozpisuję. Zaczynamy tworzyć tabelkę, abyś nie tracił czasu, możesz skopiować i wkleić  do zakładki SQL w bazie danych kod poniżej.

CREATE TABLE `news` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nazwa` VARCHAR( 30 ) NOT NULL ,
`data` DATETIME NOT NULL ,
`autor` VARCHAR( 15 ) NOT NULL ,
`tresc` LONGTEXT NOT NULL
) ENGINE = MYISAM ;

Masz już bazę danych, teraz musisz przystąpić do tworzenia (a raczej skopiowania). Zaczniemy od pliku polacz.php. Stwórz plik i otwórz go w jakimkolwiek programie. Na koniec zapisz to w nowym folderze (np. htdocs\newsy dla XAMPPa, czy nazwausera/public_html dla LAMPa w Linuksie).

<?php
mysql_connect('1', '2' , '3');
mysql_select_db("4");
mysql_query("SET NAMES 'utf8'");
?>

  1. Wpisujemy nazwę hosta bazy, w przypadku serwera lokalnego localhost;
  2. Użytkownik bazy danych, domyślnie root;
  3. Tutaj wpisz swoje hasełko do bazy;
  4. Wpisz nazwę bazy danych, u mnie news.

Mając już ten plik możemy od razu przejść do skryptów wyświetlania. Zanim to zrobisz, spróbuj stworzyć kilka przykładowych newsów (np. o nazwie „aaaaaaaaaa” i treści np. kilka akapitów Lorem Ipsum). Najpierw, po zrobieniu kilku (u mnie 13) artykułów, zrobimy listę pięciu najnowszych. Zapisz to jako nowe.php.

<?php
include("polacz.php"); // 1
$query = mysql_query("select * from news order by id desc limit 0,5"); // 2
while($rekord = mysql_fetch_array($query))
{
$naz .= '<li><a href="news.php?id='.$rekord[0].'">'.$rekord[1].'</a> Autor: '.$rekord[3].' - '.$rekord[2].'</li>'; // 3
}
echo '<ul>'.$naz.'</ul>'; // 4
?>

Teraz możesz zobaczyć efekt. Wejdź w localhost/newsy/nowe.php, a zobaczysz coś niesamowitego: Najnowsze pięć newsów! Wprawdzie linki jeszcze nie działają, ale o tym za chwilę. Teraz trochę nauki (jeśli nie chcesz tego czytać, to przewiń dalej):

  1. Łączymy się z bazą za pomocą polacz.php;
  2. Zapytanie do bazy (wybierz wszystkie pola z tabeli news sortując według id, biorąc tylko pierwsze 5 – proste, prawda?);
  3. Przetwarzamy i formatujemy każdy rekord z bazy;
  4. Wyświetlamy wszystkie wyniki.

Jeszcze zanim napiszę o wyświetlaniu newsa, opowiem o archiwum newsów. Wyświetla on wszystkie newsy ze wszystkich lat. Kod zapytania do bazy danych i wyświetlania jest praktycznie taki sam, tylko bez desc limit:

<?php
include("polacz.php");
$query = mysql_query("select * from news order by id");
while($rekord = mysql_fetch_array($query))
{
$naz .= '<li><a href="news.php?id='.$rekord[0].'">'.$rekord[1].'</a> Autor: '.$rekord[3].' - '.$rekord[2].'</li>';
}
echo '<ul>'.$naz.'</ul>';
?>

Zapisujemy jako archiwum.php, otwieramy w przeglądarce i mamy wszystkie artykuły. I wreszcie – najważniejsze, czyli skrypt wyświetlający newsa.

<?php
include("polacz.php");
$query = mysql_query("select * from news where id='".(int)$_GET['id']."'"); // 1
$rekord = mysql_fetch_array($query);
echo '<h1>'.$rekord[1].'</h1>Autor: '.$rekord[3].'<br/>Data: '.$rekord[2].'<p>'.$rekord[4].'</p>'; // 2
?>

I jak zwykle analiza.

  1. Znowu mamy styczność z zapytaniem do bazy danych. W tym przypadku: wybierz wszystko z tabeli news, gdzie id równa się zmiennej pobranej z linka strony (tutaj np. news.php?id=10).
  2. Do wyświetlenia jednego newsa nie potrzeba żadnej pętli, ponieważ jest pobierany z bazy tylko jeden rekord. Jak widać dołożyłem bardzo proste formatowanie (nagłówek).

Możesz zapisać plik jako news.php. Teraz otwórz w przeglądarce nowe.php i wejdź w jakiś link. Zobaczysz treść newsa (nieciekawą zapewne). Pod koniec przedstawię skrypt tworzenia newsów tak, byś nie musiał co chwilę wchodzić do PhpMyAdmin. Przed Tobą skrypt z formularzem dodaj.php:

<form action="" method="post">
tytuł: <input type="text" name="tytul">
<br/>autor <input type="text" name="autor">
<br/>treść <textarea name="tresc" rows="20" cols="50"></textarea>
<br/><input type="submit" value="Dodaj"></form>
<?php
include("polacz.php");
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$query = mysql_query("insert into news values('','".$_POST['tytul']."',now(),'".$_POST['autor']."','".$_POST['tresc']."')");
}
?>

Spróbuj stworzyć newsa dzięki temu skryptowi i sprawdź, czy na pewno wszystko jest dobrze zrobione! Nie robiłem tego dla zgodności z W3C, bo to sam musisz zadbać, ale dla pokazania, że nie jest to trudne, a wręcz przeciwnie – banalnie proste.

Na sam koniec, dodamy pierwszą modyfikację do pliku nowe.php, która wyświetla pierwsze 150 pierwszych znaków z pola tresc. Stwórz plik skrot.php i wklej poniższy kod:

<?php
if (substr($rekord[4], 0, 150)<$rekord[4]) // 1
{
$kr = '...'; //
}
else
{
$kr = '';
}
?>

Jeżeli pierwsze 150 znaków z pola treść jest mniejsze od całego pola treść to wyświetlony na końcu skrótu wielokropek. Zmodyfikuj jeszcze skrypt wyświetlania kawałka newsa w pliku nowe.php. Po prostu zamień zawartość starej pętli while na taką:

include("skrot.php");
$naz .= '<li><a href="news.php?id='.$rekord[0].'">'.$rekord[1].'</a>Autor: '.$rekord[3].' - '.$rekord[2].'<p>'.substr($rekord[4], 0, 150).''.$kr.'</p></li>';

Teraz, gdy masz już gotowy system newsów, spróbuj usprawnić działanie Twojej nowej strony, modyfikując ją:

  1. Stwórz szablon z użyciem poprawnego XHTML i CSS.
  2. Dodaj dodawanie newsów na login i hasło.
  3. Stwórz konta autorów, którzy sami będą mogli tworzyć artykuły bez konieczności wpisywania nazwy autora.
  4. Dodaj system oceniania w skali pięciostopniowej bazujący na sesjach.
  5. Utwórz system komentowania artykułów z kontrolą antyfloodową i antybotową (captcha?).
  6. Napisz własny panel administratora.
  7. Dołóż do tego kategorie wpisów.

I wtedy Twoja strona będzie piękna i funkcjonalna, prawie jak WordPress ;). Ale jeszcze musisz pamiętać o samej treści tych newsów, które tak naprawdę są najistotniejsze na stronach!