jankenpon0205
@jankenpon0205 (002 ruru)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

部分一致検索を実装したい。

Q&A

Closed

解決したいこと

部分一致検索を実装したいのですが、構築が分かりません。「」の上に構築したのですが、場所が違うのでしょうか?
もしくは、中の文が違うのでしょうか?
どなたか教えてください。

0

2Answer

「」の上がどこかわかりませんので?

私ならSQLで絞り込みます。

mariaDB
SELECT * FROM users where address regexp '^[0-9¥-]*'

postgreSQL
SELECT * FROM users where address ~ '^[0-9¥-]*'

mongoDB
db.users.find({address : {$regex: /^[0-9¥-]*/}})

補足
コード内で用いる場合、¥'^[0-9¥¥-]*¥'のようにエスケープする必要があるかも知れません。

1Like

Comments

  1. @jankenpon0205

    Questioner

    申し訳ございません。
    「」の中は!DOCTYPE htmlのことです。
    ありがとうございます。

記載のコードを見ると混乱が見て取れるのですが、残念ながらその疑問を丁寧に解きほぐせるような場ではないので、おそらく十分な回答にはならないと思います。

// 1. 問い合わせの内容
$sql = "SELECT * FROM users ORDER BY id ASC;";

// 2. 問い合わせの実行
$stmt = $db->query($sql);

// 3. 問い合わせ実行結果の取得
$result = $stmt->fetchAll();

これはデータベースに対して検索して結果を取得する基本的な形ですね。
この形をベースに「検索するデータを変える」というのをやろうとすると、「問い合わせの内容」を変更することになります。よって、下記のようなところが最初の一歩になると思います。

$sql = "SELECT * FROM users where username LIKE '%$search%' order by id ASC";

しかしながら、どのような疑問や試行錯誤があって現在のコードに着地したのかがわからないので、この先の解説が難しいです。

まずは次のような流れで理解を深めていくのが良いと思います。

  1. 変更前のコードについて、プログラムがどのように動作しているか理解する
  2. 「部分一致検索を実装する」ために必要な要素やタスクを列挙する
  3. 列挙した要素やタスクにひとつひとつに対して、実現する方法を検討する
  4. それぞれの要素を組み合わせる
1Like

Comments

  1. @jankenpon0205

    Questioner

    分かりずらくてすみません。
    実現したいことは、index.php内に検索機能を付けたのですが、それに部分一致検索を実装したいということです。

    具体的には、
    名前を記入 
    ⇒ 検索をかけたら「ID」,「名前」,「メアド」が表示される 
    ⇒ 検索をかけた場所(虫メガネのマークにしています)を押すと、元のリスト一覧表に戻る
    、ということを行いたいです。

    よろしくお願いします。

  2. コメントありがとうございます。
    「具体的には」と説明いただいた部分がゴールなのだと認識しています。
    しかしながら、そのゴールに対する現在の状況がまだまだ不鮮明です。(少なくともプログラミングのレベルでは大づかみです)

    <form>タグの部分を土台に回答してみます。

            <form action="list.php" method="post">
            <input type="search" name="search" placeholder="ユーザー名で検索">
            <button type="button" ><i class="fa-solid fa-magnifying-glass"></i></button>
            </form>
    

    action属性がlist.phpになっていることから、検索ボタンを押すとlist.phpに遷移することがわかります。
    ですので「検索処理をどこのファイルに構築すべきか」というのは、このformを見る限りlist.phpということになります。

    (ちなみbuttonでformを動作させるには、type属性をsubmitにする必要があります。1

    また、「ファイルのどの位置に構築すべきか」ということについては、「基本的には必要になる箇所よりも上」となります。これは、プログラミングは「上から順番に実行される」というルールに基づくものです。
    「HTMLとPHPのコードが混ざるとわかりにくくなる」という点では「なるべく<!DOCTYPE html>の上にまとめたほうが分かりやすい」という状況は考えられます。

    もっともこれは基本的な考え方です。すでに実践されているように「一部の処理を別のファイルに分離し、require_once等で読み込む」ということもできますから、単に「構築」というだけでは様々な事が考えられます。

    1. https://developer.mozilla.org/ja/docs/Web/HTML/Element/button#type

  3. @jankenpon0205

    Questioner

    お忙しいところ回答して頂きありがとうございます。
    action属性のところ間違えていました。index.phpです。

    また、やりたいことをもう少し掘り下げると、
    ・フォームから送信された名前のフィールドが空でない場合は、名前に部分一致するユーザーを取得するSQL文を実行させたい。
    ・フォームから送信された名前のフィールドが空の場合、全てのユーザーID昇順で取得するSQL文を実行させたい。
    、ということをやりたいです。

    よろしくお願いします。

  4. 情報を整理すると次のようなタスクがあると思われます。

    • フォームから送信された名前のフィールドが空かどうかの判定
    • 名前に部分一致するユーザーを取得するSQL文を実行する
    • 全てのユーザーID昇順で取得するSQL文を実行する
    • 実行するSQLの切り替え

    そのうちの1つは出来ている、という状況になるでしょうか。

    ひとまず「フォームから送信された名前のフィールドが空かどうかの判定」について参考になりそうな情報を提示します。

    まずパラメータの取得は $_GET $_POST $_REQUEST などの定義済み変数から取得します。
    判定についてはisset関数による存在確認であったり、空文字との比較(== '')などがあります。
    また$_SERVER['REQUEST_METHOD']からGETやPOSTなどのメソッド名を取得できるので、こちらもフォームの処理に使われることもあります。

  5. @jankenpon0205

    Questioner

    お忙しい中回答して頂きありがとうございます。

    このチェック項目の最後にある「実行するSQLの切り替え」というのはif文を使うのですよね?

    まだ初心者なので、if文の中にSQL文の書き方を教えていただけますでしょうか。

    何卒よろしくお願いします。

  6. すいません、「実行するSQLの切り替え」というよりは「3つのタスクを組み合わせる」という方が適切でした。
    タスクを細かく分解したのは、いきなり全部やろうとすると混乱してしまうことが多い、というのが理由です。

    if文の中にSQL文の書き方

    タスクをif文に当てはめると次のようなイメージになります。
    { }の中の処理はあくまでイメージです。

    if (/* フォームから送信された名前のフィールドが空かどうかの判定 */) {
        // 名前に部分一致するユーザーを取得するSQL文を実行する
        $sql = "名前に部分一致するユーザーを取得するSQL";
        $stmt = $db->query($sql);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    } else {
        // 全てのユーザーID昇順で取得するSQL文を実行する
        $sql = "全てのユーザーID昇順で取得するSQL";
        $stmt = $db->query($sql);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    

    全体像が見えないのであれば、まずは「すべてのユーザーを表示する」「検索したユーザーを表示する」をそれぞれやってみるのが良いと思います。
    それが出来た後に、それぞれで違う部分、つまり「フォームから送信された名前のフィールドが空かどうか」という条件で変わる部分がどこか探してみましょう。

Your answer might help someone💌