Edited at

PDOでINSERTする(PHPでMySQLにデータ挿入)

More than 3 years have passed since last update.

今回はPDOプリペアドステートメントでMySQLにデータをINSERTします。

前回は接続とSELECTをまとめたので、良かったら読んでください。

「まだそんなトコやってんのかよ」とか言わないでください。

要領悪いからひとつずつまとめていかないと進めないタイプです。

ここがメイン ▶︎ LABO IWASAKI 「PDOで色々やる」

logo-qiita.png半泣きで覚書 by Takayoshi.Iwasaki

目次
内容など

PDOの説明と、接続、SELECT

前回のページで説明してます。プリペアドステートメントも

コードのまとめ

こっちのページで書いてます。

PDOでINSERT
MySQLにデータを挿入します。prepareとqueryの違い

PDO::PARAM_STRやINT
指定すると型が変わります。

bindParamとbindValue
ちょっとした違いの説明。

間違いやすいところ
自分がよく書き間違えたポイント


INSERTするぞ。

●$pdo でデータベースに接続してます。(前回をご覧ください)

●$stmt は変数名なので何でもイイようです。


INSERT

$stmt = $pdo -> prepare("INSERT INTO テーブル名 (name, value) VALUES (:name, :value)");

$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':value', $value, PDO::PARAM_INT);
$stmt->execute();


prepare

ここでSQLを準備します。

テーブル名(name,value)のそれぞれに対して VALUES (:name, :value) のように

:name と :value というパラメータを与えています。

ここの値が変わっても何回でもこのSQLを使えるようになっています。


$stmt -> bindParam

ここで、:name とかのパラメータに値を入れてます。

bind には bindParam と bindValue の2種類があります。

まず bindParam ですが、こいつは (':name', $name, PDO::PARAM_STR) のように、一個目で :name のようにさっき与えたパラメータを指定。

2個目に、それに入れる変数を指定します。bindParam には直接数値を入れれない。変数のみです。

3個目で型を指定。PDO::PARAM_STR は「文字列だよ」って事。


$stmt -> bindValue

これは Param と違って2個目のパラメータに入れる値の所に、変数だけじゃなくて数値も入れれる。

$stmt->bindValue(':value', 3, PDO::PARAM_INT) みたいな感じでもOKって事。

3個目の型は指定しないとダメです。PDO::PARAM_INTは「数値だぜ」っていう意味。

もちろん PDO::PARAM_STR にすると文字列って事になる。まぁ文字列の場合は bindParam を使うべきだけど。


bindValue と bindParam

bindValueは値をバインドします。

bindParamは変数をバインドします。評価は実行時です。

なので、bindParam(':name', $name, PDO::PARAM_STR)の前に$nameという変数があっても、bindParam(':name', $name, PDO::PARAM_STR)の後、executeの手前で$nameの中身を変えるとそれが反映されます。


-> execute

execute は、命令などを「実行する」「遂行する」って意味。

つまり、prepare で用意したSQLをここでデータベースにINSERTしてる。

これを書かないと実行されない。(たまに書き忘れて「あれ?」ってなる)


注意

前回でてきた query ってのがあったけど、今回みたいに $pdo -> prepare の所を間違って query にしちゃうと全然意図した動作をしないので注意。

query はそのまま実行しちゃう。prepare は後で execute が必要。

●パラメータは(:name, :value) のように「'」はいらない。

●bindParamなどでパラメータを指定する時は(':name', $name) のように「':name'」とする。