phpでDBを操作出来たら、やれる事が大幅に広がります。更にコードが簡素化できて綺麗になります。わかりやすくもなりますので是非phpでDBを操作できる様になりましょう!
今回はphpでDB操作する基本を押さえておきます。実際のコードを見ながら解説しますので比較しながら行ってください。
現在は下記の状態になっているものとします。
- DBやテーブルやカラムを作成している
- PDOにてDBに接続出来ている
- PDOのインスタンスを$dbという変数に格納しているものとする
自分のパソコンをDBにしています。上記3つのコードは下記になります。
<?php
try{
$DB_DATABASE = 'mydatabase';
$DB_USERNAME = 'root';
$DB_PASSWORD = '';
$DB_OPTION = 'charset=utf8';
$PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION;
$db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD,
[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
echo 'DB接続成功';
} catch(PDOException $e){
echo 'DB接続失敗';
}
?>
まだDBに接続していない方、DBに接続する方法がわからない方は、下記の「DBにアクセスする時の構文を理解する」を参考にしてください。
phpでDBの操作するには
まずはSQLの構文を変数に格納します。構文は下記です。
$変数 = $PDOインスタンスを格納した変数->メソッド("SQL文");
格納する変数を決めます。よく「$stmt」とします。今回もstmt(ステートメント)にします。
「$PDOインスタンスを格納した変数」は$dbとしています。
メソッドは2種類あります。
- prepare
- query
①prepareは条件とする値が変動する場合に使用します。
prepareメソッドを使用する場合の、流れは下記です。
- SQLの構文を変数に格納する
- 値をバインドする
- 実行する
- 取り出し方を決めて取り出し、配列に格納する
- 配列から取り出し、表示する
② query は条件とする値が変動しない場合に使用します。
queryメソッドを使用する場合の、流れは下記です。
- SQLの構文を変数に格納する
値をバインドする実行する- 取り出し方を決めて取り出し、配列に格納する
- 配列から取り出し、表示する
②と③の工程はなくなります。queryは値が変更しない場合なので②の値をバインドする必要がありません。
更に「query」メソッドだけで実行もしてくれる為、③の工程もありません。
①prepareで条件が変動する構文で、DBから値抽出
今回はSQLインジェクションのセキュリティ対策にもなりますので、「prepare」を使用します。
$stmt = $db->prepare("SQL文");
あとはSQL文だけです。SQLのメソッドは複数ありますが、よく使用されるメソッドは下記の4つです。
- DBの値を取得するselect
- DBの値を変更するupdate
- DBの値を追記するinsert
- DBの値を消すdelete
このSQLの文によってDBから値を取得したり、DBを変更したりできます。
DBの値を変更するupdate
DBの値を追記するinsert
DBの値を消すdelete
DBから値を抽出するselect
ここでは値を取得する「select」を使用します。
SQLのselect構文の詳しい記事は、select文でDBの値を取得する!の記事を参照してください。
mydatabaseに接続しています。そのDBの中に「users」テーブルを作成しています。詳細は下記です。
id | name | score |
---|---|---|
1 | user_1 | 47 |
2 | user_2 | 24 |
nameの値が変数で、scoreの値を取得するとします。するとSQL文は下記になります。
select score from users where name=?;
詳しくは下記の「PDOのprepareとqueryでSQL文を変数に格納する」の記事を参考にしてください。
SQL文も完成しましたので、先程のphpと合わせます。最終的にコードは下記になります。
$stmt = $db->prepare("select score from users where name=?");
これでSQLの構文を変数に格納できました。
値をバインドする
- SQLの構文を変数に格納する
- 値をバインドする←次はこの工程
- 実行する
- 取り出し方を決めて取り出し、配列に格納する
- 配列から取り出し、表示する
先程のSQLの「?」の部分の値を決めます。構文は下記です。
$stmt->bindValue(id,'値',定数);
再程の変数$stmtから->bindValueメソッドを呼び出しています。()の中身は下記です。
- id:パラメータIDを指定します・・・「?」が複数ある場合の番号、1つしかなければ1確定
- 値:実際に入る値を指定します・・・「?」に入る値
- オプション:データの型を指定可能です・・・下記
定数はデータ型を指定できます。種類は下記です。
- PDO::PARAM_STR ・・・デフォルトで文字列型
- PDO::PARAM_INT ・・・数値型
- PDO::PARAM_BOOL ・・・BOOLERN型
- PDO::PARAM_NULL ・・・NULL型
- ・・・・などなど
prepareやbindに関して、もっと詳しく知りたい方は、「PDOのprepareとqueryでSQL文を変数に格納する」の記事を参照してください。
以上を踏まえて、今回のコードは下記になりました。
$stmt->bindValue(1,'user_1',PDO::PARAM_STR);
「?」が一つしかないので、idは1
今回はカラム「name」が「user_1」の値の取得
「user_1」なので文字列型を指定して、バインドしようと思います。つまりPDO::PARAM_STRを指定します。
実行します
- SQLの構文を変数に格納する
- 値をバインドする
- 実行する←次はこの工程
- 取り出し方を決めて取り出し、配列に格納する
- 配列から取り出し、表示する
実行する為の、基礎構文は下記です。
$stmt->execute();
これで実行できました。
取り出し方を決めて取り出し、配列に格納する
- SQLの構文を変数に格納する
- 値をバインドする
- 実行する
- 取り出し方を決めて取り出し、配列に格納する←次はこの工程
- 配列から取り出し、表示する
実行したものから、値を取得しましょう。
構文は下記です。
$配列 = $変数->メソッド(オプション);
- $配列:抽出した値は配列に入ります。
- $変数:先程の変数
- メソッド:(fetch | fetchAll)
- オプション:下記に示す
オプションは下記があります。
- PDO::FETCH_BOTH ・・・デフォルト
- PDO::FETCH_ASSOC
- PDO::FETCH_NUM
- PDO::FETCH_KEY_PAIR
- PDO::FETCH_COLUMN
④ 取り出し方を決めて取り出し、配列に格納するについて詳しく知りたい方は「PDOのfetchやfetchAllで値を抽出する」の記事を参照してください。
今回は下記コードにします。
$username = $stmt->fetch(PDO::FETCH_BOTH);
- usernameという配列に格納します。
- fetchで適応する最初の1つを取り出します
- 定数でPDO::FETCH_BOTHを指定します。
SQLでDBの値を表示する。
最後の工程です。
- SQLの構文を変数に格納する
- 値をバインドする
- 実行する
- 取り出し方を決めて取り出し、配列に格納する
- 配列から取り出し、表示する←次はこの工程
④で配列に格納した値を見てみます。
print_r($username);を追記して、ページにアクセスしてみます。
<?php
try{
$DB_DATABASE = 'mydatabase';
$DB_USERNAME = 'root';
$DB_PASSWORD = '';
$DB_OPTION = 'charset=utf8';
$PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
$db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
echo 'DB接続成功</br>';
$stmt = $db->prepare("select name from users where score=?");
$stmt->bindValue(1,44,PDO::PARAM_INT);
$stmt->execute();
$username = $stmt->fetch(PDO::FETCH_BOTH);
print_r($username);
} catch(PDOException $e){
echo 'DB接続失敗';
}
?>
DB接続成功
Array ( [name] => user_3 [0] => user_3 )
- 配列にKeyがname、値がuser_3が入っています
- 配列の0番目にuser_3の値が入っています
fetch(PDO::FETCH_BOTH)だとこのような配列を取得するのでした。
では配列から値を表示してみます。下記を追記して、ページにアクセスします。
echo $username["name"] ."と" . $username[0];
- 変数からKeyがnameの値を取り出しています
- 間に「と」をくっつける為に「.”と”.」を入力しています
- 変数から0番目の値を取り出しています
<?php
try{
$DB_DATABASE = 'mydatabase';
$DB_USERNAME = 'root';
$DB_PASSWORD = '';
$DB_OPTION = 'charset=utf8';
$PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
$db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
echo 'DB接続成功</br>';
$stmt = $db->prepare("select name from users where score=?");
$stmt->bindValue(1,44,PDO::PARAM_INT);
$stmt->execute();
$username = $stmt->fetch(PDO::FETCH_BOTH);
echo $username["name"] ."と" . $username[0];
} catch(PDOException $e){
echo 'DB接続失敗';
}
?>
結果は下記になりました。
DB接続成功
user_3とuser_3
②queryで条件が固定の構文で、DBから値抽出
queryの工程は下記でした。
- SQLの構文を変数に格納する
値をバインドする実行する- 取り出し方を決めて取り出し、配列に格納する
- 配列から取り出し、表示する
②queryは条件の値が同じ場合に使用します。値が変動しないので②値をバインドする必要がありません
③query自体実行してくれますので実行をする必要がありません。
SQL文はそのままSQL文を文字列で記入します。
コードは下記になります。
<?php
try{
$DB_DATABASE = 'mydatabase';
$DB_USERNAME = 'root';
$DB_PASSWORD = '';
$DB_OPTION = 'charset=utf8';
$PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
$db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
echo 'DB接続成功</br>';
$stmt = $db->query("select name from users where score=44");
$username = $stmt->fetch(PDO::FETCH_BOTH);
echo $username["name"] ."と" . $username[0];
} catch(PDOException $e){
echo 'DB接続失敗';
}
?>
- prepareをqueryに変更しています
- ②③の工程がないので、bindとexecuteの行が無くなっています
これでページにアクセスしてみます。
DB接続成功
user_3とuser_3
先程と同じ結果になりました。
スキルアップするにはプログラミングスクールもオススメです。
DBの操作!データベースの値を取得して表示する方法のまとめ
DBの値を取得するにはprepareとqueryを使用する。
- 条件が変動するので、使いまわし可能
- SQLと変動する値が別々の構文なので、SQLインジェクション対策になる
- 値のbindと実行が必要で手間がかかる
- 条件が変動しないので、使いまわしできない
- 1文で実行まで行うので、手間がかからない
- 1文のSQLなので、SQLインジェクションに注意が必要
fetchでDBの取得した値を配列に入れる。
配列から値を表示して完了。
難しいですが、頑張って学習していきましょう。