frswataru
@frswataru (本石 渉)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHP 検索フォームの作成方法

Q&A

Closed

解決したいこと

PHP 検索フォームの作成方法を教えて下さい。
今週からPHP&SQLを始めたド素人です、、、CRUD処理を猛勉中
ブログタイトルから該当するレコードを抽出したいです

image.png

DB

image.png

環境

・Windows10
・xampp

ディレクトリー

/xampp
blog.php
dbc.ph
index2.php
env.php

index2.php

<?php

use function Blog\Dbc\getAllBlog;
use function Blog\Dbc\setCategoryName;

require_once('blog.php');
$blog = new Blog();
// 取得したデーターを表示
$blogData = $blog->getAll();

function h($s)
{
    return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

?>



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ブログ一覧</title>
</head>

<body>
    <h2>ブログ一覧</h2>
    <p><a href="/form.html">新規作成</a></p>
    <br>
    <!-- 検索 -->
    <form action="blog_read.php" method="post">
        <p>
            ブログタイトル検索:
            <input type="text" name="read_title">
            <input type="submit" name="submit" value="検索">
        </P>
        <table>
            <tr>
                <th>タイトル</th>
                <th>カテゴリー</th>
                <th>投稿日時</th>
                <th>Detail</th>
                <th>Update</th>
                <th>Delete</th>
            </tr>
            <?php foreach ($blogData as $column) : ?>
                <tr>
                    <td><?php echo h($column['title']) ?></td>
                    <td><?php echo h($blog->setCategoryName($column['category'])) ?></td>
                    <td><?php echo h($column['post_at']) ?></td>
                    <td><a href="/detail.php?id=<?php echo $column['id'] ?>">詳細</a></td>
                    <td><a href="/update_form.php?id=<?php echo $column['id'] ?>">編集</a></td>
                    <td><a href="/blog_delete.php?id=<?php echo $column['id'] ?>">削除</a></td>
                </tr>
            <?php endforeach; ?>
        </table>
</body>

</html>

blog.php

<?php

require_once('dbc.php');

class Blog extends Dbc
{
    protected $table_name = 'blog';
    // 3カテゴリー名を表示
    public function setCategoryName($category)
    {
        if ($category === '1') {
            return '日常';
        } elseif ($category === '2') {
            return 'プログラミング';
        } else {
            return 'その他';
        }
    }

    public function blogCreate($blogs)
    {
        $sql = "INSERT INTO
            $this->table_name(title,content,category,publish_status)
            VALUES
            (:title,:content,:category,:publish_status)";


        $dbh = $this->dbConnect();
        // トランザクションの開始
        $dbh->beginTransaction();


        try {
            $stmt = $dbh->prepare($sql);
            $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR);
            $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR);
            $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT);
            $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT);
            $stmt->execute();
            $dbh->commit();
            echo 'ブログを投稿しました';
        } catch (PDOException $e) {
            $dbh->rollBack();
            exit($e);
        }
    }

    public function blogUpdate($blogs)
    {
        $sql = "UPDATE $this->table_name SET
                    title =:title,content = :content,category = :category,publish_status = :publish_status
                WHERE
                    id = :id";


        $dbh = $this->dbConnect();
        // トランザクションの開始
        $dbh->beginTransaction();


        try {
            $stmt = $dbh->prepare($sql);
            $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR);
            $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR);
            $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT);
            $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT);
            $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT);
            $stmt->execute();
            $dbh->commit();
            echo 'ブログを更新しました';
        } catch (PDOException $e) {
            $dbh->rollBack();
            exit($e);
        }
    }

    // ブログのバリエーション
    public function blogValidate($blogs)
    {
        if (empty($blogs['title'])) {
            exit('タイトルを入力してください');
        }

        if (mb_strlen($blogs['title']) > 191) {
            exit('タイトルは191文字以下にしてください');
        }

        if (empty($blogs['content'])) {
            exit('本文を入力してください');
        }

        if (empty($blogs['category'])) {
            exit('カテゴリーは必須です');
        }

        if (empty($blogs['publish_status'])) {
            exit('公開ステータスは必須です');
        }
    }
}

dbc.php

<?php


require_once('env.php');
class Dbc
{
    // namespace Blog\Dbc;

    protected $table_name;


