PHPでToDoリストを作る方法【サンプルコード付き】

php

PHPでToDoリストを作る方法

PHPでToDoリストを作る方法を紹介します。このサンプルでは、タスクの追加・完了・一覧表示を行い、内容をCSVファイルへ保存できます。登録したタスクはページを再読み込みしても保持されるため、簡単なタスク管理や作業管理、買い物リストなどを手軽に作成したい場合に利用できます。

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

デモ

PHP ToDoリスト
資料を作成する
メールを確認する

コードをコピーして使おう!

<?php

// ToDoデータを保存するCSVファイルです
$csv_file = 'data.csv';

// HTMLエスケープ用です
function h($value)
{
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}

// CSVデータを読み込みます
function load_tasks($csv_file)
{
    $tasks = [];

    if (file_exists($csv_file)) {

        $fp = fopen($csv_file, 'r');

        if ($fp) {

            fgetcsv($fp);

            while (($row = fgetcsv($fp)) !== false) {

                if (count($row) >= 3) {

                    $tasks[] = [
                        'id' => $row[0],
                        'task' => $row[1],
                        'done' => $row[2]
                    ];

                }

            }

            fclose($fp);

        }

    }

    return $tasks;
}

// CSVへ保存します
function save_tasks($csv_file, $tasks)
{
    $fp = fopen($csv_file, 'w');

    fputcsv($fp, ['id', 'task', 'done']);

    foreach ($tasks as $task) {

        fputcsv($fp, [
            $task['id'],
            $task['task'],
            $task['done']
        ]);

    }

    fclose($fp);
}

// データを読み込みます
$tasks = load_tasks($csv_file);

// タスク追加処理です
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['task'])) {

    $task_text = trim($_POST['task']);

    if ($task_text !== '') {

        // 最大IDを取得します
        $max_id = 0;

        foreach ($tasks as $task) {

            if ((int)$task['id'] > $max_id) {
                $max_id = (int)$task['id'];
            }

        }

        $tasks[] = [
            'id' => $max_id + 1,
            'task' => $task_text,
            'done' => '0'
        ];

        save_tasks($csv_file, $tasks);

    }

    header('Location: index.php');
    exit;

}

// 完了状態切り替え処理です
if (isset($_GET['toggle'])) {

    foreach ($tasks as $key => $task) {

        if ($task['id'] == $_GET['toggle']) {

            $tasks[$key]['done'] = ($task['done'] === '1') ? '0' : '1';

            break;

        }

    }

    save_tasks($csv_file, $tasks);

    header('Location: index.php');
    exit;

}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHP ToDoリスト</title>

<style>

body{
    font-family:sans-serif;
    background:#f8fafc;
    margin:40px;
}

.php-todo-list_wrap{
    max-width:800px;
    margin:auto;
    padding:24px;
    background:#ffffff;
    border:1px solid #e5e7eb;
    border-radius:18px;
}

.php-todo-list_title{
    font-size:22px;
    font-weight:bold;
    margin-bottom:20px;
}

.php-todo-list_form{
    display:flex;
    gap:10px;
    margin-bottom:20px;
}

.php-todo-list_input{
    flex:1;
    padding:10px;
}

.php-todo-list_button{
    padding:10px 20px;
}

.php-todo-list_item{
    display:flex;
    align-items:center;
    gap:14px;
    padding:14px;
    border:1px solid #d1d5db;
    border-radius:10px;
    margin-top:10px;
}

.php-todo-list_toggle{
    width:34px;
    height:34px;
    border:4px solid #8b8b95;
    border-radius:50%;
    background:#ffffff;
    position:relative;
    flex-shrink:0;
}

.php-todo-list_toggle.done{
    background:#0f766e;
    border-color:#0f766e;
}

.php-todo-list_toggle.done::after{
    content:"";
    position:absolute;
    left:50%;
    top:45%;
    width:8px;
    height:14px;
    border-right:4px solid #ffffff;
    border-bottom:4px solid #ffffff;
    transform:translate(-50%,-50%) rotate(45deg);
}

.php-todo-list_text.done{
    text-decoration:line-through;
    color:#6b7280;
}

</style>

</head>

<body>

<div class="php-todo-list_wrap">

<div class="php-todo-list_title">PHP ToDoリスト</div>

<form class="php-todo-list_form" method="post">

<input
class="php-todo-list_input"
type="text"
name="task"
placeholder="タスクを入力してください"
>

<button class="php-todo-list_button" type="submit">
追加
</button>

</form>

<?php foreach ($tasks as $task): ?>

<div class="php-todo-list_item">

<a
href="?toggle=<?= h($task['id']) ?>"
class="php-todo-list_toggle <?= $task['done']==='1' ? 'done' : '' ?>"
></a>

<span class="php-todo-list_text <?= $task['done']==='1' ? 'done' : '' ?>">
<?= h($task['task']) ?>
</span>

</div>

<?php endforeach; ?>

</div>

</body>
</html>

ファイル構成と設置方法

このサンプルでは、index.phpdata.csv を同じフォルダに配置して使用します。タスク名と完了状態は data.csv に保存されます。

sample/
├── index.php
└── data.csv
  

index.phpdata.csv をサーバーへアップロードし、ブラウザから index.php にアクセスしてください。タスクを追加すると data.csv に追記され、丸いチェックボタンをクリックすると完了状態が 01 で切り替わります。


コメント