PHP
Database

任意のテーブルからフリーワード検索する

PHPで動くフリーワード検索用の関数です

PG駆け出しの頃に構築したものを少し手直ししたものです。単一フリーワードに対応しています。工夫次第で、複数条件(or/and条件)に対応させたり、検索対象のカラムを絞ったりすることも可能です。また、オブジェクト化してもっとシンプルにできるとは思います(とくに変数周りがゴチャゴチャしていると思うので…)。

デリミタは便宜上に@@@としていますが、条件に適した値に任意、変更してください(要はデータ上で検索されることがない値であるかどうか)。

PHP
    require_once("free_word_search.php"); //プログラムが長いので、外部ファイル化
    $rows = freeWordSearch("検索文字");
free_word_search.php
        function freeWordSearch( $freeword){
                        Const TABLE = "任意のテーブル名";
                        Const BASE = "テーブルの主キー";
            $dbh = db_connect(); //データベース接続用の任意関数
            $ary_massWords = array(); //文字の羅列を格納する配列
            $ary_pickUpNum = array(); //検索に該当する文字を含む行番号の格納
            if( $freeword != ""  ){
                if($freeword != ""){
                    $ary_massWords = getMassWords( TABLE); //文字の羅列を取得する
                    $ary_pickUpNum = pickArraysIndex( $ary_massWords, $freeword); //該当の配列を抽出する
                }
                $max = count( $ary_pickUpNum);
                $sql = setSqlStatement( $max, TABLE, BASE); //in節を設けたSQL構文の作成
            }
            $sth = $dbh -> prepare($sql);
            $x = 1; //プレースホルダの変数
            $rows = array();
            foreach( $ary_pickUpNum as $num ){
                $sth -> bindValue($x, $num, PDO::PARAM_STR );
                $x++;
            }
            $sth -> execute();
            $rows = $sth -> fetchAll(PDO::FETCH_ASSOC);
            return $rows;
        }

        //文字の羅列を取得する
        function getMassWords( $table){
            $delimiter = "@@@";
            $dbh = db_con();
            $sql = "select * from {$table};";
            $matrixAr = array(); //行毎の文字の羅列を格納する配列
            $sth = $dbh -> query($sql);
            while($rows = $sth -> fetch(PDO::FETCH_NUM)){
                $wordbar = "";
                $wordbar = implode( $delimiter, $rows); //文字列に対し、デリミタを付してから羅列化する
                $matrixAr[] = $wordbar; //各羅列毎に、配列に格納
            }
            return $matrixAr;
        }

        //該当する配列を抽出する
        function pickArraysIndex($matrixAr,$free_word){
            $wordAr = array();
            $pickNumAr = array();
            $arLen = count($matrixAr);
            //var_dump($free_words);
            for ($i = 0 ; $i < $arLen ; $i++){
                //echo $free_words[$i];
                //フリーワードの検索→ヒットした羅列から、管理番号のみを抽出し、配列に格納する
                if(strstr($matrixAr[$i], $free_word) ){
                    $wordAr = explode("@@@",$matrixAr[$i]); //文字の羅列を配列に格納。
                    $pickNumAr[] = $wordAr[0]; //ベース番号のみを抽出し、その番号を配列に格納する
                }
            }
            return $pickNumAr;
        }

        //in節を設けたSQL構文の作成
        function setSqlStatement($numCnt, $table, $base){
            $sql = "select * from {$table}";
            //検索条件にヒットした行数
            if( $numCnt > 0){
                $numberBar = implode(",", array_fill(0, $numCnt,"?"));
                $sql .= " where {$base} in ({$numberBar})"; //in条件の付与
            }else{
                $sql .= " where {$base} is NULL"; //検索文字がヒットしない場合
            }
            //echo $sql;
            return $sql;
        }