Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HOT] Potrzebne
Forum PHP.pl > Forum > Przedszkole
Ether
Witam,
Potrzebuję napisać klasę która zarządza newsami w bazie danych. Chcę zmienną private $conn do połączenia z bazą i z 3 metody insert update delete.
Tabela newsy = id, temat, news, created_at jako timestamp + wyjątki rzucane w przypadku niepowodzenia i łapanie w try catch.

Byłbym super wdzięczny gdyby ktoś poświęcił chwilkę na napisanie tego kodu.
Pozdrawiam
Pyton_000
Dział Giełda
Kshyhoo
Witamy na Forum. Zapoznaj się z pierwszą linijką mojej sygnatury, a potem dostosuj swój wątek.

PS. Na gotowca nie masz co liczyć, musisz pokazać to, co już sam zrobiłeś...
ohm
Jesteś w trakcie zaliczenia? smile.gif
Ether
Tak :/
Kshyhoo
No to albo wykażesz chęci, albo zamykam wątek smile.gif Ew. dział giełda...
Ether
  1. <?php
  2.  
  3. class EditNews {
  4. private $conn = @PDO('mysql:host=localhost;dbname=test', root, test);
  5. private static $insert = @PDO->INSERT;
  6. private static $update = @PDO->UPDATE;
  7. private static $delete = @PDO->DELETE;
  8. }


nie wiem czy to jest źle czy dobrze nie znam php :/ Jakieś dalsze wskazówki?
Pyton_000
A co robiłeś przez cały semestr?
Ether
Byłem uczestnikiem w testowaniu hardware..
b4rt3kk
Cytat(Ether @ 23.03.2015, 14:52:59 ) *
  1. <?php
  2.  
  3. class EditNews {
  4. private $conn = @PDO('mysql:host=localhost;dbname=test', root, test);
  5. private static $insert = @PDO->INSERT;
  6. private static $update = @PDO->UPDATE;
  7. private static $delete = @PDO->DELETE;
  8. }


nie wiem czy to jest źle czy dobrze nie znam php :/ Jakieś dalsze wskazówki?


Źle, bardzo źle.
Ether
No dużo nie wniosłeś, Bartek. Może jakiś link do dokumentacji albo wskazówka cokolwiek? Dopiero zaczynam z PHP i się nie poddam tym razem tongue.gif
Forti
Za 300zł Ci to napisze tongue.gif
Kshyhoo
Cytat(Forti @ 23.03.2015, 15:08:18 ) *
Za 300zł Ci to napisze tongue.gif

Tu nie dział giełda...
Ether
Wolę dostać cenne wskazówki, niż liczyć na gotowca, może w końcu się nauczę..
Forti
Cytat(Kshyhoo @ 23.03.2015, 15:10:50 ) *
Tu nie dział giełda...


Nie załapałeś jołka tongue.gif


@Ether, poczytaj o PDO i baw się lokalnie kodem.. to jest coś co można się bardzo łatwo nauczyć samemu.
Ether
  1. <?php
  2.  
  3. class NewsManager {
  4. private $pdo;
  5.  
  6. function __construct($conn) {
  7. $this->pdo = new PDO('mysql:host=localhost;dbname=news;port=3305', 'root', 'test');
  8. }
  9.  
  10. $insert = $this->pdo->exec('INSERT INTO `news` (`id`, `temat`, `news`) VALUES(NULL,\''.$_POST['temat'].',\''.$_POST['news'].'\')');
  11. $update = $this->pdo->exec('UPDATE `costam` FROM `news` WHERE `id` = \''.$_POST['id'].'');
  12. $delete = $this->pdo->exec('DELETE * FROM `news` WHERE `id` = \''.$_POST['id'].'');
  13.  
  14. if($insert > 0)
  15. {
  16. echo 'Pomyślnie dodano: '.$ilosc.' rekordów';
  17. }
  18. else
  19. {
  20. echo 'Wystąpił błąd podczas dodawania rekordów!';
  21. }
  22. }
  23. else
  24. {
  25. echo '
  26. <form method="post" action="x.php">
  27. <p>Temat: <input type="text" name="topic"/></p>
  28. <p>News: <input type="text" name="news"/></p>
  29. <p><input type="submit" value="Dodaj"/></p>
  30. </form>
  31. ';
  32. }
  33. }
  34. catch(PDOException $e)
  35. {
  36. echo 'Wystapił blad biblioteki PDO: ' . $e->getMessage();
  37. }
  38. }
  39. ?>


