Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PDO i Class] zapytanie select z parametrem
molik
post 4.04.2017, 02:00:49
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.04.2017

Ostrzeżenie: (0%)
-----


Na wstępie witam wszystkich bardzo serdecznie!

Jestem początkujący jeśli chodzi o obiektówkę, dlatego też proszę o wyrozumiałość...
Mój problem polega na zapytaniu select z parametrem... Oczywiście wiem, że nie nie powinno tak wyglądać, ale próbuje już wszystkiego..

Zapytanie SELECT powinno wyglądać tak:

  1.  
  2. $sql = 'SELECT * FROM nazwa_tabeli';
  3. $result = $pdo->query(sql);
  4.  


Tyle wiem, ale co jeżeli chcę wprowadzić do niej parametr i nie wpisywać go bezpośrednio gdyż istnieje zagrożenie SQL Injection... ale już naprawdę nie mam na to pomysłu.. może Wy mi w tym pomożecie..
Wymyśliłem sobie oto taki zapis (konkretnie chodzi o metodę checkIfIsset()):

  1. $sql = 'SELECT nrComp FROM 08925902_k1.employers WHERE nrComp = :nrComp';
  2. $s = $pdo->prepare($sql);
  3. $s->bindValue(':nrComp', $this->nrComp);
  4. $s->execute();
  5. $this->employers = count($s);


Jak widać nie działa... bardzo Was proszę o pomoc...

Oto cały kod klasy:

  1. <?php
  2.  
  3. class RegisterEmployer{
  4. public $nrComp;
  5. public $firstName;
  6. public $lastName;
  7. public $password;
  8. public $employers;
  9.  
  10. public function __construct($nrComp, $firstName, $lastName, $password){
  11. $this->nrComp = $nrComp;
  12. $this->firstName = $firstName;
  13. $this->lastName = $lastName;
  14. $this->password = $password;
  15. }
  16.  
  17. public function wypiszDane(){
  18. echo '<p class="bg-info">'
  19. .$this->nrComp.'<br>'
  20. .$this->firstName.'<br>'
  21. .$this->lastName.'<br>'
  22. .$this->password.
  23. '</p>';
  24. }
  25.  
  26. public function registerEmployer(){
  27.  
  28. self::checkIfIsset();
  29.  
  30. if($this->employers > 0){
  31. echo '<p class="bg-warning">Taki numer komputerowy już istnieje w bazie danych.</p>';
  32. exit();
  33. }else{
  34. try {
  35. include 'inc/database.php';
  36. $sql = 'INSERT INTO 08925902.employers SET
  37. nrComp = :nrComp,
  38. firstName = :firstName,
  39. lastName = :lastName,
  40. password = :password
  41. ';
  42. $s = $pdo->prepare($sql);
  43. $s->bindValue(':nrComp', $this->nrComp);
  44. $s->bindValue(':firstName', $this->firstName);
  45. $s->bindValue(':lastName', $this->lastName);
  46. $s->bindValue(':password', SHA1($this->password));
  47. $s->execute();
  48. } catch (PDOException $e) {
  49. echo '<p class="bg-warning">'.$e->getMessage() .'<br>'.$e->getLine().'</p>';
  50. exit();
  51. }
  52. echo '<p class="bg-success">Dodano użytkownika do bazy danych.</p>';
  53. }
  54.  
  55. }
  56.  
  57. public function checkIfIsset(){
  58. try {
  59. include 'inc/database.php';
  60. $sql = 'SELECT nrComp FROM 08925902.employers WHERE nrComp = :nrComp';
  61. $s = $pdo->prepare($sql);
  62. $s->bindValue(':nrComp', $this->nrComp);
  63. $s->execute();
  64. $this->employers = count($s);
  65. } catch (PDOException $e) {
  66. echo '<p class="bg-warning">'.$e->getMessage() .'<br>'.$e->getLine().'</p>';
  67. exit();
  68. }
  69.  
  70. }
  71. }
  72.  
  73. ?>


