limemint
@limemint (斉藤 貴博)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

検索フォームの作り方について

Q&A

Closed

解決したいこと

検索フォームを作成中です。
DBはすでにあるものとします。
htmlの中にphpを組み込むまでは画面表示はされるのに、phpを組み込むと画面表示されなくなります。
(AWS Clud9を使っています)

キーワードを入れると、検索してくれてそれを表示させるものに仕上げるにはどうしたらいいのでしょうか?

前半のコードがphpを入力する前で、後半がform下にphpを挿入したコードとなります。

<!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>

    <h4>検索キーワードは「<?php echo $_POST['keyword']; ?>」です。</h4>
    <table>
        <tr>
            <th>No.</th>
            <th width="900" height="20" class="top">合致した内容</th>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[1]?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[2]?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[3]?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td></td>
        </tr>
    </table>
</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
try {
    // 接続
    $pdo = new PDO('sqlite:qa');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      // 選択
    $stmt = $pdo->prepare("SELECT * FROM qa WHERE keyword = '%$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="20" class="top">合致した内容</th>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[1]?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[2]?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td><?php echo $row[3]?></td>
        </tr>
        <tr>
            <td height="100"></td>
            <td></td>
        </tr>
    </table>
</body>
</html>

ここから下は登録画面用に作成した4つのファイルを記載します。

<?php
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
        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
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>

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

3Answer

他にも原因があるかもしれませんが、
まずはtry~catchを囲むべきphpタグの閉じタグ?>が無いのも原因のひとつかと思います。

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

+ ?>
2Like

Comments

  1. @limemint

    Questioner

    ご回答いただきありがとうございます。
    ご指摘の通りタグがないためのようでした。
    初歩的なミスにも関わらず優しく指摘いただきまして感謝いたします。
    以後注意します。

おそらくPHPコードでエラーが発生しているのだとは思いますが、エラーログはわかりますでしょうか。

またファイル名なども有用な情報になり得るのです、ファイル内容と共に併記することをオススメします。

エラーについて言及が無いということは表示も無効なのではないかと思いますが、開発環境ではエラー表示を有効にすることをオススメします。
https://qiita.com/shotets/items/3c95aef631b2c5eadae5

1Like

Comments

  1. @limemint

    Questioner

    質問を見ていただきありがとうございます。
    原因は閉じタグがないためのようでした。

    今後はファイル内容も併記するよう心がけます。
    エラー表示の件ありがとうございます。
    このエラー表示を有効にするということですが、コードの中のどのへんに書いておけばいいのでしょうか?

    また、別件ですが、掲題のエラーは解消したのですが、今度は検索ができないという新たな問題が発生しまして、もしお時間あれば一度見ていただけたらと思います。

    こういう場合、新しい質問を投稿したらよいのかわからなかったので、まずは更新ということで追記しました。
  2. コード内なら先頭に、できればサーバー側の設定に書くことをオススメします

    エラーが確認できたら併記して新しく投稿すると良いかと
  3. @limemint

    Questioner

    ありがとうございます。
    新しく投稿してみました。

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