    // 1データーベース接続
    protected function dbConnect()
    {

        $host = DB_HOST;
        $dbname = DB_NAME;
        $user = DB_USER;
        $pass = DB_PASS;
        $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8";


        try {
            $dbh = new \PDO($dsn, $user, $pass, [
                \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            ]);
        } catch (\PDOException $e) {
            echo '接続失敗' . $e->getMessage();
            exit();
        };
        return $dbh;
    }
    // 2データを取得する
    public function getAll()
    {
        $dbh = $this->dbConnect();
        // 1SQLの準備
        $sql = "SELECT*FROM $this->table_name";
        // 2SQLの実行
        $stmt = $dbh->query($sql);
        // 3SQLの結果を受け取る
        $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
        return $result;
        $dbh = null;
    }




    public function getById($id)
    {
        if (empty($id)) {
            exit('IDが不正です。');
        }


        $dbh = $this->dbConnect();

        // SQL準備
        $stmt = $dbh->prepare("SELECT*FROM $this->table_name Where id = :id");
        $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT);
        // SQL実行
        $stmt->execute();
        // 結果を取得
        $result = $stmt->fetch(\PDO::FETCH_ASSOC);

        if (!$result) {
            exit('ブログがありません');
        }
        return $result;
    }

    public function delete($id)
    {
        if (empty($id)) {
            exit('IDが不正です。');
        }


        $dbh = $this->dbConnect();

        // SQL準備
        $stmt = $dbh->prepare("DELETE FROM $this->table_name Where id = :id");
        $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT);
        // SQL実行
        $result = $stmt->execute();
        echo 'ブログを削除しました';
        return $result;
    }
}
1

2Answer

getById関数と同じように、それをtitleバージョンで作成すればよいかと思います。

考えていただきたいので、答えは提示しないでおきますね!
頑張ってください!!!!!

1Like

Comments

  1. すいません、getByIdだとfetchなので一行の取得になりますね。

    https://www.php.net/manual/ja/book.pdo.php
    こちらに色々かかれていますが、fetchAllを使用してもらうと、思ったとおりに行くかと思います!!
  2. @frswataru

    Questioner

    ・具体的には先ずはユーザー関数を作るところから、、、です?
     public function getBytitle()⇐引数には何を入れますか
    ・添付頂いたURLではどの辺がポイントでしょうか。ピンと来なくて
    ・作動の流れをご教示頂ければ助かりますw
  3. 検索ボタンを押した後に、$_POST['read_title']で検索フィールドに記述した内容が取れるかと思います。

    それをSELECT * FROM blog WHERE title = :titleにバインドしてあげれば検索結果が取得できます!!!
  4. コード確認いたしました!!

    ほぼほぼ完璧です!
    LIKE文。すっかり忘れてましたw

    修正が4箇所。

    public function getByTitle()

    public function getByTitle($title)


    $stmt = $dbh->prepare("SELECT*FROM $this->table_name Where title LIKE '%" . $_POST["title"] . "%' ");

    $stmt = $dbh->prepare("SELECT*FROM $this->table_name Where title LIKE :title");

    // $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT);

    $stmt->bindValue(':title', "%" . $title . "%", \PDO::PARAM_STR);

    $result = $stmt->fetch(\PDO::FETCH_ASSOC);

    $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);

    fetchとfetchAllの違いは以下のマニュアルを読み解いてください!

    https://www.php.net/manual/ja/pdostatement.fetch.php

    https://www.php.net/manual/ja/pdostatement.fetchall.php

何となく形にはなりましたどうでしょうか
ご教示頂いたポイントを押せえれていないような
分かったような分かってないような。モヤモヤ

###search.php

<?php

require_once('blog.php');
$blog = new Blog();
$result = $blog->getByTitle($_POST['title']);
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>検索結果</title>
</head>

<body>
    <h2>検索結果</h2>
    <table>
        <tr>
            <th>タイトル</th>
            <th>カテゴリー</th>
            <th>投稿日時</th>
            <th>Detail</th>
            <th>Update</th>
            <th>Delete</th>
        </tr>
        <tr>
            <td><?php echo $result['title'] ?></td>
            <td><?php echo  $blog->setCategoryName($result['category']) ?></td>
            <td><?php echo $result['post_at'] ?></td>
            <td><a href="/detail.php?id=<?php echo $result['id'] ?>">詳細</a></td>
            <td><a href="/update_form.php?id=<?php echo $result['id'] ?>">編集</a></td>
            <td><a href="/blog_delete.php?id=<?php echo $result['id'] ?>">削除</a></td>
        </tr>

    </table>
    <p><a href="/index2.php">戻る</a></p>
