LoginSignup
4
5

More than 5 years have passed since last update.

PHPでPDOクラスを使ってデータベースにデータを挿入する

Posted at

PHPでデータベースに接続するためにPDOを使います。

PDOとは?

PDOとは、データベースに接続するために用意されたクラスです。
データベースの接続に便利なメソッドがたくさんあります。

データベースに接続する

まずデータベースに接続してみます。

define('DSN','mysql:host=localhost;dbname=ホスト名;charset=utf8');
define('DB_USERNAME','ユーザー名');
define('DB_PASSWORD','パスワード');

try{
        $db = new \PDO(DSN, DB_USERNAME, DB_PASSWORD);
        $db ->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}catch(\PDOException $e){
        echo $e->getMessage();
        exit;
}

データベースにデータを挿入する

データベースにデータを挿入してみましょう。

$stmt = $db->query("select * from students_table")

これで、データベースからデータを読み出せたので、queryメソッドを使えば、SQL文を実行できそうです。

$stmt = $db -> query("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (".$count.",".$number.",'".$name."',".$age.",'".$remark."')");

文字列である\$nameと\$remarkは'で囲むことに注意しましょう。

これでもデータを挿入できました。

しかし、ネットで調べてみると、データ挿入時にはprepareメソッドとexecuteメソッドをセットで使っているコードが多くみられます。

exec、query、prepare、executeの違い

データベースを操作する時にこれらのメソッドをどのように使い分ければいいのでしょうか。

メソッド名 意味
exec SQLを複数行実行、作用した行数を返す
query SQL文を1行実行して、PDOStatementを返す
prepare SQL文の実行の準備をして、PDOStatementを返す
execute prepareで準備されたSQL文を実行する

queryとexec

select文を使ってデータベースの中身を見たいときは、execは行数を返すだけなので適していません。
queryメソッドが有効です。戻り値のPDOStatement$stmtにfetchメソッドをつかうことで、データを取得できます。

SQL文内に変数を割り当てる必要がなければ、insert文やdelete文もこの2つのメソッドで実行できます。

prepareとexecute

prepareとecxecuteメソッドは、SQL文内に、変数を割り当てたいときに適しています。

以下の例では、SQL文内で変数を展開するために、結合演算子.を利用しています。

$stmt = $db -> query("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (".$count.",".$number.",'".$name."',".$age.",'".$remark."')");

しかし、これではSQLインジェクションを防げません。

まずprepareでSQL文内で変数を展開したい場所を:名前で確保しておきます。
これをプレースホルダと言います。

 $stmt = $db -> prepare("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (:entry_id,:student_id,:student_name,:student_age,:remark)");

用意したプレースホルダに展開したい変数をbindValue、bindParamメソッドを使って指定します。

$stmt->bindValue(':entry_id', $count, PDO::PARAM_INT);
 $stmt->bindParam(':student_id', $number, PDO::PARAM_STR);
 $stmt->bindParam(':student_name', $name, PDO::PARAM_STR);
 $stmt->bindValue(':student_age', $age, PDO::PARAM_INT);
 $stmt->bindParam(':remark', $remark, PDO::PARAM_STR);

どこにどの変数を割り当てるのか決まったら、最後にexecuteメソッドを実行します。

 $stmt->execute();

これで変数名にSQL文の一部が入っていても、SQL文の実行に影響が出ずにすみます。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5