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

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

ただいまの
回答率

87.59%

PDO 変数に入れなければならないものと、変数にいれてはいけないものの違い

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,455

score 403

下記の違いはなんでしょうか?

$sql = "SELECT * FROM user_data WHERE id=200";
$stmt = $pdo->query($sql);
$rowData=$stmt->fetch();

echo $stmt['id'];//エラーがでる
echo $rowData['id'];//正常出力される

//↑変数に入れてから使わないとエラーがでると思われる

$sql = "SELECT * FROM user_skill AS US WHERE US.user_id = ? ";
$stmtSkills = $pdo->prepare($sql);
$sample = $stmtSkills->execute([$rowData['id']]);

echo $stmtSkills['skill'];//エラーが出る
echo $sample['skill'];//エラーはでないが何も出力されない

foreach ($stmtSkills as $test) {
    echo $test['skill'];//正常出力される
}

foreach ($sample as $test) {
    echo $test['skill'];//Warningエラーが出る
}

//↑こっちでは変数にいれると逆にerrorが出る

誤)$stmt->fetch();

正)$rowData=$stmt->fetch();

誤)$sample = $stmtSkills->execute([$rowData['id']]);

正)$stmtSkills->execute([$rowData['id']]);

覚えたものを別ページで実践しようとしていたのですが
なんだかよく分からなくなってきました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

$sql = "SELECT * FROM user_data WHERE id=1";
$stmt = $pdo->query($sql);
$rowData = $stmt->fetch();

var_dump($stmt);

出力結果

class PDOStatement#2 (1) {
  public $queryString =>
  string(34) "SELECT * FROM user_data WHERE id=1"
}

PDO::query

PDO::query — SQL ステートメントを実行し、結果セットを PDOStatement オブジェクトとして返す 

イメージ説明

var_dump($stmt);

の結果、class PDOStatement... と出力されていることに一致する。
つまり、$stmt は PDOStatement オブジェクト である。

オブジェクトは echo で出力できるものではないのでエラーになる。echo で出力できるのは、String や 数値などリテラル値であるため。

PDOStatement::fetch

PDOStatement::fetch — 結果セットから次の行を取得する 

イメージ説明

PDOStatementオブジェクトに関連付けられた結果セットから1行取得します。 fetch_style パラメータは、PDO がその行をどの様に返すかを決定します。

fetch_style

   次のレコードを呼び出し元に返す方法を制御します。 この値は、PDO::FETCH_* 定数のどれかで、 デフォルトは PDO::ATTR_DEFAULT_FETCH_MODE の値 (そのデフォルトは PDO::FETCH_BOTH) です。 

第1引数に何も設定しなけれは、PDO::FETCH_BOTH なので、

PDO::FETCH_BOTH (デフォルト): 結果セットに返された際のカラム名と 0 で始まるカラム番号で添字を付けた配列を返します。 

$rowData = $stmt->fetch();

fetch は 配列を結果として返すことがわかる。

なので、$rowData には「配列」が代入される。

$rowData は配列だから、$rowData['id'] でアクセス可能である。

var_dump($rowData); であれば、Array... と表示される。

同様に、リファレンスと実際の動きを確認してください。

http://php.net/manual/ja/book.pdo.php

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/02 19:14

    詳しくありがとうございます!

    キャンセル

0

誤)$stmt->fetch(); 
結果の行データを返すので、
返却先がない エラーですね。

誤)$sample = $stmtSkills->execute([$rowData['id']]); 

実行はうまくいってるのでは?

エラーではなく実行結果の id? もしくは
true false が返却されるのでは?
戻り値を返さなければ
何も入らないはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/02 19:14

    回答ありがとうございます!

    キャンセル

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

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

関連した質問

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