【PHP】PHPとMySQLを接続してデータを取得、更新する具体的な流れ

PHP

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()の使い方を参考にしてみてください。

PHP

Posted by devsakaso