</body>

</html>

###index2.php

<?php

use function Blog\Dbc\getAllBlog;
use function Blog\Dbc\setCategoryName;

require_once('blog.php');
$blog = new Blog();
// 取得したデーターを表示
$blogData = $blog->getAll();

function h($s)
{
    return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

?>



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ブログ一覧</title>
</head>

<body>
    <h2>ブログ一覧</h2>
    <p><a href="/form.html">新規作成</a></p>
    <br>
    <!-- 検索 -->
    <form action="search.php" method="post">
        <p>
            ブログタイトル検索:
            <input type="text" name="title" >
            <input type="submit" name="submit" value="検索">
        </P>
    </form>
        <table>
            <tr>
                <th>タイトル</th>
                <th>カテゴリー</th>
                <th>投稿日時</th>
                <th>Detail</th>
                <th>Update</th>
                <th>Delete</th>
            </tr>
            <?php foreach ($blogData as $column) : ?>
                <tr>
                    <td><?php echo h($column['title']) ?></td>
                    <td><?php echo h($blog->setCategoryName($column['category'])) ?></td>
                    <td><?php echo h($column['post_at']) ?></td>
                    <td><a href="/detail.php?id=<?php echo $column['id'] ?>">詳細</a></td>
                    <td><a href="/update_form.php?id=<?php echo $column['id'] ?>">編集</a></td>
                    <td><a href="/blog_delete.php?id=<?php echo $column['id'] ?>">削除</a></td>
                </tr>
            <?php endforeach; ?>
        </table>
</body>

</html>

###dbc.php

<?php


require_once('env.php');
class Dbc
{
    // namespace Blog\Dbc;

    protected $table_name;


    // 1データーベース接続
    protected function dbConnect()
    {

        $host = DB_HOST;
        $dbname = DB_NAME;
        $user = DB_USER;
        $pass = DB_PASS;
        $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8";


        try {
            $dbh = new \PDO($dsn, $user, $pass, [
                \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
            ]);
        } catch (\PDOException $e) {
            echo '接続失敗' . $e->getMessage();
            exit();
        };
        return $dbh;
    }
    // 2データを取得する
    public function getAll()
    {
        $dbh = $this->dbConnect();
        // 1SQLの準備
        $sql = "SELECT*FROM $this->table_name";
        // 2SQLの実行
        $stmt = $dbh->query($sql);
        // 3SQLの結果を受け取る
        $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
        return $result;
        $dbh = null;
    }




    public function getById($id)
    {
        if (empty($id)) {
            exit('IDが不正です。');
        }


        $dbh = $this->dbConnect();

        // SQL準備
        $stmt = $dbh->prepare("SELECT*FROM $this->table_name Where id = :id");
        $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT);
        // SQL実行
        $stmt->execute();
        // 結果を取得
        $result = $stmt->fetch(\PDO::FETCH_ASSOC);

        if (!$result) {
            exit('ブログがありません');
        }
        return $result;
    }

    public function delete($id)
    {
        if (empty($id)) {
            exit('IDが不正です。');
        }


        $dbh = $this->dbConnect();

        // SQL準備
        $stmt = $dbh->prepare("DELETE FROM $this->table_name Where id = :id");
        $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT);
        // SQL実行
        $result = $stmt->execute();
        echo 'ブログを削除しました';
        return $result;
    }
    public function getByTitle()
    {
        // if (empty($id)) {
        //     exit('IDが不正です。');
        // }


        $dbh = $this->dbConnect();

        // SQL準備
        $stmt = $dbh->prepare("SELECT*FROM $this->table_name Where title LIKE '%" . $_POST["title"] . "%' ");
        // $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT);
        // SQL実行
        $stmt->execute();
        // 結果を取得
        $result = $stmt->fetch(\PDO::FETCH_ASSOC);

        if (!$result) {
            exit('ブログがありません');
        }
        return $result;
    }
}
0Like

Your answer might help someone💌