PHP教程
首先
我是MakeIT AdventCalendar的第六天的yamato3310。
由于我似乎写不出技术方面的诗歌,所以我决定写一个类似教程的东西来回顾我目前正在学习的PHP。
这是我第一次向Qiita投稿,可能会有些奇怪的地方,请大家温和地给我点评。非常感谢!
我写这篇文章的目标是提供关于如何连接数据库的教程。
这篇文章的结构是通过实际编写待办事项清单并操作数据库,而不是进行详细解释。
我们使用XAMPP环境。请参考这里的安装方法。
这里会解释如何使用XAMPP并创建PHP和MySQL环境,以便初学者也能理解。
我已经确认可以在手头上运作,但如果有什么奇怪的地方,请指出来,谢谢。
请务必查看最后附上的有用链接。
我将先贴上本次要使用的代码。
<?php
class Todo {
private $title;
private $content;
private $flg;
public function __construct ($row) {
$this->title = $row["title"];
$this->content = $row["content"];
$this->flg = 1;
}
//現在の自分のtodoリストを取得(flg == 1)
public function get_todo () {
global $pdo;
$query = $pdo->query ("select * from todolist where flg = 1");
$lists = $query->fetchAll (PDO::FETCH_ASSOC);
return $lists;
}
//終了した自分のtodoリストを取得(flg == 0)
public function end_todo () {
global $pdo;
$query = $pdo->query ("select * from todolist where flg = 0");
$lists = $query->fetchAll (PDO::FETCH_ASSOC);
return $lists;
}
//flgの変更
public function update ($id) {
global $pdo;
$query = $pdo->prepare ("update todolist set flg = 0 where id = :id");
$query->bindValue (":id", (int) $id);
$query->execute ();
}
//リストを追加
public function insert ($list) {
global $pdo;
$prepare = $pdo->prepare ("insert into todolist value ('', :title, :content, :flg)");
$prepare->bindValue (":title", $list->title);
$prepare->bindValue (":content", $list->content);
$prepare->bindValue (":flg", $list->flg);
$prepare->execute ();
}
//終了したリストの削除
public function delete ($id) {
global $pdo;
$prepare = $pdo->prepare ("delete from todolist where id = :id");
$prepare->bindValue (':id', (int) $id);
$prepare->execute ();
}
}
//DBとの接続
try {
$pdo = new PDO (
'mysql:host=localhost; dbname=todo; charset=utf8',
'root',
'',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
]
);
} catch (PDOException $e) {
exit ($e->getMessage ());
};
//($_POST['title']が入力されていたらリストに追加
if (isset ($_POST['title'])) {
$list = new todo ($_POST);
$list->insert ($list);
header ('Location: http://localhost/ToDo/index.php');
};
//$_POST['id']が1のときの0に変更、0のときは削除
if (isset ($_POST['id'])) {
if ($_POST['flg'] === '1') {
todo::update ($_POST['id']);
} else {
todo::delete ($_POST['id']);
};
header ('Location: http://localhost/ToDo/index.php');
};
?>
<!DOCTYPE html>
<html lang="en">
<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">
<title>Document</title>
<link rel='stylesheet' href='index.css'>
</head>
<body>
<ul class='ul'>
<li>これからやること</li>
<?php
$lists = todo::get_todo ();
foreach ($lists as $list) {
?>
<li class='todo'><?php echo htmlspecialchars ($list['title']) ." " .htmlspecialchars ($list['content']); ?></li>
<li>
<form method='POST'>
<input type='hidden' value='<?php echo $list['id']; ?>' name='id'>
<input type='hidden' value='<?php echo $list['flg']; ?>' name='flg'>
<input type='submit' value='終了' class='todo_button'>
</form>
</li>
<?php
};
?>
</ul>
<ul class='ul'>
<li>もうやったこと</li>
<?php
$lists = todo::end_todo ();
foreach ($lists as $list) {
?>
<li class='todo'><?php echo htmlspecialchars ($list['title']) ." " .htmlspecialchars ($list['content']); ?></li>
<li>
<form method='POST'>
<input type='hidden' value='<?php echo $list['id']; ?>' name='id'>
<input type='hidden' value='<?php echo $list['flg']; ?>' name='flg'>
<input type='submit' value='削除' class='todo_button'>
</form>
</li>
<?php
};
?>
</ul>
<form method="POST" class='form'>
<input type="text" placeholder="タイトルを入力してね" name="title" class='title'>
<textarea placeholder="内容を入力してね" name='content' class='content'></textarea>
<input type="submit" value="追加" class='todo_button'>
</form>
</body>
</html>
我打算用这个来解释如何使用数据库。
桌子设计
首先,我们需要创建一个数据库。
CREATE DATABASE `todo`;
指定要使用的数据库。
USE `todo`;
只需要在XAMPP的phpMyAdmin中进行复制粘贴。
CREATE TABLE `todolist` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '番号',
`title` VARCHAR(30) NOT NULL COMMENT 'タイトル',
`content` VARCHAR(255) NOT NULL COMMENT '内容',
`flg` INT NOT NULL COMMENT '1のときは実行中、0のときは終了したもの',
PRIMARY KEY (`id`)
)DEFAULT CHARSET = utf8mb4;
访问数据库
try {
$pdo = new PDO (
'mysql:host=localhost; dbname=todo; charset=utf8',
'root',
'',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
]
);
} catch (PDOException $e) {
exit ($e->getMessage ());
};
在这部分中,我们进行了对数据库的访问。基本上,它的形式是这样的。
当连接到数据库时,我们会在PDO实例中进行设置。
具体的说明将被省略,但在这次的连接中,我将解释以下两个选项。
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
使用此选项将会抛出异常,通过捕捉异常,可以编写处理发生异常时的代码。
PDO::ATTR_EMULATE_PREPARES设置用于确定是否使用准备语句的仿真功能。
请参考这个页面以获取更详细的信息。
连接数据库时的PHP摘要总结。
待办事项类
在这个ToDo类中,我添加了发布和删除自己任务的功能。
・获取待办事项()获取数据库中flg为1的帖子。
・结束待办事项()获取数据库中flg为0的帖子。
・更新()将选中的帖子的flg从1更改为0。
・插入()发布帖子。
・删除()删除帖子。
在这里提到的flg是指,当您第一次发布时,flg会被设置为1,而在结束时会被改为0。
发出查询
关于如何发出查询,我们将参考get_todo()进行解释。
public static function get_todo () {
global $pdo;
$query = $pdo->query ("select * from todolist where flg = 1");
$lists = $query->fetchAll (PDO::FETCH_ASSOC);
return $lists;
}
如果用户没有输入,则使用PDO::query方法。结果存储在$lists变量中。$lists的内容如下所示。
Array (
[0] => Array (
[id] => 5
[title] => title
[content] => content
[flg] => 1
)
)
当用户输入被包含在内时,应使用占位符。
使用占位符可以自动进行转义处理,以防止SQL注入攻击。
public static function update ($id) {
global $pdo;
$query = $pdo->prepare ("update todolist set flg = 0 where id = :id");
$query->bindValue (":id", (int) $id);
$query->execute ();
}
下面是一个选项的中文本地化释义:
:id 是一个占位符,使用 $query->bindValue 方法将受到的参数 id 嵌入到 :id 中。
使用 $query->execute() 执行查询。
将项目添加到列表和从列表中删除。
//$_POST['title']が入力されていたらリストに追加
if (isset ($_POST['title'])) {
$list = new todo ($_POST);
$list->insert ($list);
header ('Location: http://localhost/ToDo/index.php');
};
//$_POST['id']が1のときは0に変更、0のときは削除
if (isset ($_POST['id'])) {
if ($_POST['flg'] === '1') {
todo::update ($_POST['id']);
} else {
todo::delete ($_POST['id']);
};
header ('Location: http://localhost/ToDo/index.php');
};
在上面的if语句中,我们进行了保存操作,当表单中的标题被发送过来时。
关于header(‘Location: http://localhost/ToDo/index.php’)部分,它是为了避免在保存操作后进行浏览器刷新时会再次进行POST发送并保存相同的内容,而是通过在保存后使用GET发送重定向到该页面,从而避免了在刷新页面时使用POST发送并保存内容。
在这个例子中,我们使用了http://localhost/ToDo/index.php,但请根据各自的情况修改该文件路径。
在下面的if语句中,我们检查从表单中发送来的id,并判断是否要修改或删除一起发送来的flg。
展示于画面上
<?php
$lists = todo::get_todo ();
foreach ($lists as $list) {
?>
<li class='todo'><?php echo htmlspecialchars ($list['title']) ." " .htmlspecialchars ($list['content']); ?></li>
<li>
<form method='POST'>
<input type='hidden' value='<?php echo $list['id']; ?>' name='id'>
<input type='hidden' value='<?php echo $list['flg']; ?>' name='flg'>
<input type='submit' value='終了' class='todo_button'>
</form>
</li>
<?php
};
?>
$lists = todo::get_todo ()通过此代码,我们可以获取我目前保存的所有代办事项,并将它们存入$lists中。
然后,我们可以使用foreach循环逐一提取出每一项,并将标题和内容组合在一起,并创建一个用于表示完成的按钮。
htmlspecialchars()是一个用于执行转义处理的函数。
为了防范XSS攻击,由于用户输入的内容未必完全符合我们的预期,所以我们需要进行适当的转义处理。
最后
请问你认为怎么样呢?我试着总结了一下连接数据库的方法。
下一篇投稿计划使用Laravel创建待办事项清单。是的,我会再次创建待办事项清单。
我认为明天会有比我更好的文章发布,请务必关注那篇文章。
我将提供一个我认为非常有参考价值的链接,请务必参考一下。
【PHP超入门】类~异常处理~PDO基础
请尝试使用这个CSS来美化一下我制作的待办事项清单。
body {
margin: 0;
padding: 0;
}
input {
display: block;
}
.content {
width: 500px;
height: 100px;
margin: 0 auto;
display: block;
}
.todo {
float: left;
}
li {
display: block;
}
.todo_button {
background-color: white;
margin: 0 auto;
}
.ul {
background-color: #eeeeee;
width: 1000px;
height: 200px;
text-align: center;
margin: 50px auto;
}
.title {
margin: auto;
width: 500px;
}
.form {
display: block;
margin: 0 auto;
}