Na razie tyle wykombinowałem i nie wiem co dalej poprawić, zrobić, itp..

  1. $newsManager = newsManager(); $newsManager->add('test', 'content'); $newsManager->updateById(4, 'test2', 'content2'); $newsManager->deleteById(4);
b4rt3kk
Zacznij od wywalenia PDO, bo nie korzystasz z niego właściwie. Do takich zapytań zwykłe mysql_query będzie jak znalazł. Lub druga opcja, pisz poprawnie zapytania i poprawnie korzystaj z PDO:

  1. $q = "INSERT INTO table (a1,a2,a3) VALUES (?,?,?);
  2. $h = $pdo->prepare($q);
  3. $h->bindParam(...);
  4. ...
  5. $h->execute();
com
@up to jak już mysqli_query tongue.gif 7 za pasem i mysql_* idzie out wink.gif
b4rt3kk
Cytat(com @ 24.03.2015, 13:17:18 ) *
@up to jak już mysqli_query tongue.gif 7 za pasem i mysql_* idzie out wink.gif


Nie wiem, od kilku lat nie korzystam z mysql_*, między innymi dlatego, że wolę bazy postgresowe, ale pamiętam, że takowe coś istniało.
com
tak ale od kilku lat też oznaczone jako deprecated, a w php ng będzie całkowicie usunięte, dlatego nie ma sensu już czegoś pisać w tym bo za pare miesiecy przestanie działac i temat wypłynie na nowo.
johny_s
Tyle że na hostingach pojawi się dopiero za parę lat...
com
owszem ale nauka tego w 2015 mija sie z celem, to tak jakby stosować np eregi bo na hostingu mam php z przed 5 lat wink.gif oni nie bez powodu wycofali mysql... jest to zestaw funkcji przestarzałych podatnych na xss i nie rozwijanych, wiec nauka tego jest bez sensu. A podstawowe metody z mysqli w stylu proceduralnym to w większości dopisanie 1 literki. A przy okazji jest masa innych przydatnych funkcji które warto znać, których w mysql nie znajdziesz. Poza tym jak ktoś bd czuł potrzebę a na pewno bd, bo na razie 7 wpada lepiej od hacka to postawi sobie ja na jakimś vps smile.gif
Forti
Chcesz programować to nie używasz hostingu za 10zl tylko vps za 7zl... I polecanie mysql_ to jak polecanie html4...
com
forti gdzie masz vps za 7 biggrin.gif
Pyton_000
np tu: http://panel.dedyki.net/client/openvz/order.php
!*!
Cytat(Pyton_000 @ 24.03.2015, 18:18:28 ) *

Korzystasz z tego? Strona wygląda jak firma noname... a przydał by się vps za ~20 wink.gif i ciekaw jestem czy to nie zniknie po kilku miesiącach w magiczny sposób.
Forti
Cytat(com @ 24.03.2015, 18:14:49 ) *
forti gdzie masz vps za 7 biggrin.gif



Ovh.pl
johny_s
A czy ja gdziekolwiek polecam używanie mysql_* ?
com
to za 8 tongue.gif Python, Forti dzięki
!*! nwm gdzie to Python znałazł, ich strona wygląda teraz tak
http://dedyki.net/serwery-vps/

No nie mówię ze powiedziałeś, ale widziałem ze nie wszyscy byli przekonani to rozwinąłem przy okazji swoja wypowiedź smile.gif
!*!
Cytat(com @ 24.03.2015, 18:48:56 ) *
to za 8 tongue.gif Python, Forti dzięki
!*! nwm gdzie to Python znałazł, ich strona wygląda teraz tak
http://dedyki.net/serwery-vps/


si, później jest przekierowanie "Procesor Do 20% rdzenia" biggrin.gif hmm nooo jakieś pierdoły w PHP server ws,flash... może pociągnie biggrin.gif
Forti
Cytat(johny_s @ 24.03.2015, 18:30:50 ) *
A czy ja gdziekolwiek polecam używanie mysql_* ?



