• ベストアンサー

PDO学び始めました

プログラム初心者です PDO学び始めたのですがわからないとこがあります 質問1 名前付きプレースホルダの:nameの前についているコロンはなんですか? 変数なんでしょうか? 質問2 bindValueとbindParamがあるようですが普通につかう範囲では数値も文字もbindValueを使うだけでいいですか? 質問3 ユーザー入力のない値の場合はbindValueを使わずにprepareとexecuteのみでいいですか? 質問4 下記のように$nameの変数が後から登場しているのにエラーにならないのはなんでなんですか? $stmt = $pdo -> prepare("INSERT INTO テーブル名 (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name, PDO::PARAM_STR); $stmt->bindValue(':value', $value, PDO::PARAM_INT); $name = 'one'; $value = 1; $stmt->execute(); よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

以前にも何回も掲載しましたが一応もう一度貼っておきます。何回か更新した内容があるので良ければもう一度軽く目を通してみてください。 Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 【回答1】 変数のようなイメージで構いませんが、変数と決定的に違うのは、値を "後から" 割り当てることですね。 ・変数を埋め込んだ場合 →prepareのタイミングで値が割り当てられる ・プレースホルダを使い、prepare・bindValue・executeで実行した場合 →bindValueのタイミングで値が割り当てられる ・プレースホルダを使い、prepare・bindParam・executeで実行した場合 →executeのタイミングで値が割り当てられる(bindParamでは参照状態にするだけ) 【回答2】 疑問符プレースホルダの例で解説しますが、基本的には $stmt = $pdo->prepare('SELECT * FROM people WHERE name = ? AND age = ?'); $stmt->bindValue(1, $name, PDO::PARAM_STR); // PDO::PARAM_STRは省略可能 $stmt->bindValue(2, $age, PDO::PARAM_INT); $stmt->execute(); で構いません。但し、もしバインド内容がすべて文字列である場合は $stmt = $pdo->prepare('SELECT * FROM people WHERE name = ? AND age = ?'); $stmt->bindValue(1, $name); $stmt->bindValue(2, $age); $stmt->execute(); とする代わりに $stmt = $pdo->prepare('SELECT * FROM people WHERE name = ? AND age = ?'); $stmt->execute(array($name, $age)); のようにスッキリ書くことが出来ます。名前付きプレースホルダの場合は $stmt = $pdo->prepare('SELECT * FROM people WHERE name = ? AND age = ?'); $stmt->execute(compact('name', 'age')); でどうぞ。このあたりの説明もQiitaの記事と全部重複しているので、そちらを読んでもらえれば全部疑問も解決すると思いますが。「エミュレーション」にも注意してください。 【回答3】 ・結果をPDOStatementとして取得する場合 → $pdo->query() ・作用した行数だけが分かれば十分、もしくはそれすらも不要な場合 → $pdo->exec() 【回答4】 回答1に書いたことがこっちの答えになってると思います。bindParamは変数を参照状態にして割り当てるだけで、値の読み取りはexecuteするまで行われません。更にいうならば、参照状態にした時点で未定義の変数はNULLとしてエラーを出さずに初期化されるので、たとえ値の設定を行わなわなかったとしてもエラーが発生するわけではありません。 [Notice: undefined variable が発生する] function test($var) {  var_dump($var); } test($hogehoge); [Notice: undefined variable が発生しない] function test(&$var) {  var_dump($var); } test($hogehoge);

flash0
質問者

お礼

丁寧な回答ありがとうございます とてもわかりやすかったです コードもmysqliより短くできるので積極的に使っていきたいと思います

その他の回答 (1)

noname#244856
noname#244856
回答No.2

訂正 $stmt = $pdo->prepare('SELECT * FROM people WHERE name = :name AND age = :age'); $stmt->execute(compact('name', 'age'));

flash0
質問者

お礼

ありがとうございました

関連するQ&A

専門家に質問してみよう