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

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

ただいまの
回答率

90.12%

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 8,124

marimokomokmOk

score 50

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

とでてきました。

いみがわかりません泣

qiita

<?php require 'header.php'; ?>
<?php require 'menu.php'; ?>
<?php

session_start ();
// unset→指定した変数を破棄する
unset ( $_SESSION ['customer'] );
$pdo = new PDO ( 'mysql:host=localhost;dbname=takahashi1;charset=utf8', 'takahashi', 'takahashi' );
$stmt = $pdo->prepare ( 'select * from customer where login=? and password=?' );
$stmt->execute ( array (
        $_POST ['login'],
        $_POST ['password']
) );

// foreach ( $stmt->fetchAll() as $row ) {
// 1行ずつfetchして$rowに設定して、$rowの中身をループの中で毎回処理して、
// 中身が無くなったらfetchの返り値がfalseになってループを抜ける感じ
// PDO::FETCH_ASSOC: は、結果セットに 返された際のカラム名で添字を付けた配列を返します。
while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC ) ) {
    $_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 'ログイン名またはパスワードが違います。';
}
?>
<?php require 'footer.php'; ?>

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

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);
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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • marimokomokmOk

    2017/03/15 18:35 編集

    ■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 18:48

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

    キャンセル

  • marimokomokmOk

    2017/03/15 18:54

    かきました

    キャンセル

回答 4

+6

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/16 13:45

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

    キャンセル

  • 2017/03/16 16:15

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

    キャンセル

+4

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

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

CREATE TABLE `User` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `User` (`id`, `name`)
VALUES
    (1,'山田'),
    (2,'佐藤'),
    (3,'鈴木');
<?php

ini_set('display_errors', true);
error_reporting(E_ALL);

try {
    $dsn = 'mysql:host=localhost;dbname=sample;charset=utf8;';
    $username = 'root';
    $password = 'password';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ];

    $pdo = new PDO($dsn, $username, $password, $options);

    $sql = 'SELECT id, name FROM User;';
    $stmt = $pdo->prepare($sql);

    $stmt->execute();
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    var_dump($rows);

    $stmt->execute();
    $rows = $stmt->fetchAll(PDO::FETCH_BOTH);
    var_dump($rows);
} catch (Exception $ex) {
    var_dump($ex);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

id login password name address
1 abcde password John Doe anywhere

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

$row = array(
  'id' => 1,
  'login' => 'abcde',
  'password' => 'password',
  'name' => 'John Doe',
  'address' => 'anywhere'
);


ですから、

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


のように使えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

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