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 komentarzWitam 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:
- Przekazanie stałej PDO::FETCH_BOUND do metody PDOStatement::fetch() (lub PDOStatement::fetchAll())
- 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 :).
Świetny kurs , przydał się .