Kurs PDO - podpinanie parametrów cz.2

Wpis napisany 22 lutego 2009 w kategoriach: (x)HTML/CSS, PHP/MySQL, Techblog, Wszystkie | 15:20:39 | 1 komentarz

Witam wszystkich po dłuższej przerwie spowodowanej głównie moim lenistwem ;). Inaczej nie da się wytłumaczyć tego, że przez dwa tygodnie wolnego (ferie) nie napisałem nic na blogu. Dzisiaj jednak zamierzam dodać kolejny artykuł do serii na temat PDO. Z tego wpisu dowiecie się jak za pomocą podpinania zmiennych do kolumn pobierać dane z bazy.

Wszystkie dane pobrane z bazy zawsze znajdują się w obiekcie klasy PDOStatement. Dlatego musimy przekazać mu informację o tym, do jakich zmiennych mają trafiać. Aby to osiągnąć wykorzystamy poznany przez nas już wcześniej mechanizm - FETCH_MODE. By to zrobić cel mamy dwie drogi:

  1. Przekazanie stałej PDO::FETCH_BOUND do metody PDOStatement::fetch() (lub PDOStatement::fetchAll())
  2. Przekazanie stałej PDO::FETCH_BOUND do metody PDOStatement::setFetchMode()

Ponadto, podobnie jak w przypadku podpinania parametrów do zapytania mamy dwa sposoby identyfikowania kolumn - za pomocą nazwy oraz przez numer porządkowy kolumny. W pierwszym przypadku podajemy nazwę kolumny zwracaną przez bazę, w drugim natomiast jej kolejność. Należy jedynie pamiętać, że kolejne kolumny liczone są od jedynki.

W przypadku wywołania PDOStatement::fetch(PDO::FETCH_BOUND) podpięcie kolumn zastosowane zostanie jedynie do aktualnego wywołania metody PDOStatement::fetch(). Czasami jednak pozwala to skrócić zapis o niepotrzebne wywołanie PDOStatement::setFetchMode() - zazwyczaj gdy rekordy wyciągane są z obiektu tylko raz.

 
  $players = $pdo->query('SELECT id, user, ip FROM  players');
 
  $players->bindColumn(1, $id); //indeksowanie numeryczne od jedynki
  $players->bindColumn(2, $user);
 
  $players->bindColumn('ip', $ip); //indeksowanie za pomocą nazy kolumny
 
  while ($players->fetch(PDO::FETCH_BOUND)) //wartość zwracana to true/false
  {
    echo $id;
    echo $user;
  }
 

W prezentowanym powyżej przypadku dane trafiają tylko i wyłącznie do podpiętych zmiennych. Metoda PDOStatement::fetch(PDO::FETCH_BOUND) zwraca jedynie wartość true/false do określenia, czy zostały pobrane wszystkie rekordy. Ponadto zastosowaliśmy dwie metody indentyfikowania kolumn.

Drugi sposób jest bardziej uniwersalny, jednak zajmuje minimalnie więcej kodu (osobiście jestem minimalistą i nie lubię jak mi się zbytnio po ekranie rozłazi ;)):

 
  $players = $pdo->query('SELECT id, user, ip FROM  players');
 
  $players->bindColumn(1, $id); //indeksowanie numeryczne od jedynki
  $players->bindColumn(2, $user);
 
  $players->bindColumn('ip', $ip); //indeksowanie za pomocą nazy kolumny
  $players->setFetchMode(PDO::FETCH_BOUND);
 
  while ($players->fetch()) //wartość zwracana to true/false
  {
    echo $id;
    echo $user;
  }
 

Od tej pory dla określonego obiektu klasy PDOStatement stale obowiązuje ustawienie PDO::FETCH_BOUND. Kiedy możemy to wykorzystać? Najszybciej na myśl przychodzi mi połączenie z podpinaniem parametrów:

 
  $players = $pdo->prepare('SELECT id, user, ip FROM  players WHERE pass = ?');
 
  $players->bindColumn(1, $id); //indeksowanie numeryczne od jedynki
  $players->bindColumn(2, $user);
  $players->bindColumn('ip', $ip); //indeksowanie za pomocą nazy kolumny
 
  $players->bindParam(1, $pass);
 
  $players->setFetchMode(PDO::FETCH_BOUND);
 
  $players->execute(array('x'));
  while ($players->fetch()) //wartość zwracana to true/false
  {
    echo $id;
    echo $user;
  }
 
  $players->execute(array('y'));
  while ($players->fetch()) //wartość zwracana to true/false
  {
    echo $id;
    echo $user;
  }
 
  $players->execute(array('z'));
  while ($players->fetch()) //wartość zwracana to true/false
  {
    echo $id;
    echo $user;
  }
 

Oczywiście zaprezentowany przeze mnie przykład jest nieco bezużyteczny, gdyż dałoby się to pobrać za pomocą zwykłego OR, jednak załóżmy że nie jest to bezsensowne i dobrze ilustruje to, co chcemy zrobić ;).

To już wszystko co chciałem dzisiaj pokazać. Wkrótce pojawi się na tym blogu nieco więcej - moje długoterminowe plany zmian wkrótce wejdą w życie :).

adam 17 grudnia 2009 o 08:45:18

Świetny kurs , przydał się .

Dodaj komentarz

HTML w komentarzach jest wyłączony.

code