Nie ty, tylko b4art3k (swoją droga nick jak w latach 90).


Co do vps, to:
http://www.ovh.pl/vps/vps-classic.xml

za tą cene dla tych ludzi jak znalazł. Sam używam ;]
Mastersieciweb
na szybko, amatorsko
  1. class news
  2. {
  3. private $table_name = 'table_news';
  4. private $db;
  5. private static $dbHost = 'localhost';
  6. private static $dbDataBase = 'nazwa_bazy';
  7. private static $dbUser = 'login';
  8. private static $dbPassword = 'haslo';
  9.  
  10.  
  11. public function __construct()
  12. {
  13. try
  14. {
  15. echo '<h1>Dodaj swoje newsy</h1>';
  16. $this->view();
  17. }
  18. catch (Exception $e)
  19. {
  20. throw new Exception($e->getMessage(), $e->getCode());
  21. }
  22.  
  23. }
  24.  
  25. public function view()
  26. {
  27. echo '<div><form method="post" action="nazwa_tego_pliku.php">
  28. <p>Temat: <input type="text" name="topic"/></p>
  29. <p>News: <input type="text" name="news"/></p>
  30. <p><input type="submit" value="Dodaj"/></p>
  31. </form>
  32. </div><br />';
  33.  
  34. $sql = $this->connect_db();
  35. if(!$result = $sql->query("SELECT * FROM ".$this->table_name.""))
  36. {
  37. throw new exception ('Blad zapytania select do bazy');
  38. }
  39. else
  40. {
  41. echo '<table>';
  42. echo '<tr bgcolor=\"#CCCCFF\"><td>id</td><td>temat</td><td>nowosc</td><td>data</td></tr>';
  43. while ($row = $result->fetch_array())
  44. {
  45. echo '<tr>';
  46. echo '<td>'.$row['id'].'</td><td>'.$row['temat'].'</td><td>'.$row['news'].'</td><td>'.$row['data_dodania'].'</td>';
  47. echo '</tr>';
  48. }
  49. echo '</table>';
  50. }
  51. }
  52.  
  53.  
  54. public function connect_db()
  55. {
  56. try
  57. {
  58. $this->db = new mysqli($this->dbHost, $this->dbUser, $this->dbPassword, $this->dbDataBase);
  59. if(!$db)
  60. {
  61. throw new exception ('Blad laczenia z baza danych');
  62. }
  63. else
  64. {
  65. return $db;
  66. }
  67.  
  68. }
  69. catch (Exception $e)
  70. {
  71. throw new Exception($e->getMessage(), $e->getCode());
  72. }
  73.  
  74. }
  75. public function add_news()
  76. {
  77. try
  78. {
  79. $temat = $_POST['topic'];
  80. $news = $_POST['news'];
  81. $sql = $this->connect_db();
  82. if(!$result = $sql->query("INSERT INTO ".$this->table_name." ('id','temat','news','data_dodania') VALUES (null,'".$temat."','".$news."','".date('y-m-d h:m:i')."')"))
  83. {
  84. throw new exception ('Blad zapytania insert do bazy');
  85. }
  86.  
  87. }
  88. catch (Exception $e)
  89. {
  90. throw new Exception($e->getMessage(), $e->getCode());
  91. }
  92.  
  93. }
  94. public function update_news($new_temat, $new_news, $id)
  95. {
  96. try
  97. {
  98. $sql = $this->connect_db();
  99. if(!$result = $sql->query("UPDATE ".$this->table_name." SET ('temat' = '".$new_temat."', 'news' = '".$new_news."') WHERE id = '".$id."' "))
  100. {
  101. throw new exception ('Blad zapytania update do bazy');
  102. }
  103. }
  104. catch (Exception $e)
  105. {
  106. throw new Exception($e->getMessage(), $e->getCode());
  107. }
  108.  
  109. }
  110. public function delete_news($id)
  111. {
  112. try
  113. {
  114. $sql = $this->connect_db();
  115. if(!$result = $sql->query("DELETE FROM ".$this->table_name." WHERE id = '".$id."' "))
  116. {
  117. throw new exception ('Blad usuwania newsow');
  118. }
  119. }
  120. catch (Exception $e)
  121. {
  122. throw new Exception($e->getMessage(), $e->getCode());
  123. }
  124.  
  125. }
  126. }
  127.  
