【PHP】使用PHP创建备忘录应用程序【2】
上一篇文章的摘要
由于创建了一个具有CRUD功能的简单备忘录应用程序,我将把备忘录保存为文章。在上一篇文章(https://qiita.com/iwatsukayura/items/43c42d5378616b932f24)中,我们进行了数据库设计,并将备忘录显示为列表。在本篇文章中,我们将添加备忘录的删除、详细页面和编辑页面等功能。
计算页面数
在这个备忘录应用程序中,我已经编写了代码,使得每次改变页面时都会显示5条备忘录。以下是我使用的代码和计算方法。(下面是 index.html 这篇文章的一部分)
<?php
//最大ページ数を求める
$counts = $db->query('select count(*) as cnt from memos');
$count = $counts->fetch_assoc();
$max_page = floor(($count['cnt']-1)/5 + 1);
$stmt = $db->prepare('select * from memos order by id desc limit ?, 5');
if (!$stmt){
die($db->error);
}
$page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT);
$page = ($page ?: 1);
$start = ($page-1)*5;
$stmt->bind_param('i', $start);
$result = $stmt->execute();
?>
<!DOCTYPE html>
<html lang="ja">
<body>
<p>
<?php if($page > 1): ?>
<a href="?page=<?php echo $page-1; ?>"><?php echo $page-1?>ページ目</a> |
<?php endif; ?>
<?php if($page < $max_page): ?>
<a href="?page=<?php echo $page+1; ?>"><?php echo $page+1?>ページ目</a>
<?php endif; ?>
</p>
</body>
</html>
因为一些计算和运算符比较复杂,所以我们一个一个地来看。
<?php
//最大ページ数を求める
$counts = $db->query('select count(*) as cnt from memos');
$count = $counts->fetch_assoc();
$max_page = floor(($count['cnt']-1)/5 + 1);
?>
counts中存储着将DB中存储的数据数量存储到变量cnt中的值。我们使用SQL语句并使用fetch_assoc()将获取的值存储到count中作为关联数组。在这里,当按照每5条记录分割时,最大页面数为{(记录数-1)/5+1}的整数部分,因此我们使用floor函数向下取整。这样就得到了最大页面数。
此外,将页面按照每页5个项目进行更改,意味着在指定SQL语句的?处插入值时,需要按照5的倍数如0,5,10…来实现。
<?php
$page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT);
$page = ($page ?: 1);
$start = ($page-1)*5;
$stmt->bind_param('i', $start);
$result = $stmt->execute();
?>
这部分是这样的。
我将URL参数中指定的页数的值存储在变量page中。同时,需要根据备忘录数来判断这个页数是否存在。可以使用if语句,但为简化起见,这次我们将使用三元运算符(空值合并运算符)。
请参考以下有关Elvis运算符的内容。
【PHP入门】三元运算符是什么?掌握它以使代码更简洁
https://www.sejuku.net/blog/23070
如果通过Elvis运算符指定的页码存在(条件为True),则返回该值;如果不存在(条件为False),则返回1。当指定页码时,需要计算该页的第一个备忘录在数据库中的第几行。
例如,第3页的第一个备忘录是第11个备忘录,第5页的第一个备忘录是第21个备忘录,因此计算公式为{(页码-1)*5},即{($page-1)*5},并将该值存储在变量start中。
通过将此变量start用bind_param绑定到SQL语句的语句中,可以每次切换5个条目来分页。
让我们从备忘录列表页面开始,实现可以跳转到下一页或上一页的功能。
<p>
<?php if($page > 1): ?>
<a href="?page=<?php echo $page-1; ?>"><?php echo $page-1?>ページ目</a> |
<?php endif; ?>
<?php if($page < $max_page): ?>
<a href="?page=<?php echo $page+1; ?>"><?php echo $page+1?>ページ目</a>
<?php endif; ?>
</p>
如果我们不考虑条件语句的话,这个非常简单。我们创建一个链接,将当前页面减去1的值作为URL参数传递,并实现可以跳转到前一页的功能。同样,跳转到下一页也是类似的。这个条件语句的作用是实现在第一页时无法跳转到前一页,在最后一页时无法跳转到下一页。
笔记的详细信息
备忘录列表界面已完成。由于备忘录列表中的备忘录字符数限制为最多50个字符,所以我们将创建各个备忘录的详细页面。在index.php中,备忘录链接指向memo.php,因此我们要查看memo.php。
<!DOCTYPE html>
<html lang="ja">
<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">
<title>メモの詳細</title>
</head>
<body>
<?php
require('dbconnect.php');
$stmt = $db->prepare('select * from memos where id=?');
if (!$stmt){
die($db->error);
}
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
if (!$id){
echo '表示するメモを指定してください';
exit();
}
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($id, $memo, $created);
$result = $stmt->fetch();
if(!$result){
echo '指定されたメモは見つかりませんでした';
exit();
}
?>
<div><pre><?php echo htmlspecialchars($memo); ?></pre></div>
<p>
<a href="update.php?id=<?php echo $id ?>">編集する</a> |
<a href="delete.php?id=<?php echo $id ?>">削除する</a> |
<a href="/memo">一覧へ</a>
</p>
</body>
</html>
到这一步,会出现很多类似的代码。
使用require()连接到数据库,并通过URL参数接收备忘录的id,但是如果从备忘录列表点击备忘录链接,那么URL参数已经自动包含了id。
在详细画面中,我们提供了指向备忘录编辑页面和删除页面的链接。
删除和编辑备忘录
删除备忘录的界面位于delete.php上进行操作。
<?php
require('dbconnect.php');
$stmt = $db->prepare('delete from memos where id=?');
if(!$stmt){
die($db->error);
}
$id = filter_input(INPUT_GET,'id', FILTER_SANITIZE_NUMBER_INT);
if(!$id){
echo 'メモが正しく指定されていません';
exit();
}
$stmt->bind_param('i', $id);
$success = $stmt->execute();
if(!$success){
die($db->error);
}
header('Location: index.php');
?>
与备忘录详细页面相同,通过URL参数接收到id,并在SQL中执行DELETE语句。
如果DELETE成功执行,就在header中指定跳转到index.php页面。
关于备忘录的编辑页面,可以在update.php上进行操作。
<?php
require('dbconnect.php');
$stmt = $db->prepare('select * from memos where id=?');
if(!$stmt){
die($db->error);
}
$id=filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($id, $memo, $created);
$result = $stmt->fetch();
if(!$result){
die('メモの指定が正しくありません');
}
?>
<!DOCTYPE html>
<html lang="ja">
<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">
<title>メモの編集</title>
</head>
<body>
<form action="update_do.php" method="post">
<input type="hidden" name="id" value="<?php echo $id; ?>" >
<textarea name="memo" cols="30" rows="10" placeholder="メモを入力してください"><?php echo htmlspecialchars($memo) ?></textarea><br>
<button type="submit">編集する</button>
</form>
</body>
</html>
在更新信息时,仍然通过URL参数传递id以进行备忘录的更新。
此时,为了保证更新后的备忘录不会生成新的id,我们将input的type设为hidden,将原来的id值和更新后的备忘录内容一并发送至update_do.php。
<?php
require('dbconnect.php');
$stmt = $db->prepare('update memos set memo=? where id=?');
if(!$stmt){
die($db->error);
}
$id=filter_input(INPUT_POST,'id', FILTER_SANITIZE_NUMBER_INT);
$memo=filter_input(INPUT_POST,'memo', FILTER_SANITIZE_STRING);
$stmt->bind_param('si', $memo, $id);
$success = $stmt->execute();
if(!$success){
die($db->error);
}
header('Location: memo.php?id='. $id);
?>
通过update.php的表单接收传递过来的值,并将其重新存储到数据库中。
id的值保持不变,memo的内容会被更改并记录到数据库中,然后通过header跳转到详细备忘录页面。
最后
這個記事結束了,關於製作記事應用程式的部分。當我回頭看程式碼時,我不禁想著為什麼會變成這樣呢…?哈哈。通過製作一個具有CRUD功能的記事應用程式,我學到了php的基礎。我目前正在製作另一個應用程式,等它完成後我也會寫一篇文章介紹。