Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO prosty czat - proszę o ocenę
Forum PHP.pl > Inne > Oceny
sajegib
Witam!

Proszę szanowne grono o ocenę mojego czatu napisanego w OOP, dopiero się uczę, z chęcią przyjmę wszystkie uwagi (szczególnie krytyczne) dot. kodu a także co mogłoby być lepiej


config.php

  1.  
  2. <?php
  3.  
  4. //DANE DO POŁĄCZENIA Z BAZĄ
  5.  
  6. class Config{
  7.  
  8. public static $db_host = 'localhost';
  9. public static $db_name = 'Czat';
  10. public static $db_user = 'root';
  11. public static $db_pass = 'root';
  12.  
  13. }
  14.  
  15. ?>
  16.  
  17.  
  18.  



database.php



  1.  
  2. <?php
  3.  
  4. require_once 'config.php';
  5.  
  6. abstract class database
  7. {
  8.  
  9. protected $pdo;
  10. public $error;
  11.  
  12. public function __construct()
  13. {
  14. // POLACZENIE Z BAZA
  15. try
  16. {
  17. $this->pdo = new PDO('mysql:host='.Config::$db_host.';dbname='.Config::$db_name, Config::$db_user, Config::$db_pass);
  18. $this->pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  19. }
  20. catch (PDOException $e)
  21. {
  22. print "Error!: " . $e->getMessage() . "<br/>";
  23. die();
  24. }
  25.  
  26. }
  27.  
  28.  
  29.  
  30.  
  31. protected function insert($author, $msg)
  32. {
  33.  
  34. $stmt = $this->pdo->prepare('INSERT INTO Czat (Author, Msg) VALUES (:auth, :msg)');
  35. $stmt->bindParam(':auth', $author);
  36. $stmt->bindParam(':msg', $msg);
  37.  
  38. if($stmt->execute())
  39. {
  40. return TRUE;
  41. }
  42. else
  43. {
  44. return FALSE;
  45. }
  46. }
  47.  
  48.  
  49.  
  50.  
  51. protected function select()
  52. {
  53. $messages = $this->pdo->query('SELECT * FROM Czat');
  54. return $messages;
  55. }
  56.  
  57.  
  58.  
  59. public function __destruct()
  60. {
  61. $this->pdo = NULL;
  62. }
  63.  
  64.  
  65. }
  66.  
  67.  
  68. ?>
  69.  
  70.  




czat.php
  1.  
  2. <?php
  3.  
  4. require_once 'database.php';
  5.  
  6. class czat extends database
  7. {
  8.  
  9. public $error ='';
  10.  
  11. public function __construct() {
  12. parent::__construct();
  13. }
  14.  
  15.  
  16. public function add_message($author, $msg)
  17. {
  18.  
  19. if(!empty($author) && !empty($msg))
  20. {
  21. $escaped = $this->escape($author, $msg); // escapujemy
  22.  
  23.  
  24. if($this->insert($escaped[0], $escaped[1])){
  25. $this->error = "DODANO";
  26. }
  27. else{
  28. $this->error = "NIE DODANO";
  29. }
  30.  
  31. }
  32.  
  33.  
  34. }
  35.  
  36.  
  37. public function get_messages()
  38. {
  39. return $this->select();
  40. }
  41.  
  42.  
  43. public function escape($val1, $val2)
  44. {
  45. $auth = addslashes($val1);
  46. $msg = addslashes($val2);
  47.  
  48. return array($auth, $msg); // ZWRACAMY WYESCAPOWANA TABLICE
  49. }
  50.  
  51.  
  52. }
  53.  
  54.  
  55. ?>
  56.  
  57.  
  58.  




pozdrawiam!
ssstrz
jak ma być oop to rozdziel walidacje, na osobną klasę
ShadowD
Chat moim zdaniem nie powinien dziedziczyć z bazy a być oddzielną częścią i posiadać obiekt klasy jako zmienną.
sajegib
w ktore miejsce najlepiej wrzucic obiekt bazy? jak sie wtedy odwolac do jego metod?
hind
Bazę (PDO) przekazać jako parametr do konstruktora, a to co masz w klasie database przekopiuj do klasy chat
i w tedy
  1. class chat {
  2. protected $pdo;
  3.  
  4. public function __construct($pdo)
  5. {
  6. if ($pdo) {
  7. throw new exception('nie pdo');
  8. }
  9. $this->pdo = $pdo;
  10. }
  11. [...]
  12. }
ShadowD
@hind dobrze mówi, ale by jeszcze pójść o krok dalej powiem Ci jak działją fw.

W fw masz coś takiego jak klasa DI to taki rejestr wszystkich elementów składowych systemu, najłatwiejsza jego odmiana ma aż 2 metody set($name, $obiect) i get($name) i służy do przechowywania w sobie wszystkich obiektów typu baza danych, instancaj widoku, routingu, requestu, configu itd. i to ona jest przekazywana do kontrolerów (dla uproszczenia można uznać że u Ciebei to klasa chat) podczas konstrukcji klasy, a sama klasa chat ma zmienną $di i metody setDi() i getDi() dzięki który możesz odwołać się do obiektów zapisanych w niej.

Taki zabieg w przyszłośic ułatwi Ci kod, bo obiektów typu chat, form, controller jest wiele sposobem @hind musiał byś za każdym razem do nich wprowadzać wszystkie serwisty (db, request, routing itd), a tutaj wszystko wprowadzasz do Di, a samo Di przekazujesz zawsze dalej i ew w przyszłości dodajesz tylko do niego kolejne serwisy. ;-)
sajegib
Coś tam działam sobie w wolnych chwilach w codeigniterze i przyznam, że sporo załapałem z obiektówki dzięki temu, ale nie bardzo doszukałem się informacji odnośnie architektury całego przedsięwzięcia.
Dzięki wielkie szanownym Panom za informację, będę walczył dalej.

A jako, ze już przeszliśmy na FW, to mam jeszcze małe pytanko, mam kilka podstron, których treść trzymam w bazie (strona oparta o codeigniter).

Stworzyłem sobie kontroler, który zajmuje się wyświetlaniem kolejnych podstron, przyjmuje 1 parametr z ID podstrony - wtedy url wyglada tak: xxx.pl/home/page/1 (2,3, itd)
Co myślicie o takim rozwiązaniu? Może jest jakieś lepsze?
nospor
Używasz PDO, używasz bindowania, a mimo to escapujesz dane i to na dodatek przy pomocy addslashes.... przecież to nie ma żadnego sensu...
sajegib
Doczytałem trochę, faktycznie, wstyd sciana.gif

Ale chyba trzeba się troche powstydzić za swoje dokonania, żeby się nauczyć biggrin.gif
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.