前回と似たアプローチ
類似記事
これに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してるのがポイントですね。
コメント