【PHP】PHPとMySQLを接続してデータを取得、更新する具体的な流れ
PHPとMySQLを接続してデータを取得、更新する具体的な流れを紹介します。
PHPとMySQLを接続してデータを取得する具体的な流れ
// データベースから値を取得
$user = 'ユーザー名';
$pwd = 'パスワード';
$host = 'localhostなど';
$dbname = 'データベース名';
// dsnは以下の形でどのデータベースかを指定する
$dsn = "mysql:host={$host};port=8889;dbname={$dbname};";
// PDOでデータベースのコネクションを生成
// 第一引数dsn, 第二引数user, 第三引数password
// newでインスタンス化して使う
$conn = new PDO($dsn, $user, $pwd);
// $dsnでdbnameを指定しているのでdb名は省略できる
// 右コマンドで実行されるのでそれを変数に格納する $conn->query('select * from テーブル名');
$pst = $conn->query('select * from テーブル名');
// 実行結果を取得する(連想配列と配列データが被って出力される)
// $result = $pst->fetchAll();
// fetchAll()だけだと被ったデータがでるので連想配列のみに絞る
$result = $pst->fetchAll(PDO::FETCH_ASSOC);
// preタグで囲んで見やすく出力する
echo '<pre>';
print_r($result);
echo '</pre>';
// データ取得後は、コネクションを破棄する
// PDOは以下は書かなくてもいいけど、プログラムによっては必要なので癖付ける
$conn = null;
データベース接続に必要な情報を記述
まず、データベース接続に必要な情報を記載します。
- ユーザー名
- パスワード
- ホスト名
- データベース名
上の変数に指定し、dsnを設定します。
具体的な書き方は上の通りで、mysqlをコンマで接続して、ホスト名、ポート番号、データベース名とします。
ポート番号も変数で管理してもいいです。
PDOでコネクションを生成
その次に、PDOでデータベースとのコネクションを生成します。
PDOは、3つの引数をとります。第一引数dsn, 第二引数user, 第三引数passwordとなります。
それをインスタンス化して使います。
コネクションを生成なので、$connなどコネクションとわかる変数に格納します。
query()でSQLを実行
PDOのメソッドでquery()にsqlの文を書くことであらゆることが可能になります。
上では普通にSQLを書けばいいです。
SQLの書き方については、データベース基礎知識を参照してみてください。
連想配列のみを出力
query()の実行で生成されたオブジェクトは、fetchAll()が使えます。
fetchAll()で実行結果を取得することができます。
そのまま引数を渡さずに実行すると、連想配列と配列が混ざった情報が出るため、連想配列に絞って結果を取得します。(PDO::FETCH_ASSOC)
fetchAllとfetch
fetchAllは複数行を取得します。1つでも配列になっています。
fetchは1つだけ取得します。
データを表示したいときは以下のようにします。
$p_id = $conn->query("
select id from mst_products mp
where mp.name = '椅子'
");
// fetchAllのとき
var_dump($p_id->fetchAll()[0]['id']);
// fetchのとき
var_dump($p_id->fetch()['id']);
結果を確認する
結果を確認するniha,
print_rなどで結果を出力します。
preタグで囲むと見やすくなります。
コネクションを破棄する
コネクションの変数にnullを設定することでコネクションを破棄することができます。
PDOの場合は不要なのですが、他のものの場合は、破棄しないと接続がどんどん増えてしまうため、破棄する癖付けのためにもコネクションが終わったらnullを設定してコネクションを破棄するか、このようなことが必要とおぼえておきましょう。
デフォルトのフェッチモードを指定する
// newでインスタンス化して使う
$conn = new PDO($dsn, $user, $pwd);
// デフォルトのフェッチモードを指定する
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// SQLを実行
$pst = $conn->query('select * from テーブル名');
// 上で指定したフェッチモードで実行結果を取得できる
$result = $pst->fetchAll();
上のように、setAttribute()を使うことでPDOのデフォルトのフェッチモードを設定することができます。
デフォルトを設定したら、fetchAll()のを記載したときに、指定したフェッチモードでデータが取れるようになります。
データを更新する
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// ここより上は同じ
$result = $conn->exec('update テーブル名 set name = "値" where id = 2');
// ここより下は同じ
更新するには、exec()を使用します。
このexec()の結果を表示すると1とか0とか数字が表示されます。
その数字は、上のSQLの実行で影響を受けた行数となります。
0なら影響ないということです。
SQLが正しいかどうかの確認方法
-- SQLが正しいかどうかの確認方法
start transaction;
-- SQLを書く
rollback;
SQLが正しいかどうかの確認するためには、
DBeaverのようなSQLクライアントにクエリを流して、rollbackする方法があります。
その際、トランザクションをスタートして、SQLを実行して、中身を確認します。
その後rollbackします。
SQLインジェクション
SQLインジェクションは、意図しないSQLをフォームなどから流し込まれることをいいます。
データが改ざんされたり、削除されてしまう可能性があります。
上で紹介しているquery()や、exec()に関してはSQLインジェクションを防ぐことができません。
SQLインジェクションを防ぐためには、prepare()を使います。
prepare()の使い方は、SQLインジェクションを防ぐためのprepare()の使い方を参考にしてみてください。