[PHP+SQL]単一カラムで複数ワード検索をする方法

はい。

類似記事

今回の内容

タイトルのとおりではあるのだけど。

今回はidを格納したカラムで複数のidを放り込んで該当記事一覧を出す感じ。

<?php
if(empty($_GET['searchword'])){
    $searchword = '';
}else{
    $searchword = $_GET['searchword'];
    $searchword = str_replace(" ", " ", $searchword);
    $searchword = str_replace(" ", ", ", $searchword);
    $where = "WHERE 【id用カラム名】 IN ({$words})";

    $pdo = new PDO('mysql:host=****;dbname=****;','****','****',[ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]);
    $stmt = $pdo->prepare("SELECT * FROM 【table名】 {$where}");
    $stmt->execute();
}
?>
<form action="search.php" method="get">
    <input type="search" name="searchword" value="<?php echo $searchword; ?>">
    <button type="submit"><span>検索</span></button>
</form>
<?php if(!empty($_GET['searchword'])){ ?>
<ul>
<?php
foreach ($stmt as $row) {
    echo '<li> '.$row['value']. '</li>';
}
?>
</ul>
<?php } ?>

一番重要なのはこの形を作ること。

$pdo->prepare("SELECT * FROM *** WHERE *** IN (***, ***, ***)");

検索時の区切りはスペースでやってるとして、使用者が入れたのが全角か半角かが分からない。突っぱねるのは親切じゃないので、今回は全角スペースを半角スペースに置換して統一、コード用にカンマ区切りに変更。

検索ワードの格納は気をつけること。数字の場合はベタ打ちでいける。

$pdo->prepare("SELECT * FROM *** WHERE *** IN (000, 111, 222)");

文字列の場合とかはこう。というか、こっちを基本としたほうがいいかもね。

$pdo->prepare("SELECT * FROM *** WHERE *** IN ('山田', '加藤', '足立')");

クォーテーションマークで囲うための命令を噛ませましょう。

例えばこう。

    $searchword = str_replace(" ", " ", $searchword);
    $searchword = str_replace(" ", "', '", $searchword);
    $searchword = "'".$searchword."'";

配列っぽく見えてるだけでただの文字列だから、まあ、こうなる。一旦配列に入れてしまってもいいような、でもなんか無駄な工程になるような。どうでしょうね。

コメント

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