Slide 1

Slide 1 text

PDOの仕様 コレ知ってる? ~DAOクラスを作る~ 白栁隆司 2024年12月22日 PHPCon2024 大懇親会LT

Slide 2

Slide 2 text

自己紹介 エンジニアカウンセラー 白栁 隆司 Youtubeに動画投稿中! #ほぼ日ITエンジニアニュース(休止中) @IT 自分戦略研究所 エンジニアライフにて「コレがワタシの生きる様」連載中(金曜日) ITエンジニアが永く活動する為のサポート活動 主に4つのことを、ITエンジニアに勧めています 1. 傾聴ベース のコミュニケーション 2. メンタルヘルス (セルフケア) 3. セルフマネジメント 4. 日々の生活 の中からエンジニアリングを学ぶ

Slide 3

Slide 3 text

本日のお品書き 1. PDOって何? 2. 俺のDAOクラスの実装を見てくれ! 3. こんな仕様があったの!?

Slide 4

Slide 4 text

本日のお品書き 1. PDOって何? 2. 俺のDAOクラスの実装を見てくれ! 3. こんな仕様があったの!?

Slide 5

Slide 5 text

1. PDOって何? ※超☆ざっくり版 ● PHP Data Accerss Object ● PHPから各種DBへのデータアクセスを仲介するライブ ラリ ● LaravelもORMの先でPDOによるDBアクセス を行っている(はず)※しっかり読んでない

Slide 6

Slide 6 text

本日のお品書き 1. PDOって何? 2. 俺のDAOクラスの実装を見てくれ! 3. こんな仕様があったの!?

Slide 7

Slide 7 text

2. 俺のDAOクラスの実装を見てくれ! function Select($query, $param) {
 
 // SQL実行
 $statement = $this->dbo->prepare($query); // SQL文設定
 $statement->execute($param); // パラメータ設定
 $results = $statement->fetchAll(PDO::FETCH_ASSOC);
 
 return $results;
 }


Slide 8

Slide 8 text

2. 俺のDAOクラスの実装を見てくれ! どう思う? (by約5年前の俺)

Slide 9

Slide 9 text

2. 俺のDAOクラスの実装を見てくれ! まだまだ甘いなっ! (by 今の俺)

Slide 10

Slide 10 text

本日のお品書き 1. PDOって何? 2. 俺のDAOクラスの実装を見てくれ! 3. こんな仕様があったの!?

Slide 11

Slide 11 text

3. こんな仕様があったの?:振り返り function Select($query, $param) {
 
 // SQL実行
 $statement = $this->dbo->prepare($query); // SQL文設定
 $statement->execute($param); // パラメータ設定
 $results = $statement->fetchAll(PDO::FETCH_ASSOC);
 
 return $results;
 }


Slide 12

Slide 12 text

3. こんな仕様があったの?:評価 ● パラメータクエリ(プリペアードステートメント)を実装して いる → 最低限 ● 全体的に実数渡しをしているので、データが多い場合 にパフォーマンスが低下する(主に戻値) → リファレンス渡し(参照渡し)へ

Slide 13

Slide 13 text

3. こんな仕様があったの?:本題 ● 公式の「PDOStatement::execute」の記述に恐ろしいこ とが書いてあった ○ https://www.php.net/manual/ja/pdostatement.execute.php 注意: ドライバによっては、次のステートメントを実行する 前にカーソルを閉じ なければならないものもあります。

Slide 14

Slide 14 text

3. こんな仕様があったの?:本題 ● 公式の「PDOStatement::execute」の記述に恐ろしいこ とが書いてあった ○ https://www.php.net/manual/ja/pdostatement.execute.php ● 注意: ドライバによっては、次のステートメントを実行する前に カーソルを閉じ なければならないものもあります。

Slide 15

Slide 15 text

3. こんな仕様があったの?:本題 ● 公式の「PDOStatement::execute」の記述に恐ろしいこ とが書いてあった ○ https://www.php.net/manual/ja/pdostatement.execute.php ● 注意: ドライバによっては、次のステートメントを実行する前に カーソルを閉じ なければならないものもあります。

Slide 16

Slide 16 text

3. こんな仕様があったの?:改善案 function &Select($query, $param) {
 
 // SQL実行
 $statement = $this->dbo->prepare($query); // SQL文設定
 $statement->execute($param); // パラメータ設定
 $results = $statement->fetchAll(PDO::FETCH_ASSOC);
 $statement->closeCursor(); 
 
 return $results;
 }


Slide 17

Slide 17 text

まとめ. 正解はどこ? ● DAOクラスを自作する時には知っおくべき仕様 ● この実装が最適なのかは自身がない ○ 他のDAOクラスの実装探したが見つからない ○ 作成した時(約5年前)は自信満々! ○ 今の自分からはフルボッコ!!→ まだ不安

Slide 18

Slide 18 text

ご清聴ありがとうございました エンジニアカウンセラー 白栁隆司 @ShirayanagiRyuj DAOクラスの正しい実装を教えて下さいっ!!