kod uruchomienia:

  1. <?php
  2. if(isset($_POST['addEmployer'])){
  3. echo '<p class="bg-info">Przejdź do procedury dodawania pracownika.</p>';
  4.  
  5. $employer = new RegisterEmployer($_POST['nrComp'], $_POST['employerFirstName'], $_POST['employerLastName'], $_POST['employerPass']);
  6. $employer->registerEmployer();
  7. }else{
  8. include 'sites/form_registerEmployer.php';
  9. exit();
  10. }
  11.  
  12.  
  13. ?>


Ten post edytował molik 4.04.2017, 02:03:33
Go to the top of the page
+Quote Post
Tomplus
post 4.04.2017, 06:51:49
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Ty łączysz się z bazą danych za każdym razem wywołując metodę i to 2 razy?
include 'inc/database.php';


Próbowałeś SELECT nrComp FROM 08925902_k1.employers WHERE nrComp = :nrComp
wkleić bezpośrednio w konsoli MySQL aby sprawdzić czy masz wynik, tylko zastępując :nrComp wartością
Go to the top of the page
+Quote Post
viking
post 4.04.2017, 06:55:05
Post #3





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Jak już to count($s->fetchAll()) chociaż lepiej było by zapytanie z COUNT(*) wysłać.
Cała klasa większego sensu nie ma.


--------------------
Go to the top of the page
+Quote Post
molik
post 4.04.2017, 13:16:42
Post #4





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.04.2017

Ostrzeżenie: (0%)
-----


Cytat(Tomplus @ 4.04.2017, 07:51:49 ) *
Ty łączysz się z bazą danych za każdym razem wywołując metodę i to 2 razy?
include 'inc/database.php';

includa ogarnę sobie, jak już wcześniej pisałem staram się wszystkiego już próbować co mi tylko wpadnie do głowy..

Cytat(Tomplus @ 4.04.2017, 07:51:49 ) *
Próbowałeś SELECT nrComp FROM 08925902_k1.employers WHERE nrComp = :nrComp
wkleić bezpośrednio w konsoli MySQL aby sprawdzić czy masz wynik, tylko zastępując :nrComp wartością

Po podstawieniu danych na sztywno - zapytanie działa..
Go to the top of the page
+Quote Post
nospor
post 4.04.2017, 13:19:45
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nigdzie nie odbierasz wynikow SELECT.... viking juz ci napisal co masz zrobic


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
molik
post 4.04.2017, 13:24:16
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.04.2017

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 4.04.2017, 14:19:45 ) *
Nigdzie nie odbierasz wynikow SELECT.... viking juz ci napisal co masz zrobic

Widzę, widzę, ale po kolei odpisuje na posty.

Koledzy, ale dalej nie wiem, czy taki zapis jeśli chodzi o parametr i późnieje preparowanie.. Po prostu jak dokonać zapisu zapytanie do mysql jeśli w zapytaniu chcemy umieścić zmienną członkowską, ale w taki sposób aby nie narazić się na sql injection? Czy można to zrobić w taki sposób jak poniżej? Jeśli nie to napiszcie mi jak to zrobić./
  1. $sql = 'SELECT nrComp FROM 08925902.employers WHERE nrComp = :nrComp';
  2. $s = $pdo->prepare($sql);
  3. $s->bindValue(':nrComp', $this->nrComp);
  4. $s->execute();


Ten post edytował molik 4.04.2017, 13:31:06
Go to the top of the page
+Quote Post
nospor
post 4.04.2017, 13:44:16
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Sposob przypisania zmiennej jest poprawny. Skad pomysl ze jest inaczej?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 4.04.2017, 13:47:04
Post #8





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Kod wyżej jest ok. Jedyne co to można by przekazać jako parametr do funkcji ten numer id.
Później jak zaczniesz poprawiać klasę to wyrzuć wszystkie echo bo za to powinna odpowiadać oddzielna warstwa widoku. Poczytaj też o wstrzykiwaniu zależności (chodzi o adapter bazy danych w tym konkretnym przykładzie).


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 13:11