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;
}

广告
将在 10 秒后关闭
bannerAds