質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

4回答

20728閲覧

PHP「PDO::FETCH_ASSOC: は、結果セットに 返された際のカラム名で添字を付けた配列を返す」の意味がわかりません。

marimokomokmOk

総合スコア52

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

4クリップ

投稿2017/03/15 08:58

編集2017/03/15 09:54

PDO::FETCH_ASSOC:について調べていたら、
PDO::FETCH_ASSOC
『PDO::FETCH_ASSOC: は、結果セットに 返された際のカラム名で添字を付けた配列を返します。』

とでてきました。

いみがわかりません泣

qiita

php

1<?php require 'header.php'; ?> 2<?php require 'menu.php'; ?> 3<?php 4 5session_start (); 6// unset→指定した変数を破棄する 7unset ( $_SESSION ['customer'] ); 8$pdo = new PDO ( 'mysql:host=localhost;dbname=takahashi1;charset=utf8', 'takahashi', 'takahashi' ); 9$stmt = $pdo->prepare ( 'select * from customer where login=? and password=?' ); 10$stmt->execute ( array ( 11 $_POST ['login'], 12 $_POST ['password'] 13) ); 14 15// foreach ( $stmt->fetchAll() as $row ) { 16// 1行ずつfetchして$rowに設定して、$rowの中身をループの中で毎回処理して、 17// 中身が無くなったらfetchの返り値がfalseになってループを抜ける感じ 18// PDO::FETCH_ASSOC: は、結果セットに 返された際のカラム名で添字を付けた配列を返します。 19while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC ) ) { 20 $_SESSION ['customer'] = array ( 21 // idというキーで$row['id']を入れる 22 'id' => $row ['id'], 23 'name' => $row ['name'], 24 'address' => $row ['address'], 25 'login' => $row ['login'], 26 'password' => $row ['password'] 27 ); 28} 29if (isset ( $_SESSION ['customer'] )) { 30 echo 'いらっしゃいませ、', $_SESSION ['customer'] ['name'], 'さん。'; 31} else { 32 echo 'ログイン名またはパスワードが違います。'; 33} 34?> 35<?php require 'footer.php'; ?>

var_dumpで$rowの中身を見てみました。

php

