jankenpon0205
@jankenpon0205 (002 ruru)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

Q&A

Closed

解決したいこと

ユーザーネームの一部(例えば、「あおい」というユーザーネームで検索フォームに「あ」を記入して検索すると「あ」の付く名前の人が出てくる)を検索フォームにかけても、検索機能が動きません。

サイト上では、

名前を記入
⇒ 検索をかけたら「ID」,「名前」,「メアド」が表示される 
⇒ 「一覧に戻る」リンクを表示させ、それを押すと元のリスト一覧表に戻る
、ということを行いたいです。

具体的に言うと、以下の事です。

・フォームから送信された名前のフィールドが空でない場合は、名前に部分一致するユーザーを取得するSQL文を実行させたい。
・フォームから送信された名前のフィールドが空の場合、全てのユーザーID昇順で取得するSQL文を実行させたい。
・もし、フォームから送信された検索のフィールドが空でない場合、一覧に戻るリンクを表示させる

、ということをやりたいです。

ここが出来ているか見てほしいのと出来てなかったら教えてほしいです。

(解決するためにしたことは、chatGPTを使ったり、このサイトを見たり使ったりしました。「一覧に戻る」というリンクを表示させるために以下のようなPHPを構築してみましたが、検索フォームが機能しませんでした。)

<?php 

            
            if(!empty($_POST['search'])){
                echo '<a href="index.php">一覧に戻る</a>';
            }
            
            ?>

0

2Answer

現在のコードではやりたいこととどのように違う動きになるのか質問欄を編集して追記してください。

長い css のコードがアップされてますが、質問とは関係ないのでは? 関係なければ質問からは削除願います。

0Like

Comments

  1. @jankenpon0205

    Questioner

    すみません、編集しました。

  2. ユーザーネームの一部(例えば、「あおい」というユーザーネームで検索フォームに「あ」を記入して検索すると「あ」の付く名前の人が出てくる)を検索フォームにかけても、検索機能が動きません。

    一切なにもできてない(サーバー側のコードが全く動かない)と言うことですか?

    質問のコード、

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

    でフォームを送信するとサーバー側での処理が始まるのではないかと想像してますが、そうだとすると、送信できてないのでは?

    【追記】

    button type="button" がどういうものか調べてください。

上記の方の指摘があるとおり、button type="button" =>(変更)、button type="submit" でデータをPOSTしますので、こちらに修正しませんと動きません。

SQLの部分を載せます。

php index.php

// === nameがsearchのデータがPOSTされていた場合
if(isset($_POST['search'])) {
	
	if (!empty($_POST['search'])) {

        // === SQL部分は直接変数や値を入れるよりも、バインド(bindParamや,bindValue などを使った方が良いかと思います)
	    $likeQuery = "SELECT * FROM users WHERE username LIKE :search ORDER BY id ASC;"; // ここ①
	    $stmt = $db->prepare($likeQuery);

	    $searchTerm = '%' . $_POST['search'] . '%'; //  sqlのlikeの使い方を調べると % 値, 値 % , % 値 %の3パターンの意味がわかります。

	    $stmt->bindParam(':search', $searchTerm, PDO::PARAM_STR); // ここでバインド(ここ①の部分の :search)の部分に、$searchTermの値を入れるという意味です。 :searchは別になんでもいいです。例えば $stmt->bindParam(':p1', $searchTerm, PDO::PARAM_STR); など、その場合は sqlのここ①の  WHERE username LIKE :p1 にしてあげます。

	    $stmt->execute(); // === 実行

	    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // === 実行結果の値を取得
     
        // ※追記 テスト出力 コメントアウトを外して下さい。
        // print_r($result);
        // print("<br />" . "\n");
        // var_dump($result);

	} else {

	    $sql = "SELECT * FROM users ORDER BY id ASC;";
	    $stmt = $db->query($sql);
	    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
	}

}
0Like

Comments

  1. @jankenpon0205

    Questioner

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

    書いていただいたSQLは「DOCTYPE html」の上にある記述を修正ということを指しているのでしょうか?

  2. 書いていただいたSQLは「DOCTYPE html」の上にある記述を修正ということを指しているのでしょうか?

    そうです。

    下記の部分は残してください。それ以外は変えてください。

    ※ちなみにコピペをされてもエラーで動かないと思います。何故なら、全角スペースが入っているからです。
    PHPは全角スペースが入ると動きませんので、中々どこが悪いかわからない場合があります。

    ですので、おすすめは、 ini_set('display_errors', "On"); を入れますと、全角文字が入っている(エラー表示は確かsyntaxerro だったと思いますが、全角文字が入っている前後の行か、その行を教えてくれます。

    それと、エディターで全角が入ってるものがわかる機能があるものもありますので、色々なエディターを試してみてください。

    php index.php
    
    <?php
    
    // エラーを出力する これを入れる
    ini_set('display_errors', "On");
    
    require_once("./common.php");
    
    // === nameがsearchのデータがPOSTされていた場合
    if(isset($_POST['search'])) {
    	
    	if (!empty($_POST['search'])) {
    
            // === SQL部分は直接変数や値を入れるよりも、バインド(bindParamや,bindValue などを使った方が良いかと思います)
    	    $likeQuery = "SELECT * FROM users WHERE username LIKE :search ORDER BY id ASC;"; // ここ①
    	    $stmt = $db->prepare($likeQuery);
    
    	    $searchTerm = '%' . $_POST['search'] . '%'; //  sqlのlikeの使い方を調べると % 値, 値 % , % 値 %の3パターンの意味がわかります。
    
    	    $stmt->bindParam(':search', $searchTerm, PDO::PARAM_STR); // ここでバインド(ここ①の部分の :search)の部分に、$searchTermの値を入れるという意味です。 :searchは別になんでもいいです。例えば $stmt->bindParam(':p1', $searchTerm, PDO::PARAM_STR); など、その場合は sqlのここ①の  WHERE username LIKE :p1 にしてあげます。
    
    	    $stmt->execute(); // === 実行
    
    	    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // === 実行結果の値を取得
         
            // ※追記 テスト出力 コメントアウトを外して下さい。
            // print_r($result);
            // print("<br />" . "\n");
            // var_dump($result);
    
    	} else {
    
    	    $sql = "SELECT * FROM users ORDER BY id ASC;";
    	    $stmt = $db->query($sql);
    	    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    	}
    
    }
    
    ?>
    
  3. それから、すいません、sqlの出力結果を出力するコードコメントアウトでいれさせて頂きましたので、コメントを外して使ってみてください。

    それでは、ご検討を祈っております。無事に動くといいですね。

Your answer might help someone💌