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

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

ただいまの
回答率

90.52%

  • PHP

    20330questions

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

  • SQL

    2390questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    700questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

PHP データベースに接続で疑問な箇所があります

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 536

marimokomokmOk

score 46

$sql = $pdo->prepare ( 'select * from customer where login=? and password=?' );
についてですが、
なぜ$sqlに代入しているのでしょうか。
PDOのインスタンスを代入した$pdoを$sqlに代入して、
PDOのインスタンスが持つfetchAllメソッドを実行するためでしょうか。

<?php
session_start ();
// unset→指定した変数を破棄する
unset ( $_SESSION ['customer'] );
$pdo = new PDO ( 'mysql:host=localhost;dbname=takahashi1;charset=utf8', 'takahashi', 'takahashi' );
$sql = $pdo->prepare ( 'select * from customer where login=? and password=?' );
$sql->execute ( array (
        $_POST ['login'],
        $_POST ['password']
) );
// foreachは配列とオブジェクトをループして使うための構文
// 配列ではないが使いやすくするために特別にforeachの反復処理で使えるように作られている
// $rowという変数に入れる
foreach ( $sql->fetchAll () 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 'ログイン名またはパスワードが違います。';
}
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+9

PDO::prepare
http://php.net/manual/ja/pdo.prepare.php

イメージ説明

prepare メソッドが返すのは PDOStatement オブジェクトです。
なので、提示されたコードで、代入している変数名がイケテナイ…

