こんにちは!
今回は素のPHPを使って簡単なメモ帳アプリを開発していきたいと思います。

「PHPでメモ帳とか作ってみたいけど、作り方がわからないな…」
「何かを作りながらPHPの使い方を学びたい…」
などをお考えの方は参考になる内容になるのではと思います。
この記事では、以下のような読者を想定しています。
- PHPの基礎学習を終えた方
- HTMLとCSSの基礎を身につけている方
- 何かものを作りながらPHPを学習したい方
本記事を最後まで読んでいただけたら、以下のようなことがわかるかと思います。
- PHPを使ったWebアプリケーション制作の全体的な流れ
- PHPを使ったCRUD機能の作り方
- 最低限のセキュリティ対策
CRUDというのは、Create・Read・Update・Deleteの頭文字をとったもので、作成・表示・更新・削除機能のことです。
何かプログラミング言語を習得するときは、具体的なものを作りながら学習していくのが最も効率がいいです。
本記事を読むことで、より高度なアプリケーションを作っていくきっかけになれば幸いです。
それでは、みていきましょう!
メモ帳アプリの概要
以下のようなメモ帳アプリを作っていきます。なお、HTMLやCSSは本記事の主題ではないため、簡素なものになっています。ご了承ください。
こちらのメモ帳アプリの制作を通じて、PHPの基本的な使い方やCRUD機能の実装方法などを学んでいただけたらと思います。
メモ帳アプリの設計とデータベースの構築
まず、メモ帳アプリの機能としてどのような機能が要求されるか考えてみましょう。
およそ、以下のような機能が必要になるはずです。
- ログイン・ログアウト機能(これはなくても可)
- メモ一覧表示機能
- メモ作成機能
- メモ編集機能
- メモ削除機能
また、画面は以下のように遷移するものを制作していきます。

