PHP

【PHP】SQLiteのデータを取得(検索)する方法

PHPでSQLiteを検索する方法について記述します。
入力フォームの値を取得しSQL文を発行して検索する簡単な仕組みにしております。
また今回は、前方・部分・後方・完全一致の条件で検索できるようにもしております。

動作確認に使用したSQLiteには下図のデータが登録されています。

SQLiteのデータを取得(検索)するソースコード

<?php
    require_once('common.php');

    $query = "";
    if(isset($_POST['condition'])){
        if($_POST['search_word'] !== ""){
            switch ($_POST['condition']) {
                case 0:
                    $query .= 'AND ID like "' . $_POST['search_word'] . '%" OR NAME like "' . $_POST['search_word'] . '%" OR AGE like "' . $_POST['search_word'] . '%"';
                    break;
                case 1:
                    $query .= 'AND ID like "%' . $_POST['search_word'] . '%" OR NAME like "%' . $_POST['search_word'] . '%" OR AGE like "%' . $_POST['search_word'] . '%"';
                    break;
                case 2:
                    $query .= 'AND ID like "%' . $_POST['search_word'] . '" OR NAME like "%' . $_POST['search_word'] . '" OR AGE like "%' . $_POST['search_word'] . '"';
                    break;
                case 3:
                    $query .= 'AND ID = "' . $_POST['search_word'] . '" OR NAME = "' . $_POST['search_word'] . '" OR AGE = "' . $_POST['search_word'] . '"';
                    break;
            }
        }
    }
    $result = sqlite($query);

    $conditions = [
        ['value' => '0', 'text' => '前方一致'],
        ['value' => '1', 'text' => '部分一致'],
        ['value' => '2', 'text' => '後方一致'],
        ['value' => '3', 'text' => '完全一致'],
    ];
?>

<html>
    <head>
        <!-- CSS -->
        <link rel="stylesheet" href="common.css">
    </head>
    <body>
        <form name="character_search" id="form" method="post" action="">
            <h2>SQLiteファイルを任意の条件で検索する</h2>
            <select name="condition">
                <?php
                    foreach($conditions as $row){
                        if($_POST['condition'] == $row['value']){
                            echo '<option value="' . $row['value'] . '" selected>' . $row['text'] . '</option>';
                        } else {
                            echo '<option value="' . $row['value'] . '">' . $row['text'] . '</option>';
                        }
                    }
                ?>
            </select>
            <input type="text" name="search_word" value="<?php if(isset($_POST['search_word'])) echo $_POST['search_word']; ?>">
            <input type="submit" name="search" value="検索" class="">

            <!-- 結果判定 -->
            <?php if(!empty($result)){ ?>
            <table class="c-table">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>名前</th>
                        <th>年齢</th>
                    </tr>
                </thead>
                <tbody>
                <?php
                    foreach ($result as $row) {
                        $html = "<tr>";
                        $html .= "<td style='width:50px;'>" . $row["id"] . "</td>";
                        $html .= "<td style='width:200px; padding-left:10px;'>" . $row["name"] . "</td>";
                        $html .= "<td style='width:50px;'>" . $row["age"] . "</td>";
                        $html .= "</tr>";
                        echo $html;
                    }
                ?>
                </tbody>
            </table>
            <?php } else { ?>
            <p>検索結果なし...</p>
            <?php } ?>
        </form>
    </body>
</html>
<?php

/**
 * SQLite検索処理
 * @param query SQL
 * return HTML
 */
function sqlite($query)
{
    $db = new SQLite3("./db/Characters.sqlite3");
    // SQL文作成
    $sql = "SELECT * FROM characters WHERE 1=1 " . $query . ";";
    // SQL実行
    $results = $db->query($sql);
    // 戻り値用のリスト
    $characterData = array();
    $i = 0;
    if ($results) {
        while ($rows = $results->fetchArray(SQLITE3_ASSOC)) {
            $characterData[$i]['id'] = $rows['ID'];
            $characterData[$i]['name'] = $rows['NAME'];
            $characterData[$i]['age'] = $rows['AGE'];
            $i++;
        }
    } else {
        // 結果が空の場合の処理
    }
    $db->close();
    return $characterData;
}

?>
.c-table{
    margin-top: 1rem;
    border: 1px solid #000;
}

.c-table thead tr th{
    background-color: #222831;
    color: #fff;
}




出力結果

▼初期表示

▼前方一致検索の場合

▼部分一致検索の場合

▼後方一致検索の場合

▼完全一致検索の場合

説明は以上となります。
この記事が誰かの助けになれば幸いです。