Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa do generowania meta tagów dla różnych podstron
Forum PHP.pl > Inne > Oceny
Zagiewa
Witam. Chcąc pobawić się z PHP a ciągle jestem w nim świeży postanowiłem stworzyć coś w rodzaju generatora trzech meta tagów, które na ogół powinny być inne dla każdej podstrony tj. tytuł, opis, słowa kluczowe. Cała reszta na ogół jest stała jak np. autor itp. Zależało mi aby kod był przejrzysty, szybki, bezpieczny no i aby można było go dołączyć do każdej strony. Całość składa się z kilku plików które zamieszczam poniżej z krótkimi opisami. Prosił bym was bardziej o ocenę jakości kodu niż samego pomysłu gdyż pomysł na ten "generator" wykluł się przypadkiem smile.gif

Plik .htcacces:
  1. Options FollowSymLinks
  2. RewriteEngine On
  3. RewriteBase /~katalog/ #bez tego nie działa mi mod_rewrite
  4.  
  5. ErrorDocument 404 /~katalog/404.php
  6.  
  7. # Disable all magic quoting
  8.  
  9. php_value magic_quotes_gpc off
  10. php_value magic_quotes_runtime off
  11.  
  12. # mod_rewrite dla pliku strona
  13.  
  14. RewriteRule ^artykuly$ strona.php?tytul=artykuly [L]
  15. RewriteRule ^download$ strona.php?tytul=download [L]
  16. RewriteRule ^kontakt$ strona.php?tytul=kontakt [L]


Plik strona.php
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  4.  
  5. <?php
  6.  
  7. try {
  8.  
  9. include_once('../info.php'); //plik zawierajacy takie dane jak localhost, user i haslo...
  10. $pdo = new PDO('mysql:host=' .SQL_HOST. ';dbname=' .SQL_DB, SQL_USER, SQL_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  11. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12.  
  13. include_once('include/model/load_meta_tags.php'); //plik z klasa generujaca meta tagi
  14. $tytul_in = $_GET['tytul']; //wartosc pobierana z linkow
  15. $load = new load_meta_tags($tytul_in, $pdo);
  16. }
  17.  
  18. catch(PDOException $e) {
  19.  
  20. include_once('include/model/errors.php'); //osobna klasa do zbierania errorow jesli wystapia, wiecej o niej nieco pozniej
  21. $error = new catch_errors($e);
  22. unset($error); //uznalem ze skoro zmienna zrobi swoje warto ja usunac - forma bezpieczenstwa choc nie wiem czy nie jest zbedna?
  23. }
  24.  
  25. ?>
  26.  
  27. <head>
  28. <title><?php echo $load->title; ?></title> //odwoluje sie do wlasciwosci nie do metody, dlaczego o tym pozniej
  29. <meta name="author" content="Zagiewa" />
  30. <meta name="description" content="<?php echo $load->description; ?>" /> //j.w
  31. <meta name="keywords" content="<?php echo $load->keywords; ?>" /> //j.w
  32. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  33. </head>
  34. <body>
  35.  
  36. <a href="artykuly">artykuly</a>
  37. <a href="download">download</a>
  38. <a href="kontakt">kontakt</a>
  39.  
  40. </body>
  41. </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.
  1. <?php
  2.  
  3. try {
  4.  
  5. class load_meta_tags {
  6.  
  7. public $title = NULL;
  8. public $description = NULL;
  9. public $keywords = NULL;
  10.  
  11. public function __construct($tytul_in, $pdo) {
  12.  
  13. $this->title = "nazwa strony - " .$tytul_in; // poczatkowa czesc tytulu jest stala
  14. $stmt = $pdo->prepare('SELECT description, keywords FROM sites WHERE title = :tytul_in LIMIT 1');
  15. $stmt->bindParam(':tytul_in', $tytul_in, PDO::PARAM_STR);
  16. $stmt->execute();
  17.  
  18. while($row = $stmt->fetch()) {
  19.  
  20. $description = $row['description'];
  21. $keywords = $row['keywords'];
  22. }
  23.  
  24. $stmt -> closeCursor();
  25. if(!empty($description) && !empty($keywords)) { //jesli te zmienne okaza sie puste tzn, ze w bazie nie bylo danych na temat strony o tytule podanym przez link a to znaczy ze pewnie ktos kombinowal z linkami - ogolnie chodzilo w tym warunku o bezpieczenstwo
  26.  
  27. $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
  28. $this->keywords = htmlspecialchars($keywords); // jak wyzej...
  29. }else {
  30.  
  31. echo '<meta http-equiv="refresh" content="0; url=index.php">';
  32. }
  33. }
  34. }
  35. }
  36.  
  37. 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
  38.  
  39. include_once('include/model/errors.php');
  40. $error = new catch_errors($e);
  41. unset($error);
  42. }
  43.  
  44. ?>


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 smile.gif
  1. <?php
  2.  
  3. class catch_errors {
  4.  
  5. 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
  6.  
  7. $error = "Day: " .date("d-m-Y"). " Hour: " .date("H:i:s"). " //zapisuje dzien i godzine w jakiej wystapil blad
  8. Error in file: " .$e->getFile(). " //zapisuje w jakim pliku wystapil blad
  9. Line: " .$e->getLine(). " Message: " .$e->getMessage(). " //zapisuje w ktorej linii i o jakiej tresci wystapil blad
  10. ###############################################################\r\n"; //to ma na celu tylko przejrzyscie odseparowac kolejne komunikaty o bledach
  11.  
  12. if(file_exists('error_log.txt')) { //tak w skrocie mowiac zapisuje wszystko do pliku tekstowego o nazwie error_log.txt
  13.  
  14. $stara_wartosc = file_get_contents('error_log.txt');
  15. $nowa_wartosc .= $stara_wartosc . $error;
  16. $fp = fopen('error_log.txt', 'w');
  17. flock($fp, LOCK_EX);
  18. fwrite($fp, $nowa_wartosc);
  19. fclose($fp);
  20. }else {
  21.  
  22. $fn = fopen('error_log.txt', 'x');
  23. fwrite($fn, $error);
  24. fclose($fn);
  25. }
  26. }
  27. }
  28.  
  29. ?>