今回は以下のようなディレクトリ構成で制作していきます。
index.php
signin.php
logout.php
memos/
|-memo.php
|-edit.php
|-create.php
|-update.php
|-delete.php
css/
|-memo.css
|-edit.php
|-create.css
また、MySQLはすでにローカル環境にインストールされている前提で進めさせていただきます。
MySQLを起動していない場合は、以下で起動しておきます。
mysql.server start
次に、データベースを作成していきましょう。
まずはMySQLの中に入ります。
mysql -u ユーザ名 -p
MySQLのユーザ名を入力してEnterを押すと、パスワードを聞かれますので設定しておいたパスワードを入力してください。
中に入ることができたら、以下のコマンドでデータベースを確認しましょう。
SHOW databases;
すでに何かしらにデータベースを作成している場合は、名前が被らないデータベース名でデータベースを作成しましょう。
データベース名はなんでも良いですが、今回は「sample」とでもしておきましょう。
CREATE DATABASE sample;
しかし、データベースの中をテーブルをみてみると、まだテーブルがない状態のはずです。
USE sample;
SHOW tables;
そこで、今回必要となるテーブルを用意しておきましょう。
必要となるテーブルは以下の2つだけです。
- usersテーブル・・・メモ帳アプリを使うユーザデータを格納するテーブル
- memosテーブル・・・メモデータを格納するテーブル
それでは作っていきます。
CREATE TABLE users (
id int auto_increment primary key,
email varchar(255) not null,
password varchar(255) not null
);
CREATE TABLE memos (
id int auto_increment primary key,
title varchar(255) not null,
body varchar(255),
created_at timestamp not null,
updated_at timestamp not null
);
これでusersテーブルとmemosテーブルが作成されたはずです。
以下のコマンドで確認しておきましょう。
SHOW tables;
これでひとまず準備は整いました。
ユーザの新規登録とログイン
それでは、ここからはユーザの新規登録機能とログイン機能を作っていきましょう。
ログイン機能
まずは、ルートディレクトリに「index.php」を作成します。
ここではログイン画面を作成していきます。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>memo app | ログイン画面</title>
</head>
<body>
<h1>ログイン画面</h1>
<form action="index.php" method="POST">
メールアドレス<input type="email" name="email" value="" /><br />
パスワード<input type="password" name="password" value="" /><br />
<input type="submit" name="login" value="ログイン">
</form>
<a href="signin.php">新規登録</a>
</body>
</html>
動作確認をしやすくするために、仮でログインの成功先のメモ一覧画面も作っておきましょう。
「memos/memo.php」を作成し、編集します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/memo.css">
<title>memo app | ホーム画面</title>
</head>
<body>
<h2>メモ一覧</h2>
</body>
</html>
次に、ログインの機能をPHPで書いていきます。
index.phpに戻って、以下を追加します。
<?php
session_start();
$err_msg = '';
if (isset($_POST['login'])) {
$email = $_POST['email'];
$password = $_POST['password'];
try {
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
$sql = 'select * from users where email=:email;';
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $email);
$stmt->execute();
$user = $stmt->fetch();
if (password_verify($password, $user['password'])) {
// DBのユーザ情報をセッションに保存
$_SESSION['id'] = $user['id'];
$_SESSION['email'] = $user['email'];
header('Location: http://localhost:8080/memos/memo.php');
} else {
$err_msg = "メールアドレスまたはパスワードが誤りです。";
}
$stmt = null;
$db = null;
exit;
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
}
?>
うわー難しそうと思うかもしれませんが、ちょっと待ってください。一つ一つ分解していけば簡単です。
まず、以下のコード。
session_start();
これは、セッションを新しく開始する、または既存のセッションを再開する、という意味です。
セッションとは何かというと、クライアントからサーバーへ接続し、切断されるまでのことを指しています。つまり、本アプリでいうと、ログインしてからログアウトするまでの間です。
そして、Webアプリケーションでは、ログインしてからログアウトされるまでの間で特定のデータを保持しておくことが可能です。例えば、今ログインしているユーザが誰であるか、ECサイトなどの場合は買い物カゴにどんな商品が入っているかなどです。
今回のメモ帳アプリではログインユーザの情報をセッションに保存します。
こうすることで、ログイン以降の画面ではセッションにユーザデータが保存されているはずですので、保存されていなかった場合はログイン認証を通過していないユーザということになります。
ログイン認証を通過せずにメモ帳アプリに入った場合は、ログイン画面に戻すという処理を実装します。
次に、以下のコードを見てみましょう。
if (isset($_POST['login'])) {
...
}
PHPでは、「$_POST」でPOST送信されたリクエストのデータを取得することができます。
ログイン画面でのリクエストというのは、ログインフォームから送られてくるデータのことです。
$_POST[‘login’]のキーの部分は、HTMLのname属性の値が入ります。
今回の場合は、
<input type="submit" name="login" value="ログイン">
となっているので、$_POST[‘login’]の値は「ログイン」となります。
つまり、$_POST[‘login’]の値が存在するということは、ログインボタンが押されたことになります。
ログインボタンが押された場合にログイン処理を走らせたいので、if文で条件付けしているわけですね。これがないと、単にログイン画面に遷移した場合にもログインの処理が走ってしまいますので、注意しましょう。
次に、以下のコード。
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
これはMySQLというデータベースへ接続するコードです。
第一引数にはホスト名とデータベース名を指定し、第二引数にはデータベースのユーザ名、第三引数にはデータベースのパスワードを指定します。
そして、PDOオブジェクトを生成しています。
PDOというのは、「PHP Data Objects」の略で、要するにデータベースを扱うオブジェクトだと考えていただければ良いでしょう。このPDOオブジェクトでデータベースを操作していきます。
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $email);
$stmt->execute();
$user = $stmt->fetch();
こちらでSQLを実行しています。
この場合は、リクエストとして送信されたメールアドレスがデータベースの中にあるか問い合わせています。あれば、そのユーザを取得します。
`fetch()`メソッドは、デフォルトでは該当するデータを配列形式で返します。
ちなみに、以下のような書き方もあります。
$sql = 'select * from users where email=?;';
$stmt = $db->prepare($sql);
$stmt->execute(array($email));
$user = $stmt->fetch();
ですが、本記事の書き方の方がセキュリティ的な観点で良いです。
具体的には、SQLインジェクションという攻撃を防いでいます。
SQLインジェクションについては詳しくは解説しませんが、以下の記事がわかりやすいと思います。
if (password_verify($password, $user['password'])) {
// DBのユーザ情報をセッションに保存
$_SESSION['id'] = $user['id'];
$_SESSION['email'] = $user['email'];
header('Location: http://localhost:8080/memos/memo.php');
} else {
$err_msg = "メールアドレスまたはパスワードが誤りです。";
}
取得してきたユーザのパスワードとログインフォームからリクエストされたパスワードが一致していれば、すでに登録済みのユーザということになります。つまり、メモ帳アプリに入っても問題ないというユーザということです。
この場合は、セッションにユーザデータを保存してメモ一覧画面に遷移させます。
header('Location: http://localhost:8080/memos/memo.php');
こちらのコードにある「Location:」をレスポンスヘッダーにセットすることで、画面遷移することができます。
$err_msg = "メールアドレスまたはパスワードが誤りです。";
もし、パスワードに一致するユーザがデータベースに登録されていなければ、エラーメッセージを表示させています。
$stmt = null;
$db = null;
exit;
最後に、データベースの接続を切っておきます。
また、以下のようにデータベース操作を行う場合には例外処理を行うのが一般的です。
try {
...
} catch (PDOException $e) {
...
}
PDOを使う場合は、例外クラスはPDOExceptionになります。
次に、エラーメッセージがある場合は、エラーを画面に表示させておきましょう。
<form action="index.php" method="POST">
<?php if ($err_msg !== null && $err_msg !== '') { echo $err_msg . "<br />"; } ?>
...
</form>
これで、ログイン機能は完成です!
ユーザ新規登録機能
次に、ユーザ新規登録機能を作成していきます。
まずはコード全文をお見せします。
<?php
if (isset($_POST['signin'])) {
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
try {
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
$sql = 'insert into users(email, password) values(:email, :password)';
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $email);
$stmt->bindValue(':password', $password);
$stmt->execute();
$stmt = null;
$db = null;
header('Location: http://localhost:8080/index.php');
exit;
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>memo app | 新規登録画面</title>
</head>
<body>
<h1>新規登録画面</h1>
<form action="signin.php" method="POST">
メールアドレス<input type="email" name="email" value="" /><br />
パスワード<input type="password" name="password" value="" /><br />
<input type="submit" name="signin" value="新規登録">
</form>
<a href="index.php">ログイン画面へ</a>
</body>
</html>
こちらも基本的な流れはログイン画面と同じです。
以下のコードで新規登録ボタンが押下されたときに、ユーザ新規登録処理を走らせます。
if (isset($_POST['signin'])) {
...
}
また、新しいメソッドとして、パスワードをハッシュ化するメソッドが出てきました。
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
`password_hash`メソッドは、指定したパスワードをハッシュ化します。ハッシュ化というのは、要するに暗号化するという意味で、これにより安全にパスワードを保存することができます。
あとは、ログイン画面と同じく、SQLを実行してユーザデータをデータベースに保存しています。
さて、ここまででログイン機能とユーザ新規登録機能を作成することができました。
ここまでの動作確認として、ローカルサーバーを立ち上げて、ログインや新規登録を実際に行ってみると良いと思います。
php -S localhost:8080
メモの表示と追加機能の実装
ここからは、メモの一覧表示とメモ追加機能を作成していきます。
なお、ログイン後の画面については、わかりやすくするために「/memos」というディレクトリを作ってこの中にファイルを作成していくことにします。
まずは、メモ一覧画面から見ていきましょう!
メモ一覧画面
まずは、「/memos/memo.php」を作成します。
そして、以下のコードを書いていきます。
<?php
session_start();
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
// 認証確認
if (isset($_SESSION['id'])) {// ログインしているとき
try {
$sql = 'select * from memos';
$stmt = $db->prepare($sql);
$stmt->execute();
$memos = $stmt->fetchAll();
$stmt = null;
$db = null;
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
} else {
echo "ログインしていません<br />";
echo '<a href="../index.php">ログイン画面へ</a>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/memo.css">
<title>memo app | ホーム画面</title>
</head>
<body>
<?php if (isset($_SESSION['id'])) : ?>
<h2>メモ一覧</h2>
<a href="create.php">メモ新規作成</a>
<a href="../logout.php">ログアウト</a>
<div class="container">
<?php foreach ($memos as $memo) : ?>
<div class="card">
<div class="card-body">
<div class="card-title">
<p><?php echo $memo['title']; ?></p>
</div>
<div class="card-body">
<p><?php echo $memo['body']; ?></p>
</div>
</div>
<div class="link-group">
<a href="edit.php?id=<?php echo $memo['id']; ?>">編集</a>
<a href="delete.php?id=<?php echo $memo['id']; ?>">削除</a>
</div>
</div>
<?php endforeach ?>
</div>
<?php endif ?>
</body>
</html>
まず、以下のコードでセッションを開始します。
session_start();
そして、セッションにIDが保存されていれば、後続の処理を実行します。
if (isset($_SESSION['id'])) {// ログインしているとき
...
}
これはログインの際も書きましたが、セッションを持っていないということは、ログイン認証を通過していないことになりますので、メモ帳アプリの中に入れてはいけません。
これがないと、例えば、ログインを通さずにURLに直接「http://localhost:8080/memos/memo.php」などと打ち込まれるとメモ帳アプリに入れてしまいます。
そのため、こちらのif文を書いているわけですね。
あとは、今まで通りSQLを実行するだけですが、新しいメソッドが出てきたのでご紹介しておきます。
$memos = $stmt->fetchAll();
こちらの`fetchAll`メソッドは、該当するデータをすべて取得し、配列形式で返します。
今回はメモ一覧画面ですので、メモデータをすべて取得しているわけです。
他は基本的に今までと同じですね。
次に、ここで取り出したメモデータの一覧をHTMLに組み込んでいきます。
<?php foreach ($memos as $memo) : ?>
...
<?php endforeach ?>
この`foreach`文を使って、繰り返し処理で一つ一つのメモを表示しています。
これでメモ一覧画面は完成です。
最後に、必要な方はCSSを参照してください。
.container {
margin-top: 20px;
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card{
border: 1px solid black;
width: 300px;
border-radius: 5px;
padding: 10px 20px;
}
.link-group{
display: flex;
gap: 20px;
}
メモ追加画面
次に、メモ追加画面を作成していきます。
「memos/create.php」を作成します。
<?php
session_start();
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
if (isset($_SESSION['id'])) {
try {
if (isset($_POST['create'])) {
$title = $_POST['title'];
$body = $_POST['body'];
$sql = "insert into memos (title,body,created_at,updated_at) values (:title,:body,current_timestamp,current_timestamp)";
$stmt = $db->prepare($sql);
$stmt->bindValue(':title', $title);
$stmt->bindValue(':body',$body);
$result = $stmt->execute();
$db = null;
$stmt = null;
if ($result) {
header('Location: http://localhost:8080/memos/memo.php');
exit;
} else {
echo "メモの新規作成に失敗しました!";
}
}
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
} else {
echo "ログインしていません<br />";
echo '<a href="../index.php">ログイン画面へ</a>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/create.css">
<title>memo app | 新規作成画面</title>
</head>
<body>
<?php if (isset($_SESSION['id'])) : ?>
<div class="container">
<div class="card">
<form action="create.php" method="POST">
<div class="card-title">
<label for="title">タイトル</label>
<input type="text" name="title" value="" />
</div>
<div class="card-body">
<label for="body">本文</label>
<textarea name="body" id="body" cols="30" rows="10"></textarea>
</div>
<input type="submit" name="create" value="作成" />
</form>
</div>
<div class="link-group">
<a href="memo.php">戻る</a>
</div>
</div>
<?php endif ?>
</body>
</html>
ここからは、基本的には今までと同じような構造のコードが繰り返し出てきます。
メモ追加画面で今までと異なる箇所は、以下です。
- SQLのクエリ
- データ追加に成功したら、メモ一覧画面にリダイレクトする
リダイレクトの処理は、以下のようにheaderに`Location:`をつけて遷移先のURLを指定することで実現できます。
header('Location: http://localhost:8080/memos/memo.php');
最後に、メモ追加画面のCSSを載せておきます。必要な方は参照してください。
.container{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.card{
border: 1px solid black;
width: 300px;
border-radius: 5px;
padding: 20px 30px;
}
.card-body{
margin-top: 20px;
}
textarea{
vertical-align: top;
}
input[type="submit"] {
display: block;
margin: 10px auto 0 auto;
}
ここまでで、メモ帳アプリにメモ表示機能とメモ追加機能が備わりました。
メモ帳アプリとして最低限の実装はされているので、ここで一度動作を確認しておくと良いと思います。
メモの編集と削除機能の実装
次は、メモ編集機能とメモ削除機能を見ていきます。
メモ編集画面
メモを編集する画面を作っていきましょう。
なお、メモ一覧画面を作成した際に、メモ編集画面へのリンクはすでに設置してあるはずです。
「memos/edit.php」を作成します。
<?php
session_start();
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
if (isset($_SESSION['id'])) {
try {
$memo_id = isset($_GET['id']) ? $_GET['id'] : null;
$sql = 'select id,title,body from memos where id = :memo_id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':memo_id', $memo_id);
$stmt->execute();
$memo = $stmt->fetch();
$db = null;
$stmt = null;
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
} else {
echo "ログインしていません<br />";
echo '<a href="../index.php">ログイン画面へ</a>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/edit.css">
<title>memo app | 編集画面</title>
</head>
<body>
<?php if (isset($_SESSION['id'])) : ?>
<div class="container">
<div class="card">
<form action="update.php" method="POST">
<input type="hidden" name="memo_id" value="<?php echo $memo['id']; ?>">
<div class="card-title">
<label for="title">タイトル</label>
<input type="text" name="title" value="<?php echo $memo['title']; ?>" />
</div>
<div class="card-body">
<label for="body">本文</label>
<textarea name="body" id="body" cols="30" rows="10"><?php echo $memo['body']; ?></textarea>
</div>
<input type="submit" value="更新" />
</form>
</div>
<div class="link-group">
<a href="memo.php">戻る</a>
</div>
</div>
<?php endif ?>
</body>
</html>
メモ編集画面も、今までと基本の流れは同じですが、少し異なるところがあります。
まず、どのメモを編集するのかを知る必要があります。
そこで、メモ一覧に設置されているリンクを見てみましょう。以下のようになっています。
<a href="edit.php?id=<?php echo $memo['id']; ?>">編集</a>
後ろに「?id=」とついているのがわかりますでしょうか。
これは、クエリパラメータといって、遷移先の画面に何らかのデータを渡すことができます。
今回は「id」というデータをedit.phpに渡しています。このようにすることで、edit.phpではどのIDのメモを編集するのかがわかるようになります。
では、edit.phpでは渡ってきたIDをどう取得するのかというと、$_GET['id']
で取得することができます。
そして、このIDをもとに編集するべきメモをデータベースから取り出しています。
$memo_id = isset($_GET['id']) ? $_GET['id'] : null;
$sql = 'select id,title,body from memos where id = :memo_id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':memo_id', $memo_id);
$stmt->execute();
$memo = $stmt->fetch();
あとは、メモデータを各フォームタグのvalueにセットすれば、編集するべきメモのデータを表示させておくことができます。
そして、実際の更新処理は「update.php」という別ファイルで行います。理由は単純に一つのファイルに書くとごちゃごちゃして見づらくなるからですね。
「memos/update.php」を作成します。
<?php
$db = new PDO('mysql:host=localhost;dbname=sample', 'username', 'password');
try {
$memo_id = $_POST['memo_id'];
$title = $_POST['title'];
$body = $_POST['body'];
$sql = 'update memos set title = :title, body = :body, updated_at = current_timestamp where id = :memo_id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':memo_id', $memo_id);
$stmt->bindValue(':title', $title);
$stmt->bindValue(':body',$body);
$result = $stmt->execute();
$db = null;
$stmt = null;
if ($result) {
header('Location: http://localhost:8080/memos/memo.php');
exit;
} else {
header('Location: http://localhost:8080/memos/edit.php');
exit;
}
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
最後に、CSSを載せておきます。必要な方は参照してください。
.container{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.card{
border: 1px solid black;
width: 300px;
border-radius: 5px;
padding: 20px 30px;
}
.card-body{
margin-top: 20px;
}
textarea{
vertical-align: top;
}
input[type="submit"] {
display: block;
margin: 10px auto 0 auto;
}
メモ削除機能
最後に、メモ削除機能を実装していきましょう。
といっても、フォームはすでにメモ一覧画面に設置しています。
<form action="delete.php" method="DELETE">
<input type="hidden" name="memo_id" value="<?php echo $memo['id'] ?>">
<input type="submit" value="削除" />
</form>
削除処理はactionにある通り、delete.phpで行っていきましょう。
「delete.php」を作成します。
<?php
$db = new PDO('mysql:host=localhost;dbname=sample', 'keito', 'shitara@1324');
try {
$memo_id = $_GET['id'];
$sql = 'delete from memos where id = :memo_id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':memo_id', $memo_id);
$result = $stmt->execute();
$db = null;
$stmt = null;
if ($result) {
header('Location: http://localhost:8080/memos/memo.php');
exit;
} else {
echo "メモの削除に失敗しました!";
}
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
こちらでメモ削除機能を実装することができました。
補足
ここまでで、PHPを使ったメモ帳アプリの作成方法を見てきました。
ただ、これらはあくまで最低限の実装だということを覚えておいてほしいです。
他にも、以下のように検討するべき項目はたくさんあります。
- 繰り返し登場する処理の共通化
- 繰り返し登場するデータの定数化(ex. http://localhost:8080/)
- リクエストデータのバリデーション処理
- セキュリティ強化
- UI/UXの改善
ただし、今回はPHPを使ってWebアプリケーションをどう作成していくかという観点に絞って、最低限の実装を見てきました。
このあとは、このメモ帳アプリを強化していくのもよし、別の少しだけレベルを上げたアプリケーションを作っていくのもよしです。
まとめ
いかがでしたでしょうか。
今回はPHPを使ったメモ帳アプリということで、設計から実装までを見てきました。
同じようなコードの繰り返しになりましたよね。基本的な流れを一度掴んでしまえば、意外と簡単です。
本記事を足がかりに、更なる技術力向上に取り組んでいっていただければ、嬉しいです。
それでは、今回は以上になります。
コメント