b4rt3kk
Cytat(Forti @ 24.03.2015, 19:08:35 ) *
Nie ty, tylko b4art3k (swoją droga nick jak w latach 90).


Co do vps, to:
http://www.ovh.pl/vps/vps-classic.xml

za tą cene dla tych ludzi jak znalazł. Sam używam ;]


Nie polecam używania mysql, tylko nie zalecam używania PDO, skoro robi się to bezsensownie, czyli nie korzystając z podstawowych funkcji tej biblioteki i z rzeczy, do których jest przeznaczona. To było coś na kształt ironii, czy sarkazmu, być może obcego niektórym osobom.

Tak, lata 90, to lata mojej młodości, coś w tym złego? Za to Ty masz nick jak, za przeproszeniem gimnazjalista. Tfu!
com
dobrze, owszem jest to bez sensu ale tak jak wspomniałem wtedy mysqli po prostu smile.gif
Forti poco? nikt się Ciebie o nicka nie czepiał to Ty też tego nie rób. Czasem lepiej sobie podarować takie komentarze tongue.gif
Mastersieciweb, z przykrością trzeba powiedzieć że ten kod to anty przykład jak tego właśnie nie robić, ale może to działa tak jak ma biggrin.gif
Forti
Cytat(b4rt3kk @ 25.03.2015, 00:04:15 ) *
Nie polecam używania mysql, tylko nie zalecam używania PDO, skoro robi się to bezsensownie, czyli nie korzystając z podstawowych funkcji tej biblioteki i z rzeczy, do których jest przeznaczona. To było coś na kształt ironii, czy sarkazmu, być może obcego niektórym osobom.

Tak, lata 90, to lata mojej młodości, coś w tym złego? Za to Ty masz nick jak, za przeproszeniem gimnazjalista. Tfu!



Dlaczego korzystanie z PDO do zwykłego selecta jest bezsensu? Jakieś wyjaśnienie poproszę wink.gif Tylko nie mów, że jest wolniejsze.
b4rt3kk
Że też najprostsze rzeczy trzeba tłumaczyć... Od początku, powoli - napisałem ironicznie, że takie używanie PDO jest bez sensu ze względu na fakt, że takie wykonanie zapytania (uwaga, w przykładzie jest akurat insert, ale równie dobrze może być to select z parametrami!):

  1. $insert = $this->pdo->exec('INSERT INTO `news` (`id`, `temat`, `news`) VALUES(NULL,\''.$_POST['temat'].',\''.$_POST['news'].'\')');


Nie różni się się absolutnie niczym od :

  1. $insert = mysql_query('INSERT INTO `news` (`id`, `temat`, `news`) VALUES(NULL,\''.$_POST['temat'].',\''.$_POST['news'].'\')');


Teraz sendo sprawy, otóż dlaczego? Bo jedno i drugie zapytanie jest tak samo nieporęczne i tak samo podatne na wszelkiego rodzaju ataki lub nawet błędy programisty. Specjalnie kazałem użyć autorowi mysql_* by zwrócić jego uwagę na ten aspekt (czyli różnice pomiędzy jednym a drugim sposobem).

Biblioteka PDO ma kilka ciekawych i poręcznych narzędzi, które warto używać, przede wszystkim można stosować placeholdery w zapytaniach, np.:

  1. INSERT INTO NEWS (id, temat, news) VALUES (?, ?, ?);


By podstawiane wartości zostały automatycznie dopasowane do kolumny, poprzez odpowiednie opakowanie w cudzysłowy, dodanie znaków ucieczki, itd. Czy to takie trudne do pojęcia?

Oczywiście, jeśli ktoś lubi, to może i tak jak poniżej, w końcu mamy demokrację. Tylko niech nie mówi, że jest to optymalne, a przede wszystkim poprawne zastosowanie.

  1. $insert = $this->pdo->exec('INSERT INTO `news` (`id`, `temat`, `news`) VALUES(NULL,\''.$_POST['temat'].',\''.$_POST['news'].'\')');


To tak jak wbijanie gwoździ Samsungiem Galaxy, kiedy można to zrobić Nokią 3210.
Ether
Dzięki za konkretny przykład.
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.