# 投稿を削除する
「削除ボタン」をクリックした際に投稿が表示されなくなり、データベースからも delete されている状態を目指します。

# 本セクションの流れ
delete_message.phpを作成する。index.phpからdelete_message.phpを読み込む。
# 1. delete_message.php を作成する。
~~/src/delete_message.php を作成し、以下のコードを記述します。
<?php
if (isset($_POST['id']) && $_POST['id']) {
$stmt = $dbh->prepare('DELETE FROM posts WHERE id = :id');
$stmt->bindValue(':id', $_POST['id'], PDO::PARAM_INT);
$stmt->execute();
}
header('Location: /');
exit();
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
データベースから id に対応するでデータを削除する処理を delete_message.php の中に実装していきます。
if 文の条件で、 $_POST['id']が定義されていることかつ、$_POST['id']が空文字でないことを確認し、ture の場合は delete 文を実行していきます。
(DELETE 文) テーブルからデータを削除する
テーブルにからデータを削除する場合は次のように記述します。WHERE を加えて条件を指定することで特定のレコードを削除することができます。
DELETE FROM tbl_name WHERE id = 100;
1
# 2. index.php から delete_message.php を読み込む。
<?php
session_start();
require_once(__DIR__ . '/../src/db_connect.php');
if (isset($_POST['action_type']) && $_POST['action_type']) {
if ($_POST['action_type'] === 'insert') {
require(__DIR__ . '/../src/insert_message.php');
} else if ($_POST['action_type'] === 'delete') {
require(__DIR__ . '/../src/delete_message.php');
}
}
require(__DIR__ . '/../src/session_values.php');
$stmt = $dbh->query('SELECT * FROM posts ORDER BY created_at DESC;');
$message_length = $stmt->rowCount();
function convertTz($datetime_text)
{
$datetime = new DateTime($datetime_text);
$datetime->setTimezone(new DateTimeZone('Asia/Tokyo'));
return $datetime->format('Y/m/d H:i:s');
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex" />
<title>ひとこと掲示板</title>
<link rel="stylesheet" href="./assets/main.css" />
</head>
<body>
<div class="page-cover">
<p class="page-title">ひとこと掲示板</p>
<hr class="page-divider" />
<div class="form-cover">
<form action="/" method="post">
<div class="form-input-title">投稿者ニックネーム</div>
<input type="text" name="author_name" maxlength="40" value="<?php echo htmlspecialchars($messages['input_pre_author_name'], ENT_QUOTES); ?>" class="input-author-name" />
<?php if ($messages['input_error_author_name'] !== '') { ?>
<div class="form-input-error">
<?php echo $messages['input_error_author_name']; ?>
</div>
<?php } ?>
<div class="form-input-title">投稿内容<small>(必須)</small></div>
<textarea name="message" class="input-message"><?php echo htmlspecialchars($messages['input_pre_message'], ENT_QUOTES); ?></textarea>
<?php if ($messages['input_error_message'] !== '') { ?>
<div class="form-input-error">
<?php echo $messages['input_error_message']; ?>
</div>
<?php } ?>
<input type="hidden" name="action_type" value="insert" />
<button type="submit" class="input-submit-button">投稿する</button>
</form>
</div>
<hr class="page-divider" />
<div class="message-list-cover">
<small>
<?php echo $message_length; ?> 件の投稿
</small>
<?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
<?php $lines = explode("\n", $row['message']); ?>
<div class="message-item">
<div class="message-title">
<div><?php echo htmlspecialchars($row['author_name'], ENT_QUOTES); ?></div>
<small><?php echo convertTz($row['created_at']); ?></small>
<div class="spacer"></div>
<form action="/" method="post" style="text-align:right">
<input type="hidden" name="id" value="<?php echo $row['id']; ?>" />
<input type="hidden" name="action_type" value="delete" />
<button type="submit" class="message-delete-button">削除</button>
</form>
</div>
~~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
75 行目の input タグで value="<?php echo $row['id']; ?>" とすることで、削除ボタンがクリックされた時に、$row['id']を$_POST['id']に格納します。
if (isset($_POST['action_type']) && $_POST['action_type']) {
if ($_POST['action_type'] === 'insert') {
require(__DIR__ . '/../src/insert_message.php');
} else if ($_POST['action_type'] === 'delete') {
require(__DIR__ . '/../src/delete_message.php');
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
そして、削除ボタンがクリックされた時に $_POST['action_type'] === 'delete' が true となり、 delete_message.php が実行され、id を条件にデータの削除処理が行われます。
# 動作確認
- データ削除前(3 件表示)
- データ削除後(2 件表示)
- 削除までの挙動

# 最終的なコードとファイル構成
~~/public/index.php
<?php
session_start();
require_once(__DIR__ . '/../src/db_connect.php');
if (isset($_POST['action_type']) && $_POST['action_type']) {
if ($_POST['action_type'] === 'insert') {
require(__DIR__ . '/../src/insert_message.php');
} elseif ($_POST['action_type'] === 'delete') {
require(__DIR__ . '/../src/delete_message.php');
}
}
require(__DIR__ . '/../src/session_values.php');
$stmt = $dbh->query('SELECT * FROM posts ORDER BY created_at DESC;');
$message_length = $stmt->rowCount();
function convertTz($datetime_text)
{
$datetime = new DateTime($datetime_text);
$datetime->setTimezone(new DateTimeZone('Asia/Tokyo'));
return $datetime->format('Y/m/d H:i:s');
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex" />
<title>ひとこと掲示板</title>
<link rel="stylesheet" href="./assets/main.css" />
</head>
<body>
<div class="page-cover">
<p class="page-title">ひとこと掲示板</p>
<hr class="page-divider" />
<div class="form-cover">
<form action="/" method="post">
<div class="form-input-title">投稿者ニックネーム</div>
<input type="text" name="author_name" maxlength="40" value="<?php echo htmlspecialchars($messages['input_pre_author_name'], ENT_QUOTES); ?>" class="input-author-name" />
<?php if ($messages['input_error_author_name'] !== '') { ?>
<div class="form-input-error">
<?php echo $messages['input_error_author_name']; ?>
</div>
<?php } ?>
<div class="form-input-title">投稿内容<small>(必須)</small></div>
<textarea name="message" class="input-message"><?php echo htmlspecialchars($messages['input_pre_message'], ENT_QUOTES); ?></textarea>
<?php if ($messages['input_error_message'] !== '') { ?>
<div class="form-input-error">
<?php echo $messages['input_error_message']; ?>
</div>
<?php } ?>
<input type="hidden" name="action_type" value="insert" />
<button type="submit" class="input-submit-button">投稿する</button>
</form>
</div>
<hr class="page-divider" />
<div class="message-list-cover">
<small>
<?php echo $message_length; ?> 件の投稿
</small>
<?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
<?php $lines = explode("\n", $row['message']); ?>
<div class="message-item">
<div class="message-title">
<div><?php echo htmlspecialchars($row['author_name'], ENT_QUOTES); ?></div>
<small><?php echo convertTz($row['created_at']); ?></small>
<div class="spacer"></div>
<form action="/" method="post" style="text-align:right">
<input type="hidden" name="id" value="<?php echo $row['id']; ?>" />
<input type="hidden" name="action_type" value="delete" />
<button type="submit" class="message-delete-button">削除</button>
</form>
</div>
<?php foreach ($lines as $line) { ?>
<p class="message-line"><?php echo htmlspecialchars($line, ENT_QUOTES); ?></p>
<?php } ?>
</div>
<?php } ?>
</div>
</div>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
~~/src/delete_message.php
<?php
if (isset($_POST['id']) && $_POST['id']) {
$stmt = $dbh->prepare('DELETE FROM posts WHERE id = :id');
$stmt->bindValue(':id', $_POST['id'], PDO::PARAM_INT);
$stmt->execute();
}
header('Location: /');
exit();
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
ファイル構成
.
├── docker-compose.yml
├── php
│ └── Dockerfile
├── public
│ ├── assets
│ │ └── main.css
│ └── index.php
└── src
├── db_connect.php
├── delete_message.php
├── insert_message.php
└── session_values.php
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13