PDOで設定できる属性(1/3)
ここではPDOで設定できる属性(setAttribute/getAttribute
などで設定/取得できる値)について説明します。
結果セットを取得する際の設定項目
PDO::FETCH_LAZY
PDO:FETCH_LAZY
は結果セットの取得を、配列からアクセスしたりオブジェクトと同じようにアクセスしたりできる形で行います。
結果セットの値は、0から始まる配列の添字か、連想配列キー、またはカラム名と同じオブジェクトのプロパティを利用して取得できます。
これはPDO::FETCH_BOTH
とPDO::FETCH_OBJ
の組合せと考えてよいです。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); $rows = $stmt->fetch(PDO::FETCH_LAZY); var_dump($rows->ID); var_dump($rows[0]); var_dump($rows["ID"]); var_dump($rows->TITLE); var_dump($rows[1]); var_dump($rows["TITLE"]); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の結果は以下になります。
string(1) "1" string(1) "1" string(1) "1" string(5) "HAPPY" string(5) "HAPPY" string(5) "HAPPY" object(PDORow)#3 (3) { ["ID"]=> string(1) "1" ["TITLE"]=> string(5) "HAPPY" ["CONTENT"]=> string(10) "HAPPY SONG" }
PDO::FETCH_ASSOC
PDO::FETCH_ASSOC
は結果セットに対して連想配列と同じようにアクセスできる形で取得します。
結果セットを取得するにはカラム名をキーとした配列にアクセスします。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); $rows = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($rows["ID"]); var_dump($rows["TITLE"]); var_dump($rows["CONTENT"]); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
string(1) "1" string(5) "HAPPY" string(10) "HAPPY SONG" array(3) { ["ID"]=> string(1) "1" ["TITLE"]=> string(5) "HAPPY" ["CONTENT"]=> string(10) "HAPPY SONG" }
PDO::FETCH_NAMED
PDO::FETCH_NAMED
は結果セットをカラム名に行数をセットした配列で取得します。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query( "SELECT a.ID, b.ID, a.TITLE, b.TITLE FROM CD a, CD b WHERE a.ID = 1 and b.ID = 2"); $rows = $stmt->fetch(PDO::FETCH_NAMED); var_dump($rows["ID"]); var_dump($rows["TITLE"]); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
array(2) { [0]=> string(1) "1" [1]=> string(1) "2" } array(2) { [0]=> string(5) "HAPPY" [1]=> string(3) "SAD" } array(2) { ["ID"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "2" } ["TITLE"]=> array(2) { [0]=> string(5) "HAPPY" [1]=> string(3) "SAD" } }
PDO::FETCH_NUM
PDO::FETCH_NUM
は結果セットをカラムの順番に格納した配列を取得します。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); $rows = $stmt->fetch(PDO::FETCH_NUM); var_dump($rows[0]); var_dump($rows[1]); var_dump($rows[2]); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
string(1) "1" string(5) "HAPPY" string(10) "HAPPY SONG" array(3) { [0]=> string(1) "1" [1]=> string(5) "HAPPY" [2]=> string(10) "HAPPY SONG" }
PDO::FETCH_BOTH
PDO::FETCH_BOTH
は結果セットを配列でアクセスできる形で取得します。fetch
で取得する時に何も引数に設定しない場合は、この結果セットがデフォルトで取得されます。結果セットへのアクセスはカラム名をキーとした配列か、カラムの番号でアクセスすることで結果セットの取得が可能です。
PDO::FETCH_BOTH
はPDO::FETCH_NUM
とPDO::FETCH_ASSOC
の組合せと考えてよいです。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); $rows = $stmt->fetch(PDO::FETCH_BOTH); var_dump($rows[0]); var_dump($rows["ID"]); var_dump($rows[1]); var_dump($rows["TITLE"]); var_dump($rows[2]); var_dump($rows["CONTENT"]); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の結果は以下になります。
string(1) "1" string(1) "1" string(5) "HAPPY" string(5) "HAPPY" string(10) "HAPPY SONG" string(10) "HAPPY SONG" array(6) { ["ID"]=> string(1) "1" [0]=> string(1) "1" ["TITLE"]=> string(5) "HAPPY" [1]=> string(5) "HAPPY" ["CONTENT"]=> string(10) "HAPPY SONG" [2]=> string(10) "HAPPY SONG" }
PDO::FETCH_OBJ
PDO::FETCH_OBJ
は結果セットにカラム名と同名のプロパティを持つ匿名オブジェクトを取得します。PDOStatement::fetchObject
と同じ結果を返します。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); $rows = $stmt->fetch(PDO::FETCH_OBJ); var_dump($rows->ID); var_dump($rows->TITLE); var_dump($rows->CONTENT); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
string(1) "1" string(5) "HAPPY" string(10) "HAPPY SONG" object(stdClass)#3 (3) { ["ID"]=> string(1) "1" ["TITLE"]=> string(5) "HAPPY" ["CONTENT"]=> string(10) "HAPPY SONG" }
PDO::FETCH_BOUND
PDO::FETCH_BOUND
はbindParam
やbindColumn
を用いてPHP変数に割り当てを行い結果セットを取得します。PDO::FETCH_BOUND
の戻り値はtrue
が返ります。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT ID, TITLE, CONTENT FROM CD"); $stmt->bindColumn("ID", $id); $stmt->bindColumn("TITLE", $title); $stmt->bindColumn(3, $content); $rows = $stmt->fetch(PDO::FETCH_BOUND); var_dump($rows); var_dump($id, $title, $content); $stmt->bindParam(1, $id); $stmt->bindParam(2, $title); $stmt->bindParam(3, $content); $rows = $stmt->fetch(PDO::FETCH_BOUND); var_dump($rows); var_dump($id, $title, $content); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
bool(true) string(1) "1" string(5) "HAPPY" string(10) "HAPPY SONG" bool(true) string(1) "2" string(3) "SAD" string(8) "SAD SONG"
PDO::FETCH_COLUMN
PDO::FETCH_COLUMN
は取得したいカラム番号を指定してカラムの結果セットを取得します。
try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); $rows = $stmt->fetchAll(PDO::FETCH_COLUMN, 2); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
PDO::FETCH_COLUMN
ではfetchAll
を使用し全体を取得しています(もちろんfect
でも取得可能)。
また、上記の実行結果は以下になります。
array(7) { [0]=> string(10) "HAPPY SONG" [1]=> string(8) "SAD SONG" [2]=> string(10) "ANGRY SONG" [3]=> string(9) "LOVE SONG" [4]=> string(11) "SLEEPY SONG" [5]=> string(14) "CHRISTMAS SONG" [6]=> string(13) "NEW YEAR SONG" }
PDO::FETCH_CLASS
PDO::FETCH_CLASS
では任意のクラスに対して結果セットをマッピングして取得することが可能です。簡単なO/Rマッピング程度ならこの方法でいけるかもしれません。
class CDEntity { private $ID; private $TITLE; private $CONTENT; public function getId(){ return $this->ID; } public function getTitle(){ return $this->TITLE; } public function getContent(){ return $this->CONTENT; } public function __get($name){ $prop = strtoupper($name); return $this->$prop; } } try { $pdo = CZ_PDO::getConnection(); $stmt = $pdo->query("SELECT * FROM CD"); //PDO::FETCH_CLASSとマッピングを行うクラス両方を指定できます。 $rows = $stmt->fetchAll(PDO::FETCH_CLASS, "CDEntity"); $cd1 = $rows[0]; $cd2 = $rows[1]; var_dump($cd1->getId()); var_dump($cd1->getTitle()); var_dump($cd1->getContent()); var_dump($cd2->id); var_dump($cd2->title); var_dump($rows[2]); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
string(1) "1" string(5) "HAPPY" string(10) "HAPPY SONG" string(1) "2" string(3) "SAD" object(CDEntity)#5 (3) { ["ID:private"]=> string(1) "3" ["TITLE:private"]=> string(5) "ANGRY" ["CONTENT:private"]=> string(10) "ANGRY SONG" }
PDO::FETCH_CLASSTYPE
PDO::FETCH_CLASSTYPE
はPDO::FETCH_CLASS
と同じように結果セットを任意のクラスにマッピングして取得しますが、PDO::CLASSTYPE
は結果セットの最初のカラム名からクラスに対してマッピングします。
class CDEntity { private $ID; private $TITLE; private $CONTENT; public function getId(){ return $this->ID; } public function getTitle(){ return $this->TITLE; } public function getContent(){ return $this->CONTENT; } public function __get($name){ $prop = strtoupper($name); return $this->$prop; } } try { $pdo = CZ_PDO::getConnection(); // SELECT文の一番最初にクラス名を設定しました。 $stmt = $pdo->query("SELECT 'CDEntity', CD.* FROM CD"); // fetchAllではなく、fetchでマッピングしてる点が // PDO::FETCH_CLASS単体で使う場合とは違います。 $rows = $stmt->fetch(PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE); var_dump($rows->getId()); var_dump($rows->TITLE); var_dump($rows->content); var_dump($rows); } catch (PDOException $e) { var_dump($e->getMessage()); }
上記の実行結果は以下になります。
string(1) "1" string(5) "HAPPY" string(10) "HAPPY SONG" object(CDEntity)#3 (3) { ["ID:private"]=> string(1) "1" ["TITLE:private"]=> string(5) "HAPPY" ["CONTENT:private"]=> string(10) "HAPPY SONG" }