Tabela do której się odwołujemy aby pobrać opis i słowa kluczowe odpowiednie dla konkretnej podstrony wygląda tak:
  1. id | title | description | keywords
  2. 1 | fgf | fdfdfds | gffdsfds
  3. 2 | fdsf | fddsa | fdfds
  4. 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.
amatorph
Nie działa.
otrzymałem takie oto komunikaty:

Warning: include_once(../info.php) [function.include-once]: failed to open stream: No such file or directory in /home/wwwmarek/domains/jakasstrona.info.pl/public_html/testphp/dobry/strona.php on line 9

Warning: include_once() [function.include]: Failed opening '../info.php' for inclusion (include_path='.:/usr/local/php5/lib/php') in /home/wwwmarek/domains/jakasstrona.info.pl/public_html/testphp/dobry/strona.php on line 9

Warning: include_once(include/model/errors.php) [function.include-once]: failed to open stream: No such file or directory in /home/wwwmarek/domains/jakasstrona.info.pl/public_html/testphp/dobry/strona.php on line 20

Warning: include_once() [function.include]: Failed opening 'include/model/errors.php' for inclusion (include_path='.:/usr/local/php5/lib/php') in /home/wwwmarek/domains/jakasstrona.info.pl/public_html/testphp/dobry/strona.php on line 20

Fatal error: Class 'catch_errors' not found in /home/wwwmarek/domains/jakasstrona.info.pl/public_html/testphp/dobry/strona.php on line 21
Rysh
Cytat(Zagiewa @ 14.03.2011, 02:27:15 ) *
  1. $tytul_in = $_GET['tytul']; //wartosc pobierana z linkow
  2. $load = new load_meta_tags($tytul_in, $pdo);

Jaki sens jest przypisywać kod do zmiennej, którą zaraz i tak przesyłasz ją do funkcji?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.