Help us understand the problem. What is going on with this article?

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'」とする。

tabo_purify
WEBに特化しています。 その他の言語は分かりません。 間違いを発見した方はご指摘くださいませ。
https://labo-iwasaki.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした