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文の実行に影響が出ずにすみます。