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¥¥-]*¥'のようにエスケープする必要があるかも知れません。
Comments
@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";
しかしながら、どのような疑問や試行錯誤があって現在のコードに着地したのかがわからないので、この先の解説が難しいです。
まずは次のような流れで理解を深めていくのが良いと思います。
- 変更前のコードについて、プログラムがどのように動作しているか理解する
- 「部分一致検索を実装する」ために必要な要素やタスクを列挙する
- 列挙した要素やタスクにひとつひとつに対して、実現する方法を検討する
- それぞれの要素を組み合わせる
Comments
@jankenpon0205
Questioner
分かりずらくてすみません。
実現したいことは、index.php内に検索機能を付けたのですが、それに部分一致検索を実装したいということです。具体的には、
名前を記入
⇒ 検索をかけたら「ID」,「名前」,「メアド」が表示される
⇒ 検索をかけた場所(虫メガネのマークにしています)を押すと、元のリスト一覧表に戻る
、ということを行いたいです。よろしくお願いします。
コメントありがとうございます。
「具体的には」と説明いただいた部分がゴールなのだと認識しています。
しかしながら、そのゴールに対する現在の状況がまだまだ不鮮明です。(少なくともプログラミングのレベルでは大づかみです)<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等で読み込む」ということもできますから、単に「構築」というだけでは様々な事が考えられます。
@jankenpon0205
Questioner
お忙しいところ回答して頂きありがとうございます。
action属性のところ間違えていました。index.phpです。また、やりたいことをもう少し掘り下げると、
・フォームから送信された名前のフィールドが空でない場合は、名前に部分一致するユーザーを取得するSQL文を実行させたい。
・フォームから送信された名前のフィールドが空の場合、全てのユーザーID昇順で取得するSQL文を実行させたい。
、ということをやりたいです。よろしくお願いします。
情報を整理すると次のようなタスクがあると思われます。
- フォームから送信された名前のフィールドが空かどうかの判定
- 名前に部分一致するユーザーを取得するSQL文を実行する
- 全てのユーザーID昇順で取得するSQL文を実行する
- 実行するSQLの切り替え
そのうちの1つは出来ている、という状況になるでしょうか。
ひとまず「フォームから送信された名前のフィールドが空かどうかの判定」について参考になりそうな情報を提示します。
まずパラメータの取得は
$_GET
$_POST
$_REQUEST
などの定義済み変数から取得します。
判定についてはisset
関数による存在確認であったり、空文字との比較(== ''
)などがあります。
また$_SERVER['REQUEST_METHOD']
からGETやPOSTなどのメソッド名を取得できるので、こちらもフォームの処理に使われることもあります。@jankenpon0205
Questioner
お忙しい中回答して頂きありがとうございます。
このチェック項目の最後にある「実行するSQLの切り替え」というのはif文を使うのですよね?
まだ初心者なので、if文の中にSQL文の書き方を教えていただけますでしょうか。
何卒よろしくお願いします。
すいません、「実行する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); }
全体像が見えないのであれば、まずは「すべてのユーザーを表示する」「検索したユーザーを表示する」をそれぞれやってみるのが良いと思います。
それが出来た後に、それぞれで違う部分、つまり「フォームから送信された名前のフィールドが空かどうか」という条件で変わる部分がどこか探してみましょう。