2023年8月4日金曜日

PHPの学習ノート②-DB接続の方法まとめ


こんにちは、せんです。

PHPの学習ノート第2回です。

 

前回の記事:環境構築


第2回はDB接続です。 

定番のPDOを含む合計4種類の方法について、簡単な使い方と使ってみた感想を記録します。 

※DBはPostgreSQLを使用

※この記事ではphp.iniの編集など、細かい説明を省略しています。


①PostgreSQL関数を使用する。


PHPのライブラリから提供される、pg_connect、pg_query、pg_fetch_allといった関数です。

PostgreSQL以外のDBについても、mysqli_connect、oci_executeなどが用意されており、使うDBに対応したメソッドを使います。


基本の書き方はこんな感じ。

引数にSQLを直接書くスタイルです。


$conn = pg_connect("host=localhost port=5432 dbname=testdb user=postgres password=***");
$result = pg_query($conn, "select * from books");
while ($row = pg_fetch_row($result)) {
    echo "id:$row[0] title:$row[1] writer:$row[2]<br/>";
}
pg_close($conn);


②PDOを使用する。


PostgreSQL関数を1番に持ってきましたが、検索するとPDOに関する記事が最も多く、現在最も定番の方法のようです。

PDOとは「PHP Data Objects」の略。

PHP5.1から使えます。


「PDOのメリット=共通のメソッドを使用するのでDBを変更しても修正が楽」という説明が非常に多いのですが、

それでは決め手にならないんじゃないか…と思うので、ほかの違いも見てみましょう。

基本の書き方はこんな感じです。

こちらも引数に直接SQLを書きます。

PDOクラスのオブジェクトを生成して接続します。


try {
    $dbh = new PDO('pgsql:dbname=testdb host=localhost port=5432 user=postgres password=***');
    $sql = 'select * from books';
    foreach ($dbh->query($sql) as $row) {
        print "id:$row[0] title:$row[1] writer:$row[2]<br/>";
    }
} catch (PDOException $e) {
    print('Error:' . $e->getMessage());
    die();
}
$dbh = null;


例外はPDOExceptionとしてキャッチされるので、try-catchで書けます。 基本は上の通りです。

PDOについて調べると、プリペアドステートメントを使用した書き方も登場します。

INSERT処理を見てみましょう。


$sql = "insert into books (title, writer) values (:title, :writer)";
$stmt = $pdo->prepare($sql);
$params = array(':title' => '赤毛のアン', ':writer' => 'モンゴメリ');
$stmt->execute($params);


values句で、あとから値をセットするプレースホルダ(:〇〇)を使っています。

SQLインジェクション対策として「PDO+プリペアドステートメント+プレースホルダ」は頻出のセットですが

PostgreSQL関数にもpg_query_paramsという関数があり、これを使えば同じことができそうです。

PHP公式ドキュメント

MySQLの場合はmysqliクラスを使ってPDOと同じように書く方法もあります。


③Idiormを使用する。


オブジェクトを操作するようにDBを操作するORMのライブラリです。

ORMなどのキーワードを追加して初めて検索結果に出てくるレベルです。

2011年に登場しました。

idiorm.phpの1ファイルを追加するだけなので、フレームワークを使用するより簡単かつ軽量に実装できる選択肢です。

公式ドキュメント

簡単な使用例はこちら。 SQLは書きません。


require_once('../idiorm.php');
ORM::configure('pgsql:dbname=testdb host=localhost port=5432');
ORM::configure('username','postgres');
ORM::configure('password','***');

$books = ORM::for_table('books')->find_many();
foreach ($books as $book) {
    echo $book->title . '</br>';
}

$newBook = ORM::for_table('book')->create();
$newBook->title = '長くつしたのピッピ';
$newBook->writer = 'リンドグレーン';
$newBook->save();


④のフレームワークと比べるとはるかに簡単に使えますが、 

複雑なクエリを実行する場合はraw_queryメソッドの引数に直接SQLを指定することになります。


④Laravelなどのフレームワークを使用する。


LaravelをはじめとしたPHPのメジャーなフレームワークには、もれなくORMが含まれています。

クエリビルダでDB操作を行うこともできますが、 ここではLaravelのORMであるEloquentの基本的なメソッドを見てみましょう。


$allBooks = Book::all();
foreach($allBooks as $book){
    echo $book->title;
}

$newBook = Book::create([
    'title' => '若草物語',
    'writer' => 'オルコット'
    ]);
    
$updateBook = Book::findOrFail(1);
$updateBook->title = 'Anne of Green Gables';

$deleteBook = Book::findOrFail(2);
$deleteBook->delete();

このコードはControllerクラスに書かれます。BookはMVCのモデルです。

createメソッドで配列を入れるあたりは見た目にも分かりやすいです。

ただ、ここまで来るまでが長いので、しっかり勉強してから使いたいです。


まとめ


DB接続について検索すると、体感8割くらいがPDOに関する記事です。

それに乗ってPDOを使うにしても、ほかの方法についていくらか知っておきたいものです。


すでに使用するフレームワークが決まっている場合はその機能を活かしたいですが、

そうでなければ①から③で選ぶことになるでしょう。


この記事が方法選択のとっかかりになれば幸いです。

ご覧いただいてありがとうございました。

0 件のコメント:

コメントを投稿