1while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC ) ) { 2 var_dump($row); 3 // foreach ( $rows as $row ) { 4 // 連想配列$_SESSION['customer']にキーを指定して追加し、値として連想配列を代入 5 $_SESSION ['customer'] = array ( 6 // idというキーで$row['id']を入れる 7 'id' => $row ['id'], 8 'name' => $row ['name'], 9 'address' => $row ['address'], 10 'login' => $row ['login'], 11 'password' => $row ['password'] 12 ); 13} 14if (isset ( $_SESSION ['customer'] )) { 15 echo 'いらっしゃいませ、', $_SESSION ['customer'] ['name'], 'さん。'; 16} else { 17 echo 'ログイン名またはパスワードが違います。'; 18} 19var_dump($row);

php:$rowの中身

1array(5) { ["id"]=> string(2) "10" ["name"]=> string(15) "浜崎あゆみ" ["address"]=> string(32) "東京都渋谷区恵比寿2-7-2" ["login"]=> string(3) "ayu" ["password"]=> string(4) "1234" } いらっしゃいませ、浜崎あゆみさん。bool(false)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2017/03/15 09:10

実際に、$rowに何が入っているかを表示して調べては。var_dump()を使えばできるでしょう。
marimokomokmOk

2017/03/15 09:33

ありがとうございます。var_dumpいれてみました^^
marimokomokmOk

2017/03/15 09:35 編集

```php while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC ) ) { var_dump($row); // foreach ( $rows as $row ) { // 連想配列$_SESSION['customer']にキーを指定して追加し、値として連想配列を代入 $_SESSION ['customer'] = array ( // idというキーで$row['id']を入れる 'id' => $row ['id'], 'name' => $row ['name'], 'address' => $row ['address'], 'login' => $row ['login'], 'password' => $row ['password'] ); } if (isset ( $_SESSION ['customer'] )) { echo 'いらっしゃいませ、', $_SESSION ['customer'] ['name'], 'さん。'; } else { echo 'ログイン名またはパスワードが違います。'; } var_dump($row); ```
marimokomokmOk

2017/03/15 09:36 編集

■var_dumpの結果です↓ $rowの中身 array(5) { ["id"]=> string(2) "10" ["name"]=> string(15) "浜崎あゆみ" ["address"]=> string(32) "東京都渋谷区恵比寿2-7-2" ["login"]=> string(3) "ayu" ["password"]=> string(4) "1234" } いらっしゃいませ、浜崎あゆみさん。bool(false)
ikedas

2017/03/15 09:48

コメント欄ではなく質問に追記していただけますか。
guest

回答4

0

PHPにおける「配列」とは何か。
PHP: 配列 - Manual
他の言語で実現しているデータ構造のいいとこ取り(?)みたいなことをやってます。

C言語ライクに0, 1, 2, ...といった添字で値を格納するだけではなく、
Perlなどで言う連想配列(キーに任意の文字列を指定して値を格納する)こともできますし、
その際キーは辞書順である必要もなく記述した順番通り順序も記憶してくれる
ちょー便利な仕組みなんです。

PHP: PDOStatement::fetch - Manual
の説明では「結果セットに 返された際のカラム名で添字を付けた配列を返します」とあるので、
SELECT文の実行結果での、カラム名(あるいはフィールド名とも言いますか)を
配列のキー文字列として使って値を格納した配列を返す、
という意味です。

'select * from customer where login=? and password=?'っていうSELECT文の実行結果が
'select id, login, password, name, address from customer where login=? and password=?'っていうSELECT文の実行結果のように
1行ごとに配列として

$row = array( 'id' => (idの値), 'login' => (loginの値), 'password' => (passwordの値), 'name' => (nameの値), 'address' => (addressの値) );

として配列で返すということです。

while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC) ) {
だから、結果は$row['id'], $row['login'], $row['password']で受け取ることになります。
(このときの$rowは配列。)

while ( $row = $stmt->fetch ( PDO::FETCH_NUM ) ) {
としてしまうと、結果は$row[0], $row[1], $row[2]で受け取ることになります。
(このときも$rowは配列。)

while ( $row = $stmt->fetch ( PDO::FETCH_OBJ ) ) {
としてしまうと、結果は$row->id, $row->login, $row->passwordで受け取ることになります。
(このときの$rowは無名オブジェクトのインスタンス。)無名というか匿名というか、、

もしもテーブルcustomerの構造が変わってしまってカラム名の順番が変わってしまったとしても、
PDO::FETCH_ASSOCやPDO::FETCH_OBJを指定していれば
カラム名を直接指定して読み出せるため、
テーブルの構造の変化に強いプログラミングになります。

あとはどっちのスタイルが好きかでいいんじゃないでしょうか。
(パフォーマンスの違いがあるのかないのかはわかりません、、)

投稿2017/03/15 09:59

編集2017/03/15 10:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimokomokmOk

2017/03/16 04:45

ありがとうございます。 わかりやすいです!! というかだんだんわかってきました。 昨日新しい本を買いました 「SE 独習 PHP 第3版」山田祥寛著
退会済みユーザー

退会済みユーザー

2017/03/16 07:15

困ったら、余計なところを省いたサンプルコードを起こしてvar_dump()
guest

0

こんな感じのコードを実際に動かして、結果を見ればわかることだと思うんですけどねぇ…

理解したいという意欲はわかるんだけど…

sql

1 2CREATE TABLE `User` ( 3 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 4 `name` varchar(32) DEFAULT NULL, 5 PRIMARY KEY (`id`) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 7 8INSERT INTO `User` (`id`, `name`) 9VALUES 10 (1,'山田'), 11 (2,'佐藤'), 12 (3,'鈴木');

php

1<?php 2 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6try { 7 $dsn = 'mysql:host=localhost;dbname=sample;charset=utf8;'; 8 $username = 'root'; 9 $password = 'password'; 10 $options = [ 11 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 12 ]; 13 14 $pdo = new PDO($dsn, $username, $password, $options); 15 16 $sql = 'SELECT id, name FROM User;'; 17 $stmt = $pdo->prepare($sql); 18 19 $stmt->execute(); 20 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 21 var_dump($rows); 22 23 $stmt->execute(); 24 $rows = $stmt->fetchAll(PDO::FETCH_BOTH); 25 var_dump($rows); 26} catch (Exception $ex) { 27 var_dump($ex); 28}

投稿2017/03/15 09:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

適当に作ったデータで返り値を見てみればいいんじゃない?百聞は一見にしかず

投稿2017/03/15 09:12

toutou

総合スコア2050

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHP のオンラインマニュアルで PDOStatement::fetch の下の方に、それぞれの PDO::FETCH_* を使った場合の例が載っています。
簡単にいえば、FETCH_ASSOC では、結果は key-value 形式の配列になっているのです。

結果がこんな形の表として表現できる場合

idloginpasswordnameaddress
1abcdepasswordJohn Doeanywhere

結果は次のような配列になっています。

PHP

1$row = array( 2 'id' => 1, 3 'login' => 'abcde', 4 'password' => 'password', 5 'name' => 'John Doe', 6 'address' => 'anywhere' 7);

ですから、

PHP

1 echo $row['id']; // '1'が表示される

のように使えます。

投稿2017/03/15 09:11

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問