
Plik .htcacces:
Options FollowSymLinks RewriteEngine On RewriteBase /~katalog/ #bez tego nie działa mi mod_rewrite ErrorDocument 404 /~katalog/404.php # Disable all magic quoting php_value magic_quotes_gpc off php_value magic_quotes_runtime off # mod_rewrite dla pliku strona RewriteRule ^artykuly$ strona.php?tytul=artykuly [L] RewriteRule ^download$ strona.php?tytul=download [L] RewriteRule ^kontakt$ strona.php?tytul=kontakt [L]
Plik strona.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"> <?php try { include_once('../info.php'); //plik zawierajacy takie dane jak localhost, user i haslo... $pdo = new PDO('mysql:host=' .SQL_HOST. ';dbname=' .SQL_DB, SQL_USER, SQL_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); include_once('include/model/load_meta_tags.php'); //plik z klasa generujaca meta tagi $tytul_in = $_GET['tytul']; //wartosc pobierana z linkow $load = new load_meta_tags($tytul_in, $pdo); } catch(PDOException $e) { include_once('include/model/errors.php'); //osobna klasa do zbierania errorow jesli wystapia, wiecej o niej nieco pozniej $error = new catch_errors($e); unset($error); //uznalem ze skoro zmienna zrobi swoje warto ja usunac - forma bezpieczenstwa choc nie wiem czy nie jest zbedna? } ?> <head> <title><?php echo $load->title; ?></title> //odwoluje sie do wlasciwosci nie do metody, dlaczego o tym pozniej <meta name="author" content="Zagiewa" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> </head> <body> <a href="artykuly">artykuly</a> <a href="download">download</a> <a href="kontakt">kontakt</a> </body> </html>
Plik load_meta_tags. Od razu wspomnę, że meta tagi są potrzebne tak na prawdę tylko raz więc uznałem, że zamiast tworzyć metody które by wyświetlały konkretne meta tagi wstawiłem wszystko do konstruktora który od razu wykona robotę. Pobrane dane zapisywane są do zmiennych dlatego też w pliku strona.php odwołuje się do tych właśnie zmiennych zamiast do metod.
<?php try { class load_meta_tags { public $title = NULL; public $description = NULL; public $keywords = NULL; public function __construct($tytul_in, $pdo) { $this->title = "nazwa strony - " .$tytul_in; // poczatkowa czesc tytulu jest stala $stmt = $pdo->prepare('SELECT description, keywords FROM sites WHERE title = :tytul_in LIMIT 1'); $stmt->bindParam(':tytul_in', $tytul_in, PDO::PARAM_STR); $stmt->execute(); while($row = $stmt->fetch()) { $description = $row['description']; $keywords = $row['keywords']; } $stmt -> closeCursor(); $this->description = htmlspecialchars($description); //tutaj uzylem htmlspecialchars poniewaz gdy by w bazie pojawil sie taki rekord: "jakis ta'm sob" ie> opis" tylko ta funkcja sprawia ze wszystko dobrze sie wyswietla }else { } } } } catch(PDOException $e) { // jak wiadomo wszedziie moze pojawic sie blad dlatego tez nawet w klasie uznalem ze warto lapac wyjatki i podobnie jak w przypadku pliku strona.php jesli pojawi sie blad to zostanie przechwycony include_once('include/model/errors.php'); $error = new catch_errors($e); } ?>
Plik errors.php Uznałem, że warto utworzyć osobną klasę którą będzie można wykorzystać nie tylko do tego generatora ale całej strony. Muszą od razu wspomnieć, że aby plik ten działał poprawnie to te pierwszy 3 komentarze przy zmiennej $error muszą być usunięte bo chwilo są traktowane jak ciąg

<?php class catch_errors { function __construct($e) { //znow uznalem ze wsadzenie calosci w konstruktor bedzie najlepsze bo przeciez wszystkie komunikaty o bledach i tak zapisujemy do pliku wiec wyswietlanie czy inne czynnosci beda zbedne Error in file: " .$e->getFile(). " //zapisuje w jakim pliku wystapil blad Line: " .$e->getLine(). " Message: " .$e->getMessage(). " //zapisuje w ktorej linii i o jakiej tresci wystapil blad ###############################################################\r\n"; //to ma na celu tylko przejrzyscie odseparowac kolejne komunikaty o bledach if(file_exists('error_log.txt')) { //tak w skrocie mowiac zapisuje wszystko do pliku tekstowego o nazwie error_log.txt $nowa_wartosc .= $stara_wartosc . $error; }else { } } } ?>
Tabela do której się odwołujemy aby pobrać opis i słowa kluczowe odpowiednie dla konkretnej podstrony wygląda tak:
id | title | description | keywords 1 | fgf | fdfdfds | gffdsfds 2 | fdsf | fddsa | fdfds 3 | fds | fdfds | fdsfdsfds
Ciekaw jestem na ile mój kod jest dobry według tych kryteriów, które sobie postawiłem tworząc go. Całość działa bez problemów i testowałem to na wszelkie znane mi sposoby jednak jeśli doszukacie się jakiś błędów albo uznacie, że coś można było zrobić lepiej piszcie.