Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] OOP PDO dodawanie rekordów do bazy
Forum PHP.pl > Forum > Przedszkole
miras
Witam, mam funkcję dodającą wcześniej pobrane dane do bazy danych (tzn. chcę aby ta funkcja to robiła) jednak mam problem z zapytaniem pdo..

wywala błąd:
  1. Fatal error: Call to a member function exec() on a non-object in rb.class.php on line 40


i kod funkcji:

  1. public function check() {
  2. include("language/pl.php");
  3. if (!empty($_POST['spr'])) {
  4. if ((!empty($_POST['imie'])) && (!empty($_POST['nazwisko'])) && (!empty($_POST['email'])) && (!empty($_POST['haslo']) && (!empty($_POST['miejscowosc'])))) {
  5.  
  6. $this->insert = $this->pdo -> exec('INSERT INTO `users` (`imie`, `nazwisko`, `ulica`, `miejscowosc`, `mail`, `haslo`) VALUES(
  7. \''.$this->imie.'\',
  8. \''.$this->nazwisko.'\',
  9. \''.$this->ulica.'\',
  10. \''.$this->miejscowosc.'\',
  11. \''.$this->mail.'\',
  12. \''.$this->haslo.'\')');
  13.  
  14. if ($this->insert>0) {
  15. $this->statement=$lang[0];
  16. } else { $this->statement=$lang[1]; }
  17. } else { $this->stmt=$lang[2]; }
  18. }
  19. return $this->stmt;
  20. }
viking
  1. $this->pdo

