Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO i Class] zapytanie select z parametrem
Forum PHP.pl > Forum > PHP
molik
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. ?>
Tomplus
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ą
viking
Jak już to count($s->fetchAll()) chociaż lepiej było by zapytanie z COUNT(*) wysłać.
Cała klasa większego sensu nie ma.
molik
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..
nospor
Nigdzie nie odbierasz wynikow SELECT.... viking juz ci napisal co masz zrobic
molik
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();
nospor
Sposob przypisania zmiennej jest poprawny. Skad pomysl ze jest inaczej?
viking
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).
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.