Help us understand the problem. What is going on with this article?

PHPで投稿した記事の編集機能【初心者向け】

今回は投稿されてMySQLに保存した記事を編集する方法について紹介させていただきます。

実装手順

データベース名test_dbに、テーブルpostsを作成して以下のように入力しておきます。

キャプチャ.PNG

適当に呼び出して表示させておきましょう。

<?php
// ドライバ呼び出しを使用して MySQL データベースに接続します
$dsn = 'mysql:dbname=test_db;charset=utf8mb4';//データベース名
$user = 'root';//設定していればそれを使う
$password = 't05461379';//設定していればそれを使う

try {
    $db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo "DB接続エラー: " . $e->getMessage() . "\n";
    exit();
}

$posts = $db->query('SELECT * from posts');

function h($value){
    return htmlspecialchars($value,ENT_QUOTES);
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <style>

    </style>
</head>

<body>
<?php
foreach($posts as $post):
?>
<h3>投稿内容:<?php echo h($post['comment']) ;?></h3>
<p>投稿時間<?php echo h($post['created']) ;?></p>
<?php
endforeach;
?>
</body>

</html>

上記で表示することが出来ました。

キャプチャ.PNG

こちらを編集できるようにしたいと思います。

とりあえず編集ボタンを付けましょう。

<a href='test_edit.php?id=<?php echo h($post['id']) ?>'><button type="submit" >編集する</button></a>

書き込む位置はendforeachの手前です。

編集ページを作る

次に、リンク先のtest_edit.phpを作ります。

test_edit.php
<?php
// ドライバ呼び出しを使用して MySQL データベースに接続します
$dsn = 'mysql:dbname=test_db;charset=utf8mb4';//データベース名
$user = 'root';//設定していればそれを使う
$password = 't05461379';//設定していればそれを使う

try {
    $db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo "DB接続エラー: " . $e->getMessage() . "\n";
    exit();
}

$posts = $db->prepare('SELECT comment from posts WHERE id=?');
$posts->execute(array($_GET['id']));
$post = $posts->fetch();

if($_POST['comment'] !== ''){

}

function h($value){
    return htmlspecialchars($value,ENT_QUOTES);
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <style>

    </style>
</head>

<body>
    <form action="" method="post" enctype="multipart/form-data">
        <p>投稿内容:</p>
        <input type="text" name="comment" size="35" maxlength="255" value="<?php echo h($post['comment']) ;?>" /><br>

        <p><input type="submit" value="変更する" /></p>

    </form>

</body>

</html>

これで編集画面の基礎が出来上がりました。
キャプチャ.PNG

UPDATE文を作成

POSTされた際、データベースへUPDATE文で投稿内容を更新し、headerファンクションでトップページに戻るように以下を付け加えます。

test_edit.php
if($_POST['comment'] != ''){
 $update = $db->prepare('UPDATE posts SET comment=? WHERE id=?');
 $update->execute(array(
   $_POST['comment'],
   $_GET['id']
 ));
 header('Location: test.php');
 exit;
}

投稿をデータベースから取得している部分と、htmlspecialchars関数の間に記載しました。

そして投稿の変更ができるか試してみます。
キャプチャ.PNG

変更するを押して、、
キャプチャ.PNG

無事に投稿内容を変更することができました。

最後に

今回の編集画面は、説明しやすいように$_GETでURLパラメータの値を取得→更新しましたが、セキュリティ面を考慮するとあまりおすすめできる方法ではありません。
この方法では、URLをいじってしまえば誰でも投稿を編集することができるからです。

実際に自分でWEBサイトを製作する場合はそういった部分も考慮して作っていきましょう。
閲覧いただきありがとうございました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away