limemint
@limemint (斉藤 貴博)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

検索ボックスを作成するにあたり、検索結果が表示されない

Q&A

Closed

解決したいこと

検索ボックスにキーワードを入力し、そのキーワードを含む文章を表示させたいと思っています。
しかし、うまくいっておりません。
ご助言いただければと思います。

php含む5つのファイルをアップするので長くなってしまい、見にくいかと思いますが、よろしくお願いします。

該当するソースコード

<?php
ini_set('display_errors', 'On');
try {
    // 接続
    $pdo = new PDO('sqlite:qa');

    // SQL実行時にもエラーの代わりに例外を投げるように設定
    // (毎回if文を書く必要がなくなる)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // デフォルトのフェッチモードを連想配列形式に設定 
    // (毎回PDO::FETCH_ASSOCを指定する必要が無くなる)
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    // テーブル削除
    //$pdo->exec("DROP TABLE qa");
    
    // テーブル作成
    $pdo->exec("CREATE TABLE IF NOT EXISTS qa(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_name VARCHAR(20),
        user_id VARCHAR(20),
        category VARCHAR(120),
        detail VARCHAR(2000)
    )");
} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>ナレッジ登録</title>
</head>

<body>
    <h2>ナレッジ登録内容</h2>
    <form action="knowledge_confirm.php" method="post">
        <table>
            <tr>
                <td>登録者</td>
                <td>
                    <input type="text" name="user_name">
                </td>
            </tr>
            <tr>
                <td>社員ID</td>
                <td>
                    <input type="text" name="user_id">
                </td>
            </tr>
            <tr>
                <td>業務種別</td>
                <td>
                    <select name="category">
                        <option value="操作関連">操作関連</option>
                        <option value="不具合について">不具合について</option>
                        <option value="その他">その他</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td>内容</td>
                <td>
                    <!-- cols属性=入力欄の幅(文字数)、rows属性=入力欄の高さ(行数) -->
                    <textarea name="detail" cols="30" rows="10" wrap="hard"></textarea>
                </td>
            </tr>
        </table>
        <input type="submit" value="送信">
    </form>
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ナレッジ登録</title>
</head>
<body>
    <h2>入力内容の確認</h2>
    <p>登録者:<?php echo $_POST['user_name']; ?></p>
    <p>社員ID:<?php echo $_POST['user_id']; ?></p>
    <p>業務種別:<?php echo $_POST['category']; ?></p>
    <p>内容:<?php echo nl2br($_POST['detail']); ?></p>
    <!-- ここにFORMとbuttonが必要です。 -->
    <form  action="knowledge_regist.php" method="post">
        <!-- ここにinput hiddenが必要です -->
        <input type="hidden" name="user_name" value="<?php echo $_POST['user_name']; ?>">
        <input type="hidden" name="user_id" value="<?php echo $_POST['user_id']; ?>">
        <input type="hidden" name="category" value="<?php echo $_POST['category']; ?>">
        <input type="hidden" name="detail" value="<?php echo $_POST['detail']; ?>">
        <input type="submit" value="送信">
        <p>
        <?php
        ini_set('display_errors', 'On');
        if (preg_match_all('/\A[A-Z]+[0-9]+\z/', $_POST['user_id'])) {
            echo '正しい社員IDの形式です。';
        } else {
            echo '社員IDの形式が正しくありません。';
        }
        ?>
    </p>
    </form>
    
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ナレッジ登録</title>
</head>
<body>
<h1>ナレッジを登録しました</h1>
<?php
ini_set('display_errors', 'On');
try {
    // DBへ接続
    $pdo = new PDO('sqlite:qa');

    // SQL実行時にもエラーの代わりに例外を投げるように設定
    // (毎回if文を書く必要がなくなる)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // デフォルトのフェッチモードを連想配列形式に設定 
    // (毎回PDO::FETCH_ASSOCを指定する必要が無くなる)
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    // 挿入のステートメントを作成する。
    $stmt = $pdo->prepare("INSERT INTO qa".
            "(user_name, user_id, category, detail) ".
            "VALUES(?,?,?,?)");

    // ステートメントを実行する。
    $stmt->execute([
        $_POST['user_name'],
        $_POST['user_id'],
        $_POST['category'],
        $_POST['detail']
        ]);

} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

?>

</body>
</html>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css">
    <title>ナレッジ検索</title>
    <style>
        .s_button {
            width: 120px;
            height: 50px;
        }
        .top {
            text-align: center;
        }
    </style>
</head>

<body>
    <h2>ナレッジ検索</h2>
    <form action="knowledge_box.php" method="post">
    
    <table>
        <tr>
            <td>検索キーワード</td>
            <td>
                <input type="text" name="keyword" value="<?php echo $_POST['keyword']; ?>" required>
            </td>
        </tr>
    </table>
    <input type="submit" class="s_button" value="検索開始">
    </form>
    
    <?php
    ini_set('display_errors', 'On');
    try {

        // 接続
        $pdo = new PDO('sqlite:qa');

        // SQL実行時にもエラーの代わりに例外を投げるように設定
        // (毎回if文を書く必要がなくなる)
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // デフォルトのフェッチモードを連想配列形式に設定 
        // (毎回PDO::FETCH_ASSOCを指定する必要が無くなる)
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

        // 選択 (プリペアドステートメント)
        $stmt = $pdo->prepare("SELECT * FROM qa WHERE keyword LIKE ='%keyword%'");
        $stmt->execute();
        $r1 = $stmt->fetchAll();

        // 結果を確認
        var_dump($r1);

    } catch (Exception $e) {
        echo $e->getMessage() . PHP_EOL;
    }
    ?>
    <h4>検索キーワードは「<?php echo $_POST['keyword']; ?>」です。</h4>
    <table>
        <tr>
            <th>No.</th>
            <th width="900" height="10" class="top">合致した内容</th>
        </tr>
        <?php foreach ($r1 as $row) {?>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[1]?></td>
            <td><?php echo $row['detail']; ?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[2]?></td>
            <td><?php echo $row['detail']; ?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[3]?></td>
            <td><?php echo $row['detail']; ?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[3]?></td>
            <td><?php echo $row['detail']; ?></td>
        </tr>
        <?php } ?>
    </table>

</body>

</html>

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

1Answer

$stmt = $pdo->prepare("SELECT * FROM qa WHERE keyword LIKE ='%keyword%'");

そのまま「keyword」を含む文字列を検索しているので、それを含むデータがないのではないでしょうか?
実際のデータが示されていないので想像になりますが。

任意のパラメータにしたいのであれば、まずはマニュアルを確認しましょう。

php含む5つのファイルをアップするので長くなってしまい、見にくいかと思いますが

質問のみやすさを気にするのは良いことです。
長さの問題については「折りたたみ」が使えます。

良い回答をもらえるための努力はできるので、活用してみてください。

1Like

Comments

  1. @limemint

    Questioner

    ご回答いただき感謝します。
    また参考となる資料も添付していただきありがとうございます。
    ぜひ活用したいです。

Your answer might help someone💌