DB和PHP的连接为了连接DB和PHP,我会创建一个只负责连接的PHP文件。
在未来创建多个文件的备忘录应用中,为每个文件编写与DB连接相关的代码很麻烦且不易维护,因此我会准备一个专用于DB连接的文件。
<?php
$db = new mysqli("localhost:9000", "root", "root", "mydb");
?>
生成一个mysqli对象的实例并将其赋值给变量$db。参数依次为localhost:端口号、用户名、密码、数据库名。
显示备忘录列表
创建一个能够显示备忘录列表的php文件。作为这个页面上想要添加的功能
-
メモの作成ボタンの設置(input.htmlへの遷移)
<?php
require('dbconnect.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">
<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>
<h1>メモ帳</h1>
<p>→<a href="input.html">新しいメモ</a></p>
<?php if (!$result): ?>
<p>表示するメモがありません</p>
<?php endif; ?>
<?php $stmt->bind_result($id, $memo, $created); ?>
<?php while($stmt->fetch()): ?>
<div>
<h2><a href="memo.php?id=<?php echo $id; ?>"><?php echo htmlspecialchars(mb_substr($memo,0,50)); ?></a></h2>
<time><?php echo htmlspecialchars($created) ?></time>
</div>
<hr>
<?php endwhile; ?>
<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>
从上述代码中,我们将提取与所需功能相关的部分,并将它们汇总。
关于”创建备忘录按钮的设置(跳转到input.html)”。
<p>→<a href="input.html">新しいメモ</a></p>
通过在a标签的href属性中设置input.html,可以注册一个新的便签。
展示注册记事的内容和日期
<?php
require('dbconnect.php');
$stmt = $db->prepare('select * from memos order by id desc limit ?, 5');
if (!$stmt){
die($db->error);
}
$stmt->bind_param('i', $start);
$result = $stmt->execute();
?>
<?php if (!$result): ?>
<p>表示するメモがありません</p>
<?php endif; ?>
<?php $stmt->bind_result($id, $memo, $created); ?>
<?php while($stmt->fetch()): ?>
<div>
<h2><a href="memo.php?id=<?php echo $id; ?>"><?php echo htmlspecialchars(mb_substr($memo,0,50)); ?></a></h2>
<time><?php echo htmlspecialchars($created) ?></time>
</div>
<hr>
<?php endwhile; ?>
通过使用 require 来指定文件名,可以使用该文件中已经编写的内容。
现在我们正在通过 require dbconnect.php 的方式,所以在这个时点上数据库连接已经完成。
通过 prepare 方法,可以将指定的 SQL 语句提交给数据库执行。上述的 SQL 语句的意思是“从 memos 中按降序取出任意个数的数据,最多只取 5 条”。如果数据库服务器无法准备该语句,prepare 方法会返回 FALSE,因此可以使用 if 语句来记录发生了哪种错误。通过 bind_param 方法,在 SQL 语句中可以将值传递给问号占位符。
使用execute方法执行SQL语句。如果无法成功执行,则返回FALSE,这时会使用条件分支显示没有备忘录的消息。
在这里,使用bind_result方法将提取的数据存储到变量$id, $memo, $created中。
如果SQL语句有结果,比如SELECT语句,就需要使用fetch逐个提取数据。因此,需要使用while循环处理,在存在数据的情况下循环提取数据。
我們使用 h2 標籤顯示備註的內容,並使用 time 標籤顯示備註的日期和時間。通過 bind_result 函數,備註的內容保存在變數 memo 中,備註的日期和時間保存在 created 中,只需使用 echo 函數即可顯示它們。然而,在 HTML 中,特殊字符如 < 或 > 具有特殊意義,不能直接寫入。為了正確顯示備註內容,我們需要使用 htmlspecialchars() 函數,同時考慮到可能存在非常長的字串作為備註內容,我們使用 mb_substr() 函數,將最大字數限制為50個字。
最后我打算在本文中到这里为止。
我想将这些写成文章。由于是为了整理自己的思绪而写的,所以可能会有很多不易阅读和理解的地方,但如果能对你有所帮助,我会很高兴的。