PHP入門 | PDOを使ったデータベースアクセス | PDOでテーブルデータを検索する

追加して一覧表示ができるようになったので、次は「検索」をしてみよう。検索は最初に行った「レコード一覧取得」と似ている。select * from テーブルで取得する。ただし、このままではすべてのレコードが取得されるため、条件を設定しなければならない。

"select * from テーブル where 条件"

テーブル名の後にwhereを付け、その後に条件を指定する。条件はカラム = 値のように、指定したカラムの値を指定する。等号や不等号を使って指定するのが一般的である。たとえば、sampletablename성진のデータを検索したいなら、次のようにする。

select * from sampletable where name = '성진'

それでは、前のindex.phpを修正して、名前を検索して表示してみよう。次のように例を修正する。

<?php
$result = "";
$query = "select * from sampletable";
if (isset($_POST['name'])){
    $fstr = $_POST['name'];
    if ($fstr != ''){
        $query .= " where name = '$fstr'";
    }
}
try {
    $pdo = new PDO("mysql:host=localhost:3306;dbname=mysampledata;charset=utf8", "root","1234");
    $statement = $pdo->query($query);
    while($record = $statement->fetch(PDO::FETCH_ASSOC)){
        $result .= "<tr>";
        foreach($record as $column){
            $result .= "<td>" . $column . "</td>";
        }
        $result .= "</tr>";
    }
} catch(PDOException $e){
    $result = "#ERR:" . $e->getMessage();
}
$pdo = null;
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
        <style>
        h1 { font-size:14pt;
            padding:5px;
            background-color:#AAFFFF; }
        table tr td {
            padding:5px;
            background-color:#DDFFCC; }
        </style>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <table>
        <form method="post" action="./index.php">
            <tr><td>検索文字列:</td><td><input type="text" name="name"></td></tr>
            <tr><td></td><td><input type="submit" value="送信"></td></tr>
        </form>
        </table>
        <hr>
        <table>
        <?php echo $result; ?>
        </table>
    </body>
</html>

今回は入力フィールドが1つだけのフォームが表示される。ここに検索する名前を書いて実行すると、その名前のレコードだけが表示される。

今回はまず$query = "select * from sampletable";のようにクエリを作成した。これはすべてのレコードを検索する。続いてif (isset($_POST['name']))として、$_POST['name']が存在するかどうかを確認する。値があれば、$query .= " where name = '$fstr'";のようにwhere句をクエリに追加し、条件文をクエリに含める。これでname$fstrである場合だけを探すようになる。

このとき、単語を正確に知らないと検索できないため、一般的には入力した一部の単語で検索する「あいまい検索」を行うことが多い。その場合はlikeという比較演算子を使う。これを使うと、検索テキストにワイルドカード(*)を利用できる。

where name like '원*'

たとえばwhere句をこのようにすると、nameの値がで始まるすべてのデータが検索される。