PDO⑧ SELECT文
今回は検索機能のサンプルを作成してみます。
■仕様
- IDによる検索ができるシステム
- フォームにIDを入力し検索ボタンを押すと、検索結果が表示される
- 検索結果がなかった場合は「検索結果はありません」と表示
■プログラム
search.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <?php if (isset( $_GET [ 'id' ])) { try { // 接続処理 $dsn = 'mysql:host=localhost;dbname=sample_db' ; $user = 'root' ; $password = '' ; $dbh = new PDO( $dsn , $user , $password ); // SELECT文を発行 $sql = "SELECT * FROM members WHERE id = :id" ; $stmt = $dbh ->prepare( $sql ); $stmt ->bindValue( ':id' , $_GET [ 'id' ], PDO::PARAM_INT); $stmt ->execute(); $member = $stmt ->fetch(PDO::FETCH_OBJ); // 全てのレコードを取得 // 接続切断 $dbh = null; } catch (PDOException $e ) { print $e ->getMessage() . "<br/>" ; die (); } } ?> <!DOCTYPE html> <html lang= "ja" > <head> <meta charset= "UTF-8" > <title>PDO SELECT文</title> </head> <body> <form action= "" method= "GET" > <div>検索したいIDを入力してください</div> <div> <input type= "text" name= "id" size= "3" value= "<?php isset($_GET['id']) ? print($_GET['id']) : print(" ") ?>" /> <button type= "submit" >検索</button> </div> </form> <?php if (isset( $_GET [ 'id' ])) { if ( $member ) { ?> <hr> <strong>検索結果</strong> <table> <tr> <th>ID : </th> <td><?php print ( $member ->id) ?></td> </tr> <tr> <th>名前 : </th> <td><?php print ( $member ->name) ?></td> </tr> <tr> <th>年齢 : </th> <td><?php print ( $member ->age) ?></td> </tr> <tr> <th>住所 : </th> <td><?php print ( $member ->address) ?></td> </tr> </table> <?php } else { ?> <hr> <div>検索結果はありません</div> <?php } } ?> </body> </html> |
■解説
まずポイントは16行目です。
1 | $member = $stmt ->fetch(PDO::FETCH_OBJ); // 全てのレコードを取得 |
IDによる検索のため、検索結果は0または1件です。したがってfetchAllではなくfetchを使用しています。
また、引数にPDO::FETCH_OBJを渡し、結果セットをオブジェクトとして取得しています。
続いて53、57、61、65行目。
1 2 3 4 | <td><?php print ( $member ->id) ?></td> <td><?php print ( $member ->name) ?></td> <td><?php print ( $member ->age) ?></td> <td><?php print ( $member ->age) ?></td> |
結果セットをオブジェクトとして取得したため、->(アロー演算子)を使用してプロパティを取得しています。
また46行目ではif文の条件に$memberを指定しています。
1 | if ( $member ) |
検索結果がない場合はfalseとなり、72行目の検索結果はありませんと出力されます。
■まとめ
- 結果セットが2件以上にならない場合はfetchメソッドを使用
- 結果セットが2件以上になる可能性がある場合はfetchAllメソッドを使用
- 結果セットをオブジェクトとして取得したい場合は、それぞれのメソッドの引数にPDO::FETCH_OBJを渡す