リファレンスページの例にあるように、PDOStatementであることがわかるよう、$stmt のように変数名を決定すべき。
$sql なんて変数名にしているから、無駄な混乱を招いているんでしょうね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/08 13:42

    ありがとうございます
    今後名前を$stmtにします!

    キャンセル

  • 2017/03/08 13:45

    PDO::prepare の
    ::の意味って何でしょうか

    キャンセル

  • 2017/03/08 13:47

    マニュアルの中では、「クラス::メソッド」 の関係を表す記号として使われています。
    ソースコードの中で現れたときは、クラス::メソッド の関係において、静的メソッドであるという意味になります。

    キャンセル

  • 2017/03/08 13:50

    http://php.net/manual/ja/about.php

    キャンセル

  • 2017/03/08 14:57

    PHPマニュアルのみどり色ってなにか意味があるのでしょうか。
    [PHPマニュアル](http://php.net/manual/ja/class.pdo.php)

    PDO {
    public __construct ( string $dsn [, string $username [, string $password [, array $options ]]] )
    public PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
    public PDOStatement query ( string $statement )
    }
    のPDOStatementがみどりいろになっています。

    キャンセル

  • 2017/03/08 14:59

    緑色って「color: #369;」の文字のところもこと?

    キャンセル

  • 2017/03/08 15:00

    つか、まじで、ここ読んでくださいな。
    http://php.net/manual/ja/about.prototypes.php

    キャンセル

  • 2017/03/08 15:21

    ありがとうございます。
    あとでよみます><

    キャンセル

  • 2017/03/08 15:22

    今あなたが色々な回答者にしている質問の回答が、リンク先にある。先に読んでください。

    キャンセル

  • 2017/03/08 15:25

    承知しました
    今クリックします
    25歳でこのレベルってまずいでしょうか。。

    キャンセル

  • 2017/03/08 15:26

    年齢じゃなくて経験年数の問題でしょ。

    キャンセル

  • 2017/03/08 15:31

    24歳で就職しました><

    キャンセル

  • 2017/03/08 15:35 編集

    経験年数1年なら、焦るほどではないと思う。決して早くはないと思うが。
    ただ、プログラミングの習得過程において、学習への取り組み方というか、アプローチがズレていると思う。今ここで、マニュアルの読み方を覚えるかどうかで、今後の学習スピードが大きく変わる岐路にあるように思います。
    これまでの質問回答のやり取りを見る限りでは、取り組み方を変えない限り、進歩は見込めない。

    キャンセル

  • 2017/03/08 17:05

    ありがとうございます。
    取り組み方をかえるべきなんですね。
    大変です><

    キャンセル

  • 2017/03/08 17:14

    そう言われて、「どのように取り組むべきか」を質問しないところが、やっぱりズレていると感じます。

    キャンセル

+5

メソッドが返すモノの性質が異なる為です。
$pdoは、PDOクラスを使ってDBにアクセスする準備が出来たというもの
$sqlは、SQL文を実行する準備が出来たというもの
$sqlはPDOクラスのインスタンスではなく、PDOStatementクラスのインスタンスです。
別のクラスのインスタンスなので、当然格納する変数は別にするのが普通ですよね。
PDO::prepare

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/08 13:25

    ご解答下さりありがとうございます
    PDOクラスとPDOStatementクラスの違いは何ですか。
    PDOStatementクラスは、PDOクラスの中にあるクラスがPDOStatementクラスでしょうか

    キャンセル

  • 2017/03/08 13:28

    すみません、質問の意味が分かりません。
    「PDOクラスの中にあるクラス」と言うのは、PDOクラスのメンバとしてPDOStatementが存在するのか、という意図ですか?

    キャンセル

  • 2017/03/08 13:30

    すみません
    PDOクラスの中にPDOStatementがあるのでしょうか

    キャンセル

  • 2017/03/08 13:38 編集

    PDOクラスのメンバとしてPDOStatementがあるのか、という問いでよければ、答えはYesです。
    (追記:この記述は誤りでした。が、会話の流れとして一応残しておきます。答えはNoが正解です)
    が、今回の元の質問を考えると、そこは正直どうでもいい事です。
    PDOクラスは、あくまでDBへの接続やトランザクションを管理するクラスであり、SQL文の実行に関してはPDOStatementが担当します。
    その為、仮にprepareせずに直接SQLをぶっこむPDO::query()メソッドを実行したとしても、結果セットはPDOStatementのインスタンスとして返ります。
    SQLを実行する事や、その結果を取得する事等を担当するのはPDOStatementの為、返答されるインスタンスはPDOStatementとなるわけです。

    キャンセル

  • 2017/03/08 13:39

    PHPのマニュアルを参照ください。
    PDOクラスの持つプロパティやメソッドも記載されています。
    http://php.net/manual/ja/class.pdo.php

    キャンセル

  • 2017/03/08 14:29

    ご返信下さりありがとうございます。
    PDOクラスのインスタンスである変数$pdoで、PDOクラスのprepareメソッドを$sqlに代入しているということでしょうか。

    キャンセル

  • 2017/03/08 14:31

    メソッドを代入しているのではなく、メソッドの返り値として得られたPDOStatementのインスタンスを格納しているわけです。

    キャンセル

  • 2017/03/08 14:33

    PDO {
    public __construct ( string $dsn [, string $username [, string $password [, array $options ]]] )
    public PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
    public PDOStatement query ( string $statement )
    }

    キャンセル

  • 2017/03/08 14:33 編集

    横から失礼します。

    > PDOクラスのメンバとしてPDOStatementがあるのか、という問いでよければ、答えはYesです。

    これは誤りです。

    PDOクラスは PDO::query()メソッドや PDO::prepare()メソッドの戻り値として
    PDOStatementクラスのインスタンスを返却しますが、
    それをプロパティとして保持しているわけではありません。

    PHPのマニュアルから、PDO クラスは一切のプロパティ(メンバのこと)を持っていないことが分かりますし、
    http://php.net/manual/ja/class.pdo.php

    var_dump() の結果も、それを示しています。

    ■ソースコード
     $db = new PDO("mysql:host=XXXXX;dbname=test", 'XXXXX', 'XXXXX');
     var_dump($db);

     $stmt = $db->prepare('select * from test');
     var_dump($db);

    ■実行結果
     object(PDO)#1 (0) {
     }
     object(PDO)#1 (0) {
     }

    キャンセル

  • 2017/03/08 14:39

    プロパティ=クラスのメンバ変数

    キャンセル

  • 2017/03/08 14:48

    >KiyoshiMotokiさん 失礼しました。ホントですね。
    PHPマニュアルのクラス概要のところで列記されているのをパッとみてプロパティと勘違いしておりました。
    ご指摘ありがとうございます。

    キャンセル

  • 2017/03/08 14:50

    public PDOStatement query ( string $statement )
    これはqueryメソッドですか。
    PDOStatementはなんですか。修飾子でしょうか。

    キャンセル

  • 2017/03/08 14:52

    PDOStatement型の返り値を持つ、queryというメソッドです。
    引数はstring型の$statementという変数に格納されます。

    キャンセル

  • 2017/03/08 15:01

    b

    キャンセル

  • 2017/03/08 15:20

    ありがとうございます。
    とても勉強になります。
    PDOStatement型なんてあるんでしょうか。
    型はint,object,float,stringなどの一般的な型しか認知しておりません。
    PDOStatement型がわからないです。

    キャンセル

  • 2017/03/08 15:30

    型=クラスと認識していただいて結構です。
    このあたりに話については、さすがにドキュメント等基礎情報をご確認ください。
    元の質問意図と乖離が大きくなっているように思いますので、同様の追加質問についてはお答えできかねる事をご理解下さい。
    http://php.net/manual/ja/language.oop5.basic.php

    キャンセル

+3

executeするまえにprepare処理を指定するためでしょうね
こまかくパタメータをbindする際の設定などできるので

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/08 13:30

    ???

    キャンセル

  • 2017/03/08 13:52

    SQL文をprepareでPDOステートメントとして変数に入れておかないと
    bindPramしてからexecuteできないでしょ?
    その辺が理解できていないなら、基本から学習すべきです

    キャンセル

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

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

関連した質問

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

  • PHP

    20330questions

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

  • SQL

    2390questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    700questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます