![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
プログラム初心者です
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();
よろしくお願いします
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);
丁寧な回答ありがとうございます
とてもわかりやすかったです
コードもmysqliより短くできるので積極的に使っていきたいと思います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- MySQL addcslashesの使い方について教えてください。 DBに繋げてそこから、部分一致させたいのです 1 2023/04/14 22:59
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLインジェンクション対策法を...
-
このプログラムの改善点を教え...
-
PHP+MySQLの「データ...
-
functionとclassの使い分け
-
phpで読み込んだcsvが文字化け...
-
パラメータを2個つけたい
-
連想配列について
-
phpで変数を使ってcopyできない
-
C# 同じ処理をまとめたい
-
Fortranでのファイル名操作につ...
-
PHPで作成した2つのプログラム...
-
JSONデータ登録について
-
PHPの改変について
-
phpでランダムにページを表示
-
初心者です。入力フォームのp...
-
引数と変数について
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
PHPでURLにジャンプするには?
-
コンボボックス(プルダウン)...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
ファイル名を変更してアップロ...
-
アップロードファイル名の文字化け
-
PHPからHTMLへの変数の受け...
-
プログラミングC++のmapについて
-
phpで変数を使ってcopyできない
-
Flaskでサーバー立ち上げに関して
-
POSTの項目に追加
-
SQLインジェンクション対策法を...
-
パラメータを2個つけたい
-
サブフォルダ内の全てのテキス...
-
フォームで送られてきたメール...
-
PHP FTPサーバへの画像アップロ...
-
連想配列を複数条件で比較して...
-
name属性が全角の場合・・・
-
if function PHP
-
マクロ(VBA)について
-
PDOのprepareでLIKEの部分一致...
-
画像をDBに登録できない
-
php メールフォーム エラー表...
おすすめ情報