1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHPでDBに接続、CRUDを利用して掲示板を作る③ Updateについて

Posted at

過去の記事はこちらから

①DB接続から記事投稿まで(Create)
https://qiita.com/progterry/items/2f82b82a5118c16010a0

②Read機能について
https://qiita.com/progterry/items/1b0d1576c5d90af003ba

今回はCRUDの中でもUpdateに触れていこうと思います。

Updateは、一度掲示板に投稿した内容を編集し、更新(上書き)する機能です。

そのためには、idの使い方が重要になってきます。
idはテーブルを作成したときに、カラムを作成しておいてA.Iを設定しておきます。
おうすることで、投稿順に自動的にidが割り振られていきます。

詳細はこのあたりの記事を参考にしてください
https://www.dbonline.jp/mysql/table/index7.html

Updateするためには、
1.readの画面で、「編集」の項目を作る
2.「編集」のための機能を実装する

の大まかに分けて2つが必要です。
まず1から。

#readの画面で「編集」の項目を作る
read.phpの、投稿者と発言の表示を、今回ではテーブル状態に整えます。
コードとしては以下のようになります。

echo "<table>";
    echo "<tr>";
    echo "<th>お名前</th><th>メッセージ</th>\n";
    echo "</th>";
    foreach($stmt as $user){
        echo "<tr>\n";
            echo "<td>" . $user['submit_name'] . "</td>\n";
            echo "<td>" . $user['submit_content'] . "</td>\n";
            echo  "<td>" . "<a href=edit.php?id=" . $user['id'] . ">編集する</a>" . "</td>\n";
            echo  "<td>" . "<a href=delete_confirm.php?id=" . $user['id'] . ">削除する</a>" . "</td>\n";            
        }


echo "</table>";

こうすることで、テーブル状態で表示されます。
また、CRUDのDELETEを見越して、「削除する」の項目も付け足しておきました。

この中で大事なのは、

"<a href=edit.php?id=" . $user['id'] . ">

この部分です。
DBのテーブルのカラムは、
id
submit_name
submit_content
と名付けています。
それぞれ、

(蛇足。submit_nameは投稿者を示すように設定し、submit_contentは投稿内容を示すように設定してあります。)

a hrefでリンクを設定し、リンク先はedit.php(内容を変更するための画面)に設定します。
しかしこれだけだと、「どの投稿内容を変更するのか」が分からないため、A.Iされたidで投稿内容を区別します。
そのために
$user['id'] .
でidをテーブルから受け取ります。
idが1であれば、一番目に投稿された内容ということで、1番目の投稿内容の編集画面にうつります。

#編集画面を作る
今度は別ファイルで項目の編集機能を実装します。

コードを前半部と後半部に分けます。

##DB接続まで
前半部。

<?php

try{

    //DBに接続
    $dsn = 'mysql:dbname=test_bbs2; host=localhost';
    $username= 'root';
    $password= 'root';

    $dbh = new PDO($dsn, $username, $password);
    //準備
    $stmt = $dbh->prepare('SELECT * FROM contacts WHERE id = :id');

    //実行
    $stmt->execute(array(':id' => $_GET["id"]));
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    echo "OK";
    echo "<br>";
} catch(PDOException $e){
    echo "失敗:" . $e->getMessage() . "\n";
    exit();
}
?>

前半部では主にDBへの接続を行っています。

id

この部分では、contactsテーブルからすべてを参照し、WHERE区でidを限定しています。
idを限定するのですが、「どのidを指定するのか?」が分からないため、
id = :idとして仮置きしておきます。
ここの仮置きは、?マークとかでも代用できるのですが、機能的な違いは(今のところ)探せませんでした。単純にどちらが書きやすいかor見やすいか?だけなのか?

$stmt->execute(array(':id' => $_GET["id"]));

この部分でやっと、:idに実際のidを代入します。実際のidはGETで受け取ります。

以上ここまでが、「指定したidの投稿への接続」です。

##編集画面のコード
後半部のコードは次のとおり。

<html>
<head>
    <meta charset="utf-8">
    <title>編集</title>

<h2>編集</h2>
    <form action="update.php" method="post">
        <input type="hidden" name="id" value="<?php if(!empty($result['id']))  echo(htmlspecialchars($result['id'], ENT_QUOTES, 'UTF-8')); ?>">
    <p>
        <label>お名前</label>
        <input type="text" name="update_name" value="<?php if(!empty($result['submit_name']))  echo(htmlspecialchars($result['submit_name'], ENT_QUOTES, 'UTF-8')); ?>">
    </p>
    <p>
        <label>発言</label>
        <input type="text" name="update_content" value="<?php if(!empty($result['submit_content']))  echo(htmlspecialchars($result['submit_content'], ENT_QUOTES, 'UTF-8')); ?>">
    </p>

        <input type="submit" value="編集する">

    </form>

        <a href="index.php">投稿一覧へ</a>
</body>
</html>

まずlabelタグで、項目を作ります。

その後

" data-sourcepos="158:1-159:3">

このコード。
valueの中のコードで、変更前(すでにDBに保存されている内容)をPHPで呼び出します。
そうすると、項目の中に投稿した内容が反映されています。

実際の変更の機能は<form action="update.php" method="post">
ここにたくされています。
postで渡され、update.phpで実行されると。

#update.phpについて
ここまでで、投稿画面一覧から編集画面への移行を実装してきました。
ここから編集の機能を実装します。

update.phpのコードはこのようになっています。

<?php 

$dsn = 'mysql:dbname=test_bbs2; host=localhost';
$username= 'root';
$password= 'root';

try{

    $dbh = new PDO($dsn, $username, $password);
    echo "接続成功";
    //変数に格納
    $sql="UPDATE contacts SET submit_name = :name, submit_content = :message WHERE id = :id";
    //準備
    $stmt = $dbh->prepare($sql);

    //配列に格納
    $params = array(':name' => $_REQUEST['update_name'], ':message' => $_REQUEST['update_content'], ':id' => $_REQUEST['id']);

    $stmt->execute($params);

    echo "情報を更新しました。";
} catch(PDOException $e){
    echo "失敗:" . $e->getMessage() . "\n";
    exit();
}
?>


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>更新完了</title>
  </head>
  <body>          
  <p>
      <a href="index.php">投稿一覧へ</a>
  </p> 
  </body>
</html>

この中でも、

name' => $_REQUEST['update_name'], ':message' => $_REQUEST['update_content'], ':id' => $_REQUEST['id']);
    $stmt->execute($params);

この部分で、編集画面のコードで、入力した内容を受けとっています。
編集の画面のコードでは、それぞれ項目の名前を

 <label>発言</label>
        <input type="text" name="update_content"

このように、name="update_content"としていますので、それをupdate.phpで受け取ります。

それらを最終的にDBに保存すれば、Update機能の完了となります。

#まとめ
繰り返しになりますが、以下の流れで機能を作っていきます。
1.DBに接続し、idの値で指定した入力内容をもってくる
2.入力内容を項目に反映させ、編集する画面をつくる
3.2で作った内容を受け取り、DBへ再度保存する。

以上です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?