Co to jest? Skąd bierzesz ten obiekt? Poza tym twój kod niewiele się różni od zwykłego wywołania mysql_query. Poczytaj http://www.php.net/manual/en/pdostatement.bindparam.php
miras
nie chciałem wrzucać kodu całej klasy, no ale musze..

  1.  
  2. <?php
  3.  
  4.  
  5. class Connect {
  6. private $pdo;
  7. public $stmt;
  8.  
  9. public function polacz() {
  10. try {
  11. $this->pdo = new PDO('mysql:host=localhost;dbname=x', 'x', 'x');
  12. $this->pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13. } catch(PDOException $e){
  14. echo 'Połączenie nie mogło zostać utworzone.<br />';
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. class Register extends Connect {
  22. public $stmt;
  23.  
  24. public $imie,$nazwisko,$ulica,$miejscowsc,$mail,$haslo;
  25.  
  26. public function add() {
  27. $this->imie = $_POST['imie'];
  28. $this->nazwisko = $_POST['nazwisko'];
  29. $this->ulica = $_POST['ulica'];
  30. $this->miejscowosc = $_POST['miejscowosc'];
  31. $this->mail = $_POST['mail'];
  32. $this->haslo = md5($_POST['haslo']);
  33. }
  34.  
  35. public function check() {
  36. include("language/pl.php");
  37. if (!empty($_POST['spr'])) {
  38. if ((!empty($_POST['imie'])) && (!empty($_POST['nazwisko'])) && (!empty($_POST['email'])) && (!empty($_POST['haslo']) && (!empty($_POST['miejscowosc'])))) {
  39.  
  40. $this->insert = $this->pdo -> exec('INSERT INTO `users` (`imie`, `nazwisko`, `ulica`, `miejscowosc`, `mail`, `haslo`) VALUES(
  41. \''.$this->imie.'\',
  42. \''.$this->nazwisko.'\',
  43. \''.$this->ulica.'\',
  44. \''.$this->miejscowosc.'\',
  45. \''.$this->mail.'\',
  46. \''.$this->haslo.'\')');
  47.  
  48. if ($this->insert>0) {
  49. $this->statement=$lang[0];
  50. } else { $this->statement=$lang[1]; }
  51. } else { $this->stmt=$lang[2]; }
  52. }
  53. return $this->stmt;
  54. }
  55. }
  56.  
  57.  
  58.  
  59. ?>
  60.  


stąd pdo..
viking
Do poczytania w takim razie http://php.net/manual/en/language.oop5.visibility.php
Jaki jest w Twoim kodzie zasięg private $pdo?

Aaa. I to co robisz daje możliwość SQL Injection.
miras
A zapytaniem do bazy sugerowałem się stąd: http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO możecie mnie naprowadzić jakoś jak mam to rozwiązać?


@@ zmieniony już typ zmiennej na public i nadal ten sam błąd..

zmieniłem trochę kod i teraz mi śmiga wszystko, powiedz jeszcze dlaczego kod jest podatny na sql injection ?
  1. <?php
  2.  
  3.  
  4. class Klasa {
  5. public $pdo;
  6. public $stmt;
  7. public $imie,$nazwisko,$ulica,$miejscowsc,$mail,$haslo;
  8. public function __construct() {
  9. try {
  10. $this->pdo = new PDO('mysql:host=localhost;dbname=x', 'x', 'x');
  11. $this->pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12. } catch(PDOException $e){
  13. echo 'Połączenie nie mogło zostać utworzone.<br />';
  14. }
  15. }
  16.  
  17.  
  18.  
  19. public function add() {
  20.  
  21. $this->imie = $_POST['imie'];
  22. $this->nazwisko = $_POST['nazwisko'];
  23. $this->ulica = $_POST['ulica'];
  24. $this->miejscowosc = $_POST['miejscowosc'];
  25. $this->mail = $_POST['mail'];
  26. $this->haslo = md5($_POST['haslo']);
  27. }
  28.  
  29. public function check() {
  30. include("language/pl.php");
  31. if (!empty($_POST['spr'])) {
  32. if ((!empty($_POST['imie'])) && (!empty($_POST['nazwisko'])) && (!empty($_POST['email'])) && (!empty($_POST['haslo']) && (!empty($_POST['miejscowosc'])))) {
  33.  
  34. $this->insert = $this->pdo -> exec('INSERT INTO `users` (`imie`, `nazwisko`, `ulica`, `miejscowosc`, `mail`, `haslo`) VALUES(
  35. \''.$this->imie.'\',
  36. \''.$this->nazwisko.'\',
  37. \''.$this->ulica.'\',
  38. \''.$this->miejscowosc.'\',
  39. \''.$this->mail.'\',
  40. \''.$this->haslo.'\')');
  41.  
  42. if ($this->insert>0) {
  43. $this->statement=$lang[0];
  44. } else { $this->statement=$lang[1]; }
  45. } else { $this->stmt=$lang[2]; }
  46. }
  47. return $this->stmt;
  48. }
  49. }
  50.  
  51.  
  52.  
  53. ?>
  54.  
  55.  
viking
To jeszcze pytanie czy wywołujesz gdzieś polacz()? smile.gif

Możesz zrobić coś na kształt
  1. class Connect {
  2. ...
  3. private $pdo;
  4.  
  5. public getConnection() {
  6. if (null === $this->pdo) {
  7. $this->polacz();
  8. }
  9. return $this->pdo;
  10. }
  11. }

I później $this->getConnection()->...
Jak zabezpieczyć podałem w pierwszym poście.

----
Podatny jest dlatego że podstawiasz dane z _POST, w żaden sposób niefiltrowane, bezpośrednio do zapytania. W tym kursie wikibooks niby pokazują niżej poprawne przykłady ale za takie nauczanie powinni klawiaturę zabierać.
piotr.pasich
Miras,

chyba pisałem Ci już w osobnym poscie. Korzystasz z PDO, ale jako tylko proxy do plainowych zapytań SQL, to nie jest najlepsze rozwiązanie, a w przypadku INSERTów niesamowicie podatne na SQL injection. Chyba znalazłem przykład, z którego skorzystałeś i kilka linijek niżej jest lepszy :

  1. $stmt = $pdo -> prepare('INSERT INTO `produkty` (`nazwa`, `opis`, `ilosc`, `cena`, `jakosc`) VALUES(
  2. :nazwa,
  3. :opis,
  4. :ilosc,
  5. :cena,
  6. :jakosc)'); // 1
  7.  
  8. $stmt -> bindValue(':nazwa', $_POST['nazwa'], PDO::PARAM_STR); // 2
  9. $stmt -> bindValue(':opis', $_POST['opis'], PDO::PARAM_STR);
  10. $stmt -> bindValue(':ilosc', $_POST['ilosc'], PDO::PARAM_INT);
  11. $stmt -> bindValue(':cena', (float)$_POST['cena'], PDO::PARAM_STR);
  12. $stmt -> bindValue(':jakosc', $_POST['jakosc'], PDO::PARAM_INT);


Bindowanie pozwala bardzo ładnie zachować bezpieczeństwo w tym wypadku.
Polecam wrzucić kod na githuba. Będzie łatwiej komentować.

Zapraszam też do głosowania na agendę http://www.phpcon.pl/2013/pl/agenda.

Piotr Pasich
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.