[php+sql]複数カラムに対して複数ワードを指定件数検索する方法

前回と似たアプローチ

類似記事

これにLIMITとOFFSETをつける場合。

単純にSQL文を追記してもダメだった。

こんな感じ

    //検索ワード(スペース区切り対応)を拾って指定カラムで照合
    $searchword = $_GET['searchword'];
    if(empty($searchword)){
        //空だったらWHEREを入れない(=変数内を無にする)
        $sqlWhere = '';
    }else{
        //検索ワードがあればWHEREをぶち込む
        $searchword= str_replace(" ", " ", $searchword);
        $searchword_array = preg_split("/[ ]+/",$searchword);
        foreach( $searchword_array as $row ){
            if ($row === reset($searchword_array)) {
                $sqlWhere = "WHERE 1";
            }
            $sqlWhere .= " AND ( column1 LIKE '%{$row}%'
                            OR column2 LIKE '%{$row}%'
                            OR column3 LIKE '%{$row}%'
                            OR column4 LIKE '%{$row}%'
                            OR column5 LIKE '%{$row}%'
                                ︙
                            OR column99 LIKE '%{$row}%')";
        }
    }
    $numLimit = 10;    //10件取得
    $numOffset = 10;    //該当データの11件目から取得(=10件目までスキップ)

    $sql = "SELECT * FROM 【テーブル名】 {$sqlWhere} LIMIT {$numLimit} OFFSET {$numOffset}";
    $stmt = $dbh->prepare($sql);
    $stmt->execute();

pdo($dbh)は省略。

今回詰まったのはWHEREのところ。

以前の記事でconcat()を使えば対応できてたんだけど、LIMITを混ぜると通用しなかった。

ついでにいうと「LIMIT 1,10」の書き方でもいいんだけど、やってる最中に通らないことがあったのでOFFSETを使った。やりたいことは同じだからいいんだけど。

LIMIT周りの話

ページャー的なものをやる場合、OFFSETはこんな感じで組むといい。

    $numLimit = 10;
    $page = $_GET['page'];
    if(isset($page)){
        $numOffset = (intval($page) - 1) * $numLimit;
    }else{
        $numOffset = 0;
    }

パラメータでページ送りを管理する(?page=2みたいな)として、この書き方だと1ページ目に出力するのは1~10番目、2ページ目に出力するのは11~20番目になる。ページ数を-1してるのがポイントですね。

コメント

タイトルとURLをコピーしました