ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【PHP】PDOでデータを挿入、bind

PDOでsqlを実行する手段

  1. exec():結果を返さない、安全なsql
  2. query():結果を返す、安全、何回も実行されないsql
  3. prepare():結果を返す、安全対策が必要、複数回実行されるsql
    悪意のあるコードの対策ができる。

prepareを使ってレコードを挿入

prepare
文を実行する準備を行い、文オブジェクトを返す。
返り値としてはPDOStatementオブジェクトを返す。

以下では$stmtという変数に格納している。

execute()
PDOStatementに実行すると、オブジェクトに結果が格納される。

?プレースホルダーでの記述

$stmt  = $db->prepare('insert into users (name,score) values (?,?)');
$stmt->execute(['suzuki',24]);
echo 'inserted:'.$db->lastInsertId();
引用
http://php.net/manual/ja/pdo.prepare.php

名前付きプレースホルダーでの記述

//データを挿入
$stmt  = $db->prepare('insert into users (name,score) values (:name,:score)');
$stmt->execute([':name'=>'takeuchi',':score'=>60]);

bindValue

bindValue
値をパラメータにバインドする。
http://php.net/manual/ja/pdostatement.bindvalue.php
binde バインド
AとBを結びつける。AをBに割り当てる。

http://wa3.i-3-i.info/word12448.html

ループなどで一部のデータだけ変えたい時に使える。

書き方

bindValue(parameter,value,data_type);
parameter
疑問符プレースホルダの時に入れる値は1から始まる。
value
挿入する値
data_type
定義済み定数を(http://php.net/manual/ja/pdo.constants.php)入れる
例)PARAM_STR,PARAM_INT,PARAM_BOOL,PARAM_NULL

例えばnameはそのままでscoreだけを毎回変えていきたい場合

//データを挿入
$stmt  = $db->prepare('insert into users (name,score) values (?,?)');
$name = 'yamada';
$stmt->bindValue(1,$name,PDO::PARAM_STR);
$score = 7;
$stmt->bindValue(2,$score,PDO::PARAM_INT);
$stmt->execute();
//数値だけを変えて新たに挿入
$score = 12;
$stmt->bindValue(2,$score,PDO::PARAM_INT);
$stmt->execute();
//挿入されたデータのidを引っ張てくる
echo 'inserted:'.$db->lastInsertId();

名前付きプレースホルダーの場合

//データを挿入
$stmt  = $db->prepare('insert into users (name,score) values (:name,:sore)');
$name = 'yamada';
$stmt->bindValue(':name',$name,PDO::PARAM_STR);
$score = 7;
$stmt->bindValue(':sore',$score,PDO::PARAM_INT);
$stmt->execute();
//数値だけを変えて新たに挿入
$score = 12;
$stmt->bindValue(':sore',$score,PDO::PARAM_INT);
$stmt->execute();
//挿入されたデータのidを引っ張てくる
echo 'inserted:'.$db->lastInsertId();

bindParam

bindparam
変数への参照をバインド
//データを挿入
$stmt  = $db->prepare('insert into users (name,score) values (?,?)');
$name = 'ma';
$stmt->bindvalue(1,$name,PDO::PARAM_STR);
$stmt->bindParam(2,$score,PDO::PARAM_INT);
$score = 32;
$stmt->execute();
//変数の値を変えてexecuteするだけで挿入できる
$score = 3;
$stmt->execute();

最初,bindParamで書く時、scoreだけ書いたら
「SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens」というエラーがでましたが、nameもバインドするよう記述したら正常に実行できました。バインドした数(number of bound)と例に記した数(number of tokens)が合わないよ、という意味みたいです。