<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>code &#8211; Party-Hearty</title>
	<atom:link href="https://creator-kid.com/tag/code/feed/" rel="self" type="application/rss+xml" />
	<link>https://creator-kid.com</link>
	<description>人生なんて死ぬまでの暇つぶし。</description>
	<lastBuildDate>Mon, 06 Jun 2022 04:01:35 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://creator-kid.com/wp-content/uploads/2022/06/favicon_pink.ico</url>
	<title>code &#8211; Party-Hearty</title>
	<link>https://creator-kid.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【PHP】$_POSTと$_SESSIONを使ってフォームの値を送信する方法を解説</title>
		<link>https://creator-kid.com/code/php-post_session/</link>
		
		<dc:creator><![CDATA[Ryuji]]></dc:creator>
		<pubDate>Mon, 14 Feb 2022 14:52:55 +0000</pubDate>
				<category><![CDATA[CODE]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web制作]]></category>
		<category><![CDATA[職業訓練]]></category>
		<guid isPermaLink="false">https://creator-kid.com/?p=4419</guid>

					<description><![CDATA[$_POSTと$_SESSIONを使用して値を送る仕組み 今回用意された問題は、「ロジック」と「ビュー（HTML）」を別ファイル管理しています。実際の現場でもこのスタイルで仕事を進めていくことが多いそうです。 PHPはH...]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="postと-sessionを使用して値を送る仕組み">$_POSTと$_SESSIONを使用して値を送る仕組み</h2>



<p>今回用意された問題は、「ロジック」と「ビュー（HTML）」を別ファイル管理しています。実際の現場でもこのスタイルで仕事を進めていくことが多いそうです。</p>



<p>PHPはHTML内にプログラミングを書き込める利便性がある反面、ソースコードが複雑になりがちです。しかし、ファイルの読み込みを使用することでデザインとプログラムを分離することができます。</p>



<p>「ロジック」と「ビュー（HTML）」を別ファイル管理するメリットは、「ロジック担当者（プログラマー）」と「ビュー担当者（コーダー）」で作業内容が違うので、両者とも自分が担当している作業を分業しながらWebシステムを作成することができます。</p>



<p>デメリットは、画面に表示する値（変数）を「ロジック担当者」と「ビュー担当者」で共有しておかなければなりません。</p>



<div class="wp-block-stk-plugin-cbox-notitle cbox is-style-site_color type_normal"><div class="cboxcomment">
<ul class="wp-block-list"><li>ロジック担当者（プログラマー）：ロジック部分作成</li><li>ビュー担当者（コーダー）：各パーツをコーディング</li></ul>
</div></div>



<h3 class="wp-block-heading" id="ページ遷移図">ページ遷移図</h3>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="768" src="https://creator-kid.com/wp-content/uploads/2022/02/img_2486-1024x768.jpg" alt="" class="wp-image-4454" srcset="https://creator-kid.com/wp-content/uploads/2022/02/img_2486-1024x768.jpg 1024w, https://creator-kid.com/wp-content/uploads/2022/02/img_2486-300x225.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/img_2486-768x576.jpg 768w, https://creator-kid.com/wp-content/uploads/2022/02/img_2486-485x364.jpg 485w, https://creator-kid.com/wp-content/uploads/2022/02/img_2486.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>この遷移図は理解しているとすごくわかりやすいのですが、理解できてないとチンプンカンプンだと思います。</p>



<p>この遷移図は、ユーザ入力画面からユーザ情報をフォーム（$_POST）と$_SESSIONで値を受け渡し、DB（データベース）に登録するまでの流れを表しています。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="768" src="https://creator-kid.com/wp-content/uploads/2022/02/img_2485-1024x768.jpg" alt="" class="wp-image-4453" srcset="https://creator-kid.com/wp-content/uploads/2022/02/img_2485-1024x768.jpg 1024w, https://creator-kid.com/wp-content/uploads/2022/02/img_2485-300x225.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/img_2485-768x576.jpg 768w, https://creator-kid.com/wp-content/uploads/2022/02/img_2485-485x364.jpg 485w, https://creator-kid.com/wp-content/uploads/2022/02/img_2485.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-stk-plugin-cbox cbox intitle is-style-site_color type_normal"><div class="box_title"><span class="span__box_title">ポイント</span></div><div class="cboxcomment">
<ul class="wp-block-list"><li>$_POSTと$_SESSIONの使い所</li><li>$_SESSIONの動向</li></ul>
</div></div>



<h3 class="wp-block-heading" id="functions-php">functions.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="functions.php" data-lang="PHP"><code>&lt;?php
function h($val)
{
  return htmlspecialchars($val, ENT_QUOTES, &#39;UTF-8&#39;);
}
function v($val)
{
  echo &#39;&lt;pre&gt;&#39;;
  var_dump($val);
  echo &#39;&lt;/pre&gt;&#39;;
}</code></pre></div>



<p>functions.phpによく使う関数を共通関数として登録しておく。</p>



<h4 class="wp-block-heading" id="h関数-サニタイジング用関数を定義">h関数：サニタイジング用関数を定義</h4>



<p>ユーザーが入力した値を使用する場合は注意（セキュリティ対策）が必要です。なぜならば、悪意があるユーザーが悪意ある値を入力してくる場合があるからです。不正なJavaScriptコードを使用して他のサイト訪問者に攻撃を仕掛けることを<strong>クロスサイトスクリプティング(XSS)</strong>と呼びます。</p>



<p>こういったトラブルを防ぐには、htmlspecialchars()関数でHTMLで意味をもつ記号をエスケープします。</p>



<p><strong>htmlspecialchars()関数：HTMLタグを無効化する関数</strong></p>



<p>第１引数($val)：string変換対象文字列<br>第２引数(ENT_QUOTES)：ENT_QUOTES→シングルクォートとダブルクォートを共に変換<br>第３引数(&#8216;UTF-8&#8217;)：stringエンコード</p>



<p>htmlspecialchars()関数を実行すると、HTMLで意味を持つ記号を実体参照に置き換えてくれます。(ex. 「&lt;」 → 「&amp;lt;」,「&amp;」→「&amp;amp;」)</p>



<p>このようなエスケープ操作のことをサニタイジングや無害化と呼びます。</p>



<h4 class="wp-block-heading" id="v関数-デバッグ用関数を定義">v関数：デバッグ用関数を定義</h4>



<p>デバック時に使用するvar_dump()関数をpreタグで囲んだ関数を定義しておく。preタグで囲むことでvar_dump()関数を表示した際に見えやすくしている。</p>



<h3 class="wp-block-heading" id="form1-php">form1.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="form1.php" data-lang="PHP"><code>&lt;?php
session_start();
session_regenerate_id(TRUE);

require_once __DIR__ . &#39;/functions.php&#39;;


v($_SESSION);
$name    = isset($_SESSION[&#39;name&#39;])    ? $_SESSION[&#39;name&#39;]    : NULL;
$subject = isset($_SESSION[&#39;subject&#39;]) ? $_SESSION[&#39;subject&#39;] : NULL;
$body    = isset($_SESSION[&#39;body&#39;])    ? $_SESSION[&#39;body&#39;]    : NULL;

require &#39;form1_view.php&#39;;</code></pre></div>



<h4 class="wp-block-heading" id="session-start-関数-セッション変数利用開始する関数">session_start()関数：セッション変数利用開始する関数</h4>



<p>session_start()関数を呼び出すことで、サーバ側に値を保存するセッション変数「$_SESSION」を使用できるようになります。他のページと値を共有したいときに使用します。</p>



<p>セッションは、クッキーを使ってユーザを認識し必要なデータをサーバ側に保存して使用します。データがサーバ側に保存されるため、悪意あるユーザにデータを改ざんされる心配がありません。クッキーに比べて安全性が高く、データ量の制限も実質ありません。</p>



<h4 class="wp-block-heading" id="session-regenerate-id-関数-セッションidを再発行する関数">session_regenerate_id()関数：セッションIDを再発行する関数</h4>



<p>セッションハイジャック対策でPHPSESSIDの値を変更する。引数は常に「<strong>TRUE</strong>」を指定し、古いセッションファイルを削除する。ログイン時やセッション開始ページ、一定時間経過したときにセッションIDを新たに設定することで、セッションハイジャックの危険性を減らすことができます。</p>



<p>複数ページで処理する場合は、始点となるファイルでPHPSESSIDの値を変更することが多い。</p>



<h4 class="wp-block-heading" id="require-once-dir-functions-php-共通関数の読み込み">require_once <strong>DIR</strong> . &#8216;/functions.php&#8217;：共通関数の読み込み</h4>



<p>functions.phpに登録した共通関数のh関数とv関数を使用できるように、共通関数ファイルを読み込む。</p>



<h4 class="wp-block-heading" id="三項方程式">三項方程式</h4>



<p>今回ビューファイルで必要な値「名前」「件名」「本文」をロジックで用意している。</p>



<p>$name = isset($_SESSION[&#8216;name&#8217;]) ? $_SESSION[&#8216;name&#8217;] : NULL;</p>



<p>三項方程式を使用し、 isset($_SESSION[&#8216;name&#8217;])は「$_SESSION[&#8216;name&#8217;]」が存在するか調べます。初回アクセス時はまだ「$_SESSION[&#8216;name&#8217;]」は存在しないので、変数にはfalseの「NULL」を代入します。</p>



<h4 class="wp-block-heading" id="require-form1-view-php">require &#8216;form1_view.php&#8217;;</h4>



<p>reqiuireを使ってパーツ化したコンテンツを読み込みます。</p>



<p>form1.phpでは「form1_view.php」ファイルを読み込みます。</p>



<h3 class="wp-block-heading" id="form1-view-php">form1_view.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="form1_view.php" data-lang="PHP"><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;入力画面｜フォーム&lt;/title&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;header&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;h1&gt;入力画面&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;content&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;?php if (isset($error)) : ?&gt;
      &lt;div class=&quot;error&quot;&gt;
        &lt;ul&gt;
          &lt;?php foreach ($error as $val) : ?&gt;
          &lt;li&gt;&lt;?php echo $val; ?&gt;&lt;/li&gt;
          &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
      &lt;?php endif; ?&gt;

      &lt;form action=&quot;form2.php&quot; method=&quot;post&quot;&gt;
        &lt;dl&gt;
          &lt;dt&gt;名前&lt;/dt&gt;
          &lt;dd&gt;
            &lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;&lt;?php echo h($name); ?&gt;&quot; size=&quot;50&quot;&gt;
          &lt;/dd&gt;
          &lt;dt&gt;件名&lt;/dt&gt;
          &lt;dd&gt;
            &lt;input type=&quot;text&quot; name=&quot;subject&quot; value=&quot;&lt;?php echo h($subject); ?&gt;&quot; size=&quot;50&quot;&gt;
          &lt;/dd&gt;
          &lt;dt&gt;内容&lt;/dt&gt;
          &lt;dd&gt;
            &lt;textarea name=&quot;body&quot; cols=&quot;50&quot; rows=&quot;10&quot;&gt;&lt;?php echo h($body); ?&gt;&lt;/textarea&gt;
          &lt;/dd&gt;
        &lt;/dl&gt;
        &lt;p&gt;
          &lt;input class=&quot;btn&quot; type=&quot;submit&quot; value=&quot;確認画面へ&quot;&gt;
        &lt;/p&gt;
      &lt;/form&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;footer&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;p class=&quot;copyright&quot;&gt;© フォーム&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>      &lt;?php if (isset($error)) : ?&gt;
      &lt;div class=&quot;error&quot;&gt;
        &lt;ul&gt;
          &lt;?php foreach ($error as $val) : ?&gt;
          &lt;li&gt;&lt;?php echo $val; ?&gt;&lt;/li&gt;
          &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
      &lt;?php endif; ?&gt;</code></pre></div>



<p>form1.phpでは$errorが存在しないので、エラー表示部分の利用はありません。<br>しかし、後々出てくる「form2.php」で活躍します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>      &lt;form action=&quot;form2.php&quot; method=&quot;post&quot;&gt;
        &lt;dl&gt;
          &lt;dt&gt;名前&lt;/dt&gt;
          &lt;dd&gt;
            &lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;&lt;?php echo h($name); ?&gt;&quot; size=&quot;50&quot;&gt;
          &lt;/dd&gt;
          &lt;dt&gt;件名&lt;/dt&gt;
          &lt;dd&gt;
            &lt;input type=&quot;text&quot; name=&quot;subject&quot; value=&quot;&lt;?php echo h($subject); ?&gt;&quot; size=&quot;50&quot;&gt;
          &lt;/dd&gt;
          &lt;dt&gt;内容&lt;/dt&gt;
          &lt;dd&gt;
            &lt;textarea name=&quot;body&quot; cols=&quot;50&quot; rows=&quot;10&quot;&gt;&lt;?php echo h($body); ?&gt;&lt;/textarea&gt;
          &lt;/dd&gt;
        &lt;/dl&gt;
        &lt;p&gt;
          &lt;input class=&quot;btn&quot; type=&quot;submit&quot; value=&quot;確認画面へ&quot;&gt;
        &lt;/p&gt;
      &lt;/form&gt;</code></pre></div>



<p>HTMLでフォームを作成します。<br>今回は「form2.php」にPOST形式で値を送るので、action=&#8221;form2.php&#8221; method=&#8221;POST&#8221;となります。</p>



<p class="is-style-supplement-succes">ユーザから情報を得る場合は、基本$_POSTを使用して値を取得します。</p>



<p>inputタグのvalueの部分がユーザ入力値としてform2.phpに送られるので、ユーザ入力値の部分をh関数の<strong>htmlspecialchars()関数</strong>で入力値をサニタイジングします。</p>



<h4 class="wp-block-heading" id="v-session">v($_SESSION);</h4>



<p>ここでセッションをv()関数を使って確認します。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" width="553" height="416" src="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.32.44.jpg" alt="form1.php" class="wp-image-4459" srcset="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.32.44.jpg 553w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.32.44-300x226.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.32.44-485x365.jpg 485w" sizes="(max-width: 553px) 100vw, 553px" /><figcaption>form1.php</figcaption></figure></div>



<p>最初のform1.phpではまだ$_SESSIONに値が入ってないことが確認できます。</p>



<h3 class="wp-block-heading" id="form2-php">form2.php</h3>



<p>form1.phpで確認画面へボタンをクリックするとform2.phpへ移ります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="form2.php" data-lang="PHP"><code>&lt;?php
session_start();
require_once __DIR__ . &#39;/functions.php&#39;;

v($_POST);

$name    = isset($_POST[&#39;name&#39;])    ? $_POST[&#39;name&#39;]    : NULL;
$subject = isset($_POST[&#39;subject&#39;]) ? $_POST[&#39;subject&#39;] : NULL;
$body    = isset($_POST[&#39;body&#39;])    ? $_POST[&#39;body&#39;]    : NULL;

$name    = trim($name);
$subject = trim($subject);
$body    = trim($body);

$error = [];

if ($name == &#39;&#39;) {
  $error[] = &#39;お名前は必須項目です。&#39;;
} else if (mb_strlen($name) &gt; 20) {
  $error[] = &#39;お名前は20文字以内でお願い致します。&#39;;
}

if ($subject == &#39;&#39;) {
  $error[] = &#39;件名は必須項目です。&#39;;
} else if (mb_strlen($subject) &gt; 50) {
  $error[] = &#39;件名は50文字以内でお願い致します。&#39;;
}

if ($body == &#39;&#39;) {
  $error[] = &#39;内容は必須項目です。&#39;;
} else if (mb_strlen($body) &gt; 500) {
  $error[] = &#39;内容は500文字以内でお願い致します。&#39;;
}

if (count($error) &gt; 0) {
  require &#39;form1_view.php&#39;;
} else {
  $_SESSION[&#39;name&#39;]    = $name;
  $_SESSION[&#39;subject&#39;] = $subject;
  $_SESSION[&#39;body&#39;]    = $body;
  require &#39;form2_view.php&#39;;
}</code></pre></div>



<p>form2.phpではform1.phpから$_POSTで送った値を取得します。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" src="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05.jpg" alt="form2.php" class="wp-image-4460" width="728" height="502" srcset="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05.jpg 953w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05-300x207.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05-768x530.jpg 768w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05-485x335.jpg 485w" sizes="(max-width: 728px) 100vw, 728px" /><figcaption>form2.php</figcaption></figure>



<p>form1.phpから$_POSTで送られた値はform2.phpに届いていることが確認できますが、この時点でも$_SESSIONにはまだ値がありません。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$name    = isset($_POST[&#39;name&#39;])    ? $_POST[&#39;name&#39;]    : NULL;
$subject = isset($_POST[&#39;subject&#39;]) ? $_POST[&#39;subject&#39;] : NULL;
$body    = isset($_POST[&#39;body&#39;])    ? $_POST[&#39;body&#39;]    : NULL;

$name    = trim($name);
$subject = trim($subject);
$body    = trim($body);</code></pre></div>



<p>三項方程式でそれぞれ変数にform1.phpから$_POSTで送られた値を代入します。<br>さらにtrim()関数で先頭・末尾にあるホワイトスペースを削除したものを変数へ再代入します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$error = [];

if ($name == &#39;&#39;) {
  $error[] = &#39;お名前は必須項目です。&#39;;
} else if (mb_strlen($name) &gt; 20) {
  $error[] = &#39;お名前は20文字以内でお願い致します。&#39;;
}

if ($subject == &#39;&#39;) {
  $error[] = &#39;件名は必須項目です。&#39;;
} else if (mb_strlen($subject) &gt; 50) {
  $error[] = &#39;件名は50文字以内でお願い致します。&#39;;
}

if ($body == &#39;&#39;) {
  $error[] = &#39;内容は必須項目です。&#39;;
} else if (mb_strlen($body) &gt; 500) {
  $error[] = &#39;内容は500文字以内でお願い致します。&#39;;
}</code></pre></div>



<p>$error = [];<br>エラー変数を配列化して、エラー時に出力するエラー文を配列管理します。</p>



<p>mb_strlen()関数で変数値の文字列の長さを取得します。<br>if分を使い、未入力時と文字数を超えた場合にエラー変数にエラー文を配列で管理していきます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>if (count($error) &gt; 0) {
  require &#39;form1_view.php&#39;;
} else {
  $_SESSION[&#39;name&#39;]    = $name;
  $_SESSION[&#39;subject&#39;] = $subject;
  $_SESSION[&#39;body&#39;]    = $body;
  require &#39;form2_view.php&#39;;
}</code></pre></div>



<p>エラーがある場合は、「fomr1_view.php」を読み込みます。</p>



<p>エラーがない場合は、$_SESSIONに確定したユーザ入力値を代入し、他のページでも使えるようにします。そして「form2_view.php」を読み込みます。</p>



<h3 class="wp-block-heading" id="form2-view-php">form2_view.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="form2_view.php" data-lang="PHP"><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;確認画面｜フォーム&lt;/title&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;div class=&quot;header&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;h1&gt;確認画面&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;content&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;

      &lt;p&gt;以下の内容でよろしければ送信ボタンを押してください。&lt;/p&gt;

      &lt;dl class=&quot;confirm&quot;&gt;
        &lt;dt&gt;お名前：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo h($name); ?&gt;&lt;/dd&gt;
        &lt;dt&gt;件名：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo h($subject); ?&gt;&lt;/dd&gt;
        &lt;dt&gt;内容：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo nl2br(h($body)); ?&gt;&lt;/dd&gt;
      &lt;/dl&gt;

      &lt;div class=&quot;confirm-btn&quot;&gt;
        &lt;p&gt;&lt;a class=&quot;btn&quot; href=&quot;form1.php&quot;&gt;入力画面に戻る&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&lt;a class=&quot;btn&quot; href=&quot;form3.php&quot;&gt;送信する&lt;/a&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;footer&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;p class=&quot;copyright&quot;&gt;© フォーム&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>      &lt;dl class=&quot;confirm&quot;&gt;
        &lt;dt&gt;お名前：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo h($name); ?&gt;&lt;/dd&gt;
        &lt;dt&gt;件名：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo h($subject); ?&gt;&lt;/dd&gt;
        &lt;dt&gt;内容：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo nl2br(h($body)); ?&gt;&lt;/dd&gt;
      &lt;/dl&gt;</code></pre></div>



<p>ユーザ入力値を使用するので、h()関数を使ってエスケープします。</p>



<p>記述量が多い「内容」では「nl2br()」を使って見やすく表示します。</p>



<h4 class="wp-block-heading" id="v-session-1">v($_SESSION);</h4>



<p>ここでもセッションをv()関数を使って確認します。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="953" height="658" src="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05.jpg" alt="form2.php" class="wp-image-4460" srcset="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05.jpg 953w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05-300x207.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05-768x530.jpg 768w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.05-485x335.jpg 485w" sizes="(max-width: 953px) 100vw, 953px" /><figcaption>form2.php</figcaption></figure>



<p>上記で記述したように、form1.phpからページ移動してきたので$_POSTには値が入っていますが、$_SESSIONにはまだ値がありません。</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" width="628" height="531" src="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.25.jpg" alt="form1.php" class="wp-image-4461" srcset="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.25.jpg 628w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.25-300x254.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.25-485x410.jpg 485w" sizes="(max-width: 628px) 100vw, 628px" /><figcaption>form1.php</figcaption></figure></div>



<p>その後「入力画面へ戻る」ボタンをクリックしform1.phpのページへ戻ると、最初に値が入ってなかった$_SESSIONに値が入っています。</p>



<p>これはform2.phpでエラーがなかった場合に$_SESSIONに値が代入されるからです。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="950" height="779" src="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.45.jpg" alt="form2.php" class="wp-image-4462" srcset="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.45.jpg 950w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.45-300x246.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.45-768x630.jpg 768w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.34.45-485x398.jpg 485w" sizes="(max-width: 950px) 100vw, 950px" /><figcaption>form2.php</figcaption></figure>



<p>再びform2.phpへ戻るとこちらの$_SESSIONにもちゃんと値が入っていることが確認できます。</p>



<h3 class="wp-block-heading" id="form3-php">form3.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="form3.php" data-lang="PHP"><code>&lt;?php
session_start();
require_once __DIR__ . &#39;/functions.php&#39;;

$name    = isset($_SESSION[&#39;name&#39;])    ? $_SESSION[&#39;name&#39;]    : NULL;
$subject = isset($_SESSION[&#39;subject&#39;]) ? $_SESSION[&#39;subject&#39;] : NULL;
$body    = isset($_SESSION[&#39;body&#39;])    ? $_SESSION[&#39;body&#39;]    : NULL;

unset($_SESSION[&#39;name&#39;]);
unset($_SESSION[&#39;subject&#39;]);
unset($_SESSION[&#39;body&#39;]);

$error = [];
if ($name === NULL) {
  $error[] = &#39;名前の値なし&#39;;
}

if ($subject === NULL) {
  $error[] = &#39;件名の値なし&#39;;
}

if ($body === NULL) {
  $error[] = &#39;本文の値なし&#39;;
}

受け取った値を使った処理：例）データベースへの登録など

if (count($error) &gt; 0) {
  require &#39;error_view.php&#39;;
} else {
  require &#39;form3_view.php&#39;;
}
</code></pre></div>



<p>form1.phpからform2.phpへ値を送信するときは、$_POSTを使用しましたが、form2.phpからform3.phpへの値の受け渡しは$_SESSIONを使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$name    = isset($_SESSION[&#39;name&#39;])    ? $_SESSION[&#39;name&#39;]    : NULL;
$subject = isset($_SESSION[&#39;subject&#39;]) ? $_SESSION[&#39;subject&#39;] : NULL;
$body    = isset($_SESSION[&#39;body&#39;])    ? $_SESSION[&#39;body&#39;]    : NULL;</code></pre></div>



<p>$_SESSIONから値を取得し、それぞれ変数に値を代入したら$_SESSIONを削除します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>unset($_SESSION[&#39;name&#39;]);
unset($_SESSION[&#39;subject&#39;]);
unset($_SESSION[&#39;body&#39;]);</code></pre></div>



<p>unset()関数：指定した変数の割り当てを解除・配列内の部屋を削除します。セッション変数の部屋は明示的に削除しないとずっと存在してしまうので、使用しなくなった部屋はunset()関数で削除しなければなりません。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$error = [];
if ($name === NULL) {
  $error[] = &#39;名前の値なし&#39;;
}

if ($subject === NULL) {
  $error[] = &#39;件名の値なし&#39;;
}

if ($body === NULL) {
  $error[] = &#39;本文の値なし&#39;;
}

受け取った値を使った処理：例）データベースへの登録など

if (count($error) &gt; 0) {
  require &#39;error_view.php&#39;;
} else {
  require &#39;form3_view.php&#39;;
}</code></pre></div>



<p>エラーがあれば、エラー変数にエラーメッセージを代入します。</p>



<p>エラーがあるとき、「error_view.php」を読み込みます。<br>エラーがないときは、「form3_view.php」を読み込みます。</p>



<p>実際にデータベースに値を受け渡すには、この時点でロジックを組んでいくみたいです。</p>



<h4 class="wp-block-heading" id="v-session-1">v($_SESSION);</h4>



<p>ここでもセッションをv()関数を使って確認します。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="865" height="624" src="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.35.58.jpg" alt="form3.php" class="wp-image-4463" srcset="https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.35.58.jpg 865w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.35.58-300x216.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.35.58-768x554.jpg 768w, https://creator-kid.com/wp-content/uploads/2022/02/Screen-Shot-2022-02-12-at-2.35.58-485x350.jpg 485w" sizes="(max-width: 865px) 100vw, 865px" /><figcaption>form3.php</figcaption></figure>



<p>unset($_SESSION)の前後でv()関数で$_SESSIONの動向を確認します。</p>



<p>unset前では$_SESSIONに値が入っているのに対し、unset後の$_SESSIONには値が入っていないことが確認できます。</p>



<h3 class="wp-block-heading" id="form3-view-php">form3_view.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="form3_view.php" data-lang="PHP"><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;

&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;完了画面｜フォーム&lt;/title&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;div class=&quot;header&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;h1&gt;完了画面&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;content&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;

      &lt;p&gt;以下の値で処理をしました。&lt;/p&gt;

      &lt;dl class=&quot;confirm&quot;&gt;
        &lt;dt&gt;お名前：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo h($name); ?&gt;&lt;/dd&gt;
        &lt;dt&gt;件名：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo h($subject); ?&gt;&lt;/dd&gt;
        &lt;dt&gt;内容：&lt;/dt&gt;
        &lt;dd&gt;&lt;?php echo nl2br(h($body)); ?&gt;&lt;/dd&gt;
      &lt;/dl&gt;

      &lt;div class=&quot;content-footer&quot;&gt;
        &lt;p&gt;&lt;a href=&quot;form1.php&quot;&gt;入力画面に戻る&lt;/a&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;footer&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;p class=&quot;copyright&quot;&gt;© フォーム&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre></div>



<p>ユーザ入力値を表示する際は毎回h()関数でエスケープしておきます。</p>



<h3 class="wp-block-heading" id="error-view-php">error_view.php</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="error_view.php" data-lang="PHP"><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;エラー｜フォーム&lt;/title&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;header&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;h1&gt;エラー&lt;/h1&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;content&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;

      &lt;?php /* ?&gt;
      &lt;?php if (isset($error)) : ?&gt;
      &lt;div class=&quot;error&quot;&gt;
        &lt;ul&gt;
          &lt;?php foreach ($error as $val) : ?&gt;
          &lt;li&gt;&lt;?php echo $val; ?&gt;&lt;/li&gt;
          &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
      &lt;?php endif; ?&gt;
      &lt;?php */ ?&gt;

      &lt;p&gt;セッションが切れました&lt;/p&gt;
      &lt;p&gt;&lt;a href=&quot;form1.php&quot;&gt;もう一度やり直してください。&lt;/a&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;footer&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;p class=&quot;copyright&quot;&gt;© フォーム&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>      &lt;?php /* ?&gt;
      &lt;?php if (isset($error)) : ?&gt;
      &lt;div class=&quot;error&quot;&gt;
        &lt;ul&gt;
          &lt;?php foreach ($error as $val) : ?&gt;
          &lt;li&gt;&lt;?php echo $val; ?&gt;&lt;/li&gt;
          &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
      &lt;?php endif; ?&gt;
      &lt;?php */ ?&gt;</code></pre></div>



<p>この部分はデバック用なので実際には表示されません。<br>エラーが出たときにどんなエラーが出たのか確認できます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【PHP】登録フォームで$_POST形式で値を受け取る際のエラーチェックを例題と共に解説</title>
		<link>https://creator-kid.com/code/php-form_post/</link>
		
		<dc:creator><![CDATA[Ryuji]]></dc:creator>
		<pubDate>Tue, 01 Feb 2022 13:48:37 +0000</pubDate>
				<category><![CDATA[CODE]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web制作]]></category>
		<category><![CDATA[職業訓練]]></category>
		<guid isPermaLink="false">https://creator-kid.com/?p=4304</guid>

					<description><![CDATA[私がPHPを学んでいる中で一番理解するのに苦労したのが、「$_POST形式で値を受け取る際のエラーチェック」だったので、その例題と解答方法をまとめました。 なぜ苦労したかというと、アンケートフォームなどでユーザーが普通に...]]></description>
										<content:encoded><![CDATA[
<p>私がPHPを学んでいる中で一番理解するのに苦労したのが、「<strong>$_POST形式で値を受け取る際のエラーチェック</strong>」だったので、その例題と解答方法をまとめました。</p>



<p>なぜ苦労したかというと、アンケートフォームなどでユーザーが普通に入力して起こりうるエラーしか考えつかず、その他起こりうるエラーについて理解するのが困難だったためです。</p>



<h2 class="wp-block-heading" id="post形式の値の送受信の問題">POST形式の値の送受信の問題</h2>



<h3 class="wp-block-heading" id="フォームの作成">フォームの作成</h3>



<p>以下の内容のフォームを作成すること。</p>



<ul class="wp-block-list"><li>名前</li><li>メールアドレス</li><li>性別</li><li>年代</li><li>お問い合わせ内容</li></ul>



<h3 class="wp-block-heading" id="送信について">送信について</h3>



<p>送信先は「comfirm.php」とする。</p>



<p>送信方法は「POST」とする。</p>



<h3 class="wp-block-heading" id="受信について">受信について</h3>



<h4 class="wp-block-heading" id="必須項目">必須項目</h4>



<ul class="wp-block-list"><li>名前</li><li>お問い合わせ内容</li></ul>



<h4 class="wp-block-heading" id="上限値">上限値</h4>



<ul class="wp-block-list"><li>名前：20文字</li><li>メールアドレス：100文字</li><li>お問い合わせ内容：400文字</li></ul>



<h4 class="wp-block-heading" id="画面表示">画面表示</h4>



<p>ユーザー入力値に問題なければ 送られてきた値を表示。</p>



<p>ユーザー入力値に問題があるときは エラーメッセージを表示。</p>



<h3 class="wp-block-heading" id="フォームパーツについて">フォームパーツについて</h3>



<p>名前は入力系パーツを使用しname属性「myname」とする。</p>



<p>メールアドレスは入力系パーツを使用しname属性「mail」とする。</p>



<p>性別は選択系パーツを使用しname属性「gender」とする。<br>送信する値は「選択しない」&gt;「0」、 「男性」&gt;「1」、 「女性」&gt;「2」</p>



<p>年代はセレクトボックスを使用しname属性「age」とする。<br>送信する値は「選択しない」&gt;「空文字」、 「10代」&gt;「1」、 「20代」&gt;「2」、 「30代」&gt;「3」、 「40代」&gt;「4」、 「50代以上」&gt;「5」</p>



<p>お問い合わせ内容はテキストエリアを使用しname属性「body」とする。</p>



<p>「送信ボタン」と「リセットボタン」を下部に配置すること。</p>



<h3 class="wp-block-heading" id="その他のルール">その他のルール</h3>



<p>文章構成（divでグループ化や定義リストを使用する等）は自由に決めて構わない。</p>



<p>時間があればCSSで自由にデザインすること。</p>



<h2 class="wp-block-heading" id="解答例">解答例</h2>



<h3 class="wp-block-heading" id="作成したお問い合わせフォーム">作成したお問い合わせフォーム</h3>



<div class="wp-block-image"><figure class="aligncenter size-full"><img decoding="async" width="680" height="627" src="https://creator-kid.com/wp-content/uploads/2022/01/image-1.jpg" alt="" class="wp-image-4390" srcset="https://creator-kid.com/wp-content/uploads/2022/01/image-1.jpg 680w, https://creator-kid.com/wp-content/uploads/2022/01/image-1-300x277.jpg 300w, https://creator-kid.com/wp-content/uploads/2022/01/image-1-485x447.jpg 485w" sizes="(max-width: 680px) 100vw, 680px" /></figure></div>



<h3 class="wp-block-heading" id="html">HTML</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-html" data-lang="HTML"><code>&lt;h1&gt;問題解答&lt;/h1&gt;
&lt;form action=&quot;comfirm.php&quot; method=&quot;post&quot;&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;お問い合わせフォーム&lt;/legend&gt;
    &lt;dl&gt;
      &lt;dt&gt;名前&lt;/dt&gt;
      &lt;dd&gt;
        &lt;input type=&quot;text&quot; name=&quot;myname&quot; required placeholder=&quot;例）山田 太郎&quot;&gt;
      &lt;/dd&gt;
      &lt;dt&gt;メールアドレス&lt;/dt&gt;
      &lt;dd&gt;
        &lt;input type=&quot;email&quot; name=&quot;mail&quot; placeholder=&quot;例）name@example.com&quot;&gt;
      &lt;/dd&gt;
      &lt;dt&gt;性別&lt;/dt&gt;
      &lt;dd&gt;
        &lt;label&gt;&lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;0&quot;&gt;未選択&lt;/label&gt;
        &lt;label&gt;&lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;1&quot;&gt;男性&lt;/label&gt;
        &lt;label&gt;&lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;2&quot;&gt;女性&lt;/label&gt;
      &lt;/dd&gt;
      &lt;dt&gt;年代&lt;/dt&gt;
      &lt;dd&gt;
        &lt;select name=&quot;age&quot;&gt;
          &lt;option value=&quot;&quot;&gt;選択してください&lt;/option&gt;
          &lt;option value=&quot;0&quot;&gt;未回答&lt;/option&gt;
          &lt;option value=&quot;1&quot;&gt;10代&lt;/option&gt;
          &lt;option value=&quot;2&quot;&gt;20代&lt;/option&gt;
          &lt;option value=&quot;3&quot;&gt;30代&lt;/option&gt;
          &lt;option value=&quot;4&quot;&gt;40代&lt;/option&gt;
          &lt;option value=&quot;5&quot;&gt;50代以上&lt;/option&gt;
        &lt;/select&gt;
      &lt;/dd&gt;
      &lt;dt&gt;お問い合わせ内容&lt;/dt&gt;
      &lt;dd&gt;
        &lt;textarea name=&quot;body&quot; cols=&quot;50&quot; rows=&quot;10&quot; required&gt;&lt;/textarea&gt;
      &lt;/dd&gt;
    &lt;/dl&gt;
    &lt;div class=&quot;button&quot;&gt;
      &lt;input class=&quot;btn&quot; type=&quot;submit&quot; value=&quot;送信&quot;&gt;
      &lt;input class=&quot;btn&quot; type=&quot;reset&quot; value=&quot;リセット&quot;&gt;
    &lt;/div&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre></div>



<p>フォームパーツが多い場合は、fieldset要素を使ってグループを作成できる。<br>form要素内に入力パーツが少ない場合は、field要素とlegend要素は省略可能。</p>



<p>name属性はPHPの送受信には必須の属性で、値の送受信用の名前。<br>CSSでのclass属性、JSでのid属性のようなもの。</p>



<p>input要素をlabelタグで囲むと、クリック領域が広がりユーザーが使いやすくなる。</p>



<p>required属性を付与すると、必須項目になる。</p>



<p>placeholderを入力しておくと、名前やメールアドレスなどの入力欄に参考例をあらかじめ入力しておくことができ、ユーザーがわかりやすくなる。</p>



<h3 class="wp-block-heading" id="css">CSS</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-css" data-lang="CSS"><code>fieldset{
  width: 50%;
  margin: 0 auto;
  background-color: aliceblue;
}

dt{
  background-color: #ccc;
}
dd{
  padding: 1em;
  margin: 0;
}

.btn{
  border-radius: 25px;
  background-color: #ccc;
  color: #000;
}

.button{
  text-align: right;
}
</code></pre></div>



<p>CSSは特に重要ではないですが、一応載せておきます。</p>



<h3 class="wp-block-heading" id="php">PHP</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>&lt;?php
echo &#39;&lt;pre&gt;&#39;;
var_dump($_POST);
echo &#39;&lt;/pre&gt;&#39;;

$error = [];

echo &#39;&lt;pre&gt;&#39;;
var_dump($error);
echo &#39;&lt;/pre&gt;&#39;;

$limit = 20;
if (isset($_POST[&#39;myname&#39;])) {
  $myname = $_POST[&#39;myname&#39;];
  if ($myname === &#39;&#39;) {
    $error[] = &#39;名前は必須項目です&#39;;
  } else if (mb_strlen($myname) &gt; $limit) {
    $error[] = &quot;名前は{$limit}文字以下で入力してください&quot;;
  }
} else {
  $error[] = &#39;名前の値が届いていません&#39;;
}

$limit = 100;
if (isset($_POST[&#39;mail&#39;])) {
  $mail = $_POST[&#39;mail&#39;];
  if (mb_strlen($mail) &gt; $limit) {
    $error[] = &quot;メールアドレスは{$limit}文字以下で入力してください&quot;;
  }
} else {
  $error[] = &#39;メールアドレスの値が届いていません&#39;;
}

$limit = 400;
if (isset($_POST[&#39;body&#39;])) {
  $body = $_POST[&#39;body&#39;];
  if ($body === &#39;&#39;) {
    $error[] = &#39;お問い合わせ内容は必須項目です&#39;;
  } else if (mb_strlen($body) &gt; $limit) {
    $error[] = &quot;お問い合わせ内容は{$limit}文字以下で入力してください&quot;;
  }
} else {
  $error[] = &#39;お問い合わせ内容の値が届いていません&#39;;
}

if (isset($_POST[&#39;gender&#39;])) {
  $gender = $_POST[&#39;gender&#39;];
  if (ctype_digit($gender)) {
    if ($gender &lt; 0 || $gender &gt; 2) {
      $error[] = &#39;性別の値が不正です&#39;;
    }
  } else {
    $error[] = &#39;性別の値が不正です&#39;;
  }
}

if (isset($_POST[&#39;age&#39;])) {
  $age = $_POST[&#39;age&#39;];
  if ($age !== &#39;&#39;) {
    if (ctype_digit($age)) {
      if ($age &lt; 0 || $age &gt; 5) {
        $error[] = &#39;年代の値が不正です:2&#39;;
      }
    } else {
      $error[] = &#39;年代の値が不正です:1&#39;;
    }
  }
} else {
  $error[] = &#39;年代の値が届いていません&#39;;
}

if (count($error) === 0) {
  $genderList = [
    0 =&gt; &#39;選択してない&#39;,
    1 =&gt; &#39;男性&#39;,
    2 =&gt; &#39;女性&#39;,
  ];
  if (isset($gender)) {
    $genderStr = $genderList[$gender];
  } else {
    $genderStr = &#39;選択していない&#39;;
  }

  if ($age === &#39;&#39;) {
    $ageStr = &#39;選択していない&#39;;
  } else if ($age === &#39;0&#39;) {
    $ageStr = &#39;未回答&#39;;
  } else if ($age === &#39;5&#39;) {
    $ageStr = &quot;{$age}0代以上&quot;;
  } else {
    $ageStr = &quot;{$age}0代&quot;;
  }
}
?&gt;

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;POST形式で送信された値を取得&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;box&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;?php if (count($error) &gt; 0) : ?&gt;
        &lt;h1&gt;エラー&lt;/h1&gt;
        &lt;ul class=&quot;error&quot;&gt;
          &lt;?php foreach ($error as $val) : ?&gt;
            &lt;li&gt;&lt;?php echo $val; ?&gt;&lt;/li&gt;
          &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;?php else : ?&gt;
        &lt;h1&gt;確認&lt;/h1&gt;
        &lt;dl&gt;
          &lt;dt&gt;名前&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $myname; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;メールアドレス&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $mail; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;性別&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $genderStr; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;年代&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $ageStr; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;お問い合わせ内容&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo nl2br($body); ?&gt;&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;?php endif; ?&gt;
      &lt;p&gt;
        &lt;a href=&quot;form.html&quot;&gt;フォームに戻る&lt;/a&gt;
      &lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></div>



<p>これが解答例です。<br>わかりやすいように各パーツごと分解して解説していきます。</p>



<h4 class="wp-block-heading" id="受信した値を確認">受信した値を確認</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>echo &#39;&lt;pre&gt;&#39;;
var_dump($_POST);
echo &#39;&lt;/pre&gt;&#39;;</code></pre></div>



<p>HTMLで作成したフォームからPOST形式で送られてきた値をvar_dumpして確認。</p>



<h4 class="wp-block-heading" id="エラー変数">エラー変数</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$error = []; </code></pre></div>



<p>$error(変数宣言）して、エラーをこの$errorに配列として溜めていく。</p>



<h4 class="wp-block-heading" id="名前チェック">名前チェック</h4>



<ul class="stk-list-icon--check01 wp-block-list"><li>届いているかチェック</li><li>必須チェック(空文字チェック)</li><li>上限値チェック(20文字)</li></ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$limit = 20;
if (isset($_POST[&#39;myname&#39;])) {
  $myname = $_POST[&#39;myname&#39;];
  if ($myname === &#39;&#39;) {
    ※ 必須エラー
    $error[] = &#39;名前は必須項目です&#39;;
  } else if (mb_strlen($myname) &gt; $limit) {
    ※ 上限値エラー
    $error[] = &quot;名前は{$limit}文字以下で入力してください&quot;;
  } else {
    ※ OK
  }
} else {
  ※ 届いているかエラー
  $error[] = &#39;名前の値が届いていません&#39;;
}</code></pre></div>



<p>if (isset($_POST[&#8216;myname&#8217;]))  → 値が届いているかチェック</p>



<p>if ($myname === &#8221;) → 空文字かチェック</p>



<p>else if (mb_strlen($myname) &gt; $limit) → 文字数上限値(20文字)チェック</p>



<p class="is-style-supplement-border">isset($_調べる変数名)：変数が定義されているか調べられる<br>定義されている場合はtrue、定義されていない場合はfalseを返す<br>値を受け取っていればtrueになる<br>→$_POSTの連想配列に箱があるかないかのチェック<br><br>※実際にフォームから値を送信してそのページに遷移した場合にはエラーは発生しません。しかし、直接そのページ（値を取得するページ）にアクセスした場合には$_POST[&#8216;myname&#8217;]が未定義になるのでエラーが発生します。</p>



<p class="is-style-supplement-border">mb_strlen(引数) ：引数で指定した文字列の文字数を返す<br>[multi byte_strings length]<br>※JSの文字列に対するlengthと同じような感じ</p>



<h4 class="wp-block-heading" id="メールアドレスチェック">メールアドレスチェック</h4>



<ul class="stk-list-icon--check01 wp-block-list"><li>届いているかチェック</li><li>上限値チェック(100文字）</li></ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$limit = 100;
if (isset($_POST[&#39;mail&#39;])) {
  $mail = $_POST[&#39;mail&#39;];
  if (mb_strlen($mail) &gt; $limit) {
    $error[] = &quot;メールアドレスは{$limit}文字以下で入力してください&quot;;
  } else {
    ※ OK
  }
} else {
  $error[] = &#39;メールアドレスの値が届いていません&#39;;
}</code></pre></div>



<p>if (isset($_POST[&#8216;mail&#8217;])) → 値が届いているかチェック</p>



<p>if (mb_strlen($mail) &gt; $limit) → 文字数上限値(100文字)チェック</p>



<p>メールアドレスは必須項目ではないので、空文字チェックはなし</p>



<h4 class="wp-block-heading" id="お問い合わせ内容チェック">お問い合わせ内容チェック</h4>



<ul class="stk-list-icon--check01 wp-block-list"><li>届いているかチェック</li><li>必須チェック(空文字チェック)</li><li>上限値チェック(400文字)</li></ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$limit = 400;
if (isset($_POST[&#39;body&#39;])) {
  $body = $_POST[&#39;body&#39;];
  if ($body === &#39;&#39;) {
    $error[] = &#39;お問い合わせ内容は必須項目です&#39;;
  } else if (mb_strlen($body) &gt; $limit) {
    $error[] = &quot;お問い合わせ内容は{$limit}文字以下で入力してください&quot;;
  } else {
    ※ OK
  }
} else {
  $error[] = &#39;お問い合わせ内容の値が届いていません&#39;;
}</code></pre></div>



<p>if (isset($_POST[&#8216;body&#8217;])) → 値が届いているかチェック</p>



<p>if ($body === &#8221;) → 空文字かチェック</p>



<p>else if (mb_strlen($body) &gt; $limit)→ 文字数上限値(400文字)チェック</p>



<h4 class="wp-block-heading" id="性別チェック">性別チェック</h4>



<p> ◇未選択は値が届かない<br> ◇「0」「1」「2」が届く<br> OKルート:「届いていない」or「範囲内の数字」</p>



<ul class="stk-list-icon--check01 wp-block-list"><li>届いているかチェック → 届いていなくてもエラーにせずOKでチェックぬける</li><li>数字チェック</li><li>範囲チェック</li></ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>if (isset($_POST[&#39;gender&#39;])) {
  $gender = $_POST[&#39;gender&#39;];
  if (ctype_digit($gender)) {
    if ($gender &lt; 0 || $gender &gt; 2) {
      $error[] = &#39;性別の値が不正です&#39;;
    } else {
      ※ OK
    }
  } else {
    $error[] = &#39;性別の値が不正です&#39;;
  }
} else {
  ※ OK:値が届いていない（選択していない）
  ※ 表示するときに変数がないので
  　 表示用変数を別途用意しなければならない
}</code></pre></div>



<p>if (isset($_POST[&#8216;gender&#8217;]) → 値が届いているかチェック<br>値が届いていない場合でもOK</p>



<p>if (ctype_digit($gender)) → 値が数字かチェック</p>



<p>if ($gender &lt; 0 || $gender &gt; 2) → 値の範囲チェック</p>



<p class="is-style-supplement-border">ctype_digit(引数)：引数が数字かどうかを調べる関数<br>→ 与えられた文字列textのすべての文字が 数字であるかどうかを調べる<br><br>trueの場合<br>①引数は文字列型<br>②文字列がすべて数字<br>③小数点をNGとして、整数かをチェック<br><br>例）<br>100 = false<br>&#8216;100&#8217; = true<br>0.5 = false<br>&#8216;0.5&#8217; = false</p>



<p>※ 表示するときに変数がないので、表示用変数を別途のちに用意する必要がある</p>



<h4 class="wp-block-heading" id="年代チェック">年代チェック</h4>



<p>◇未選択は空文字<br>◇「0」「1」「2」「3」「4」「5」が届く<br> OKルート:「空文字」or「範囲内の数字」</p>



<ul class="stk-list-icon--check01 wp-block-list"><li>届いているかチェック</li><li>空文字じゃないかチェック → 空文字でもエラーにせずOKでチェックぬける</li><li>数字チェック</li><li>範囲チェック</li></ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>if (isset($_POST[&#39;age&#39;])) {
  $age = $_POST[&#39;age&#39;];
  if ($age !== &#39;&#39;) {
    ※ 範囲内数字のチェック
    if (ctype_digit($age)) {
      if ($age &lt; 0 || $age &gt; 5) {
        $error[] = &#39;年代の値が不正です:2&#39;;
      } else {
        ※ OK:範囲内の数字
      }
    } else {
      $error[] = &#39;年代の値が不正です:1&#39;;
    }
  } else {
    ※ OK:空文字の時（選択しなかった時）
  }
} else {
  $error[] = &#39;年代の値が届いていません&#39;;
}</code></pre></div>



<p>if (isset($_POST[&#8216;age&#8217;])) → 値が届いているかチェック</p>



<p>if ($age !== &#8221;) → 空文字じゃないかチェック<br>この場合、空文字のときにfalseとなる</p>



<p>if (ctype_digit($age)) → 値が数字かチェック</p>



<p>if ($age &lt; 0 || $age &gt; 5) → 値の範囲チェック</p>



<h4 class="wp-block-heading" id="性別-年代の表示用変数を準備">性別・年代の表示用変数を準備</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>if (count($error) === 0) {
  ※ エラーがないときは表示変数を整える
  ※ 選択項目表示用
  $genderList = [
    0 =&gt; &#39;選択してない&#39;,
    1 =&gt; &#39;男性&#39;,
    2 =&gt; &#39;女性&#39;,
  ];
  if (isset($gender)) {
    ※ 性別の値が届いたとき
    $genderStr = $genderList[$gender];
  } else {
    ※ 性別の値が届いていないとき
    ※ $genderが存在しないとき
    $genderStr = &#39;選択していない&#39;;
  }

  if ($age === &#39;&#39;) {
    $ageStr = &#39;選択していない&#39;;
  } else if ($age === &#39;0&#39;) {
    $ageStr = &#39;未回答&#39;;
  } else if ($age === &#39;5&#39;) {
    $ageStr = &quot;{$age}0代以上&quot;;
  } else {
    $ageStr = &quot;{$age}0代&quot;;
  }
}</code></pre></div>



<h4 class="wp-block-heading" id="view画面">view画面</h4>



<p>HTMLにPHPを組み込んで、view画面を作成</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>&lt;body&gt;
  &lt;div class=&quot;box&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
      &lt;?php if (count($error) &gt; 0) : ?&gt;
        &lt;h1&gt;エラー&lt;/h1&gt;
        &lt;ul class=&quot;error&quot;&gt;
          &lt;?php foreach ($error as $val) : ?&gt;
            &lt;li&gt;&lt;?php echo $val; ?&gt;&lt;/li&gt;
          &lt;?php endforeach; ?&gt;
        &lt;/ul&gt;
      &lt;?php else : ?&gt;
        &lt;h1&gt;確認&lt;/h1&gt;
        &lt;dl&gt;
          &lt;dt&gt;名前&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $myname; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;メールアドレス&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $mail; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;性別&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $genderStr; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;年代&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo $ageStr; ?&gt;&lt;/dd&gt;
          &lt;dt&gt;お問い合わせ内容&lt;/dt&gt;
          &lt;dd&gt;&lt;?php echo nl2br($body); ?&gt;&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;?php endif; ?&gt;
      &lt;p&gt;
        &lt;a href=&quot;form.html&quot;&gt;フォームに戻る&lt;/a&gt;
      &lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;</code></pre></div>



<p>&lt;?php if (count($error) &gt; 0) : ?&gt; → エラーがあればエラー文を表示</p>



<p>&lt;?php else : ?&gt; → エラーがない場合は、フォームからPOST形式で取得した値を各々表示</p>



<p>&lt;?php endif; ?&gt; → PHPのif文終了タグ</p>



<p class="is-style-supplement-border">nl2br関数(new line to br)： 改行コード前にbr要素を挿入してくれる<br>ブラウザ画面上で改行をサポートしてくれる <br>→ テキストエリアの内容を表示する時によく使う</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【2022年】W3Techsが発表した「2021年に躍進したWeb技術」まとめ</title>
		<link>https://creator-kid.com/code/w3techs-2022/</link>
		
		<dc:creator><![CDATA[Ryuji]]></dc:creator>
		<pubDate>Thu, 06 Jan 2022 15:44:38 +0000</pubDate>
				<category><![CDATA[CODE]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[web技術]]></category>
		<guid isPermaLink="false">https://creator-kid.com/?p=4016</guid>

					<description><![CDATA[W3Techsの「Web Technologies of the Year 2021」を日本語で理解できます 成長しているWeb技術の最新のトレンドがわかります 年が明けて2022年になりました。今後の進路について考えて...]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-stk-plugin-cbox cbox intitle is-style-green_box type_simple"><div class="box_title"><span class="span__box_title">この記事を読むと</span></div><div class="cboxcomment">
<ul class="wp-block-list"><li>W3Techsの「Web Technologies of the Year 2021」を日本語で理解できます</li><li>成長しているWeb技術の最新のトレンドがわかります</li></ul>
</div></div>



<p>年が明けて2022年になりました。<br>今後の進路について考えていた時に、思い浮かぶ不安を解消しようとネットサーフィンしていると辿り着いたのがこの<meta charset="utf-8"><a href="https://w3techs.com/" target="_blank" rel="noreferrer noopener">W3Techs</a>のページ。</p>



<p class="is-style-supplement-border"><meta charset="utf-8"><strong>W3Techs</strong>(World Wide Web Technology Surveys)は、さまざまなWeb技術についての情報を提供しており、彼らのVisionは「&#8221;<strong>Provide the most reliable and most extensive source of information on web technology usage.&#8221; </strong>(最も信頼性が高く、最も広範なWeb技術使用に関する情報を提供する)」と掲げている。</p>



<p><a href="https://q-success.com/web_services" target="_blank" rel="noreferrer noopener">Q-Success</a>は2022年1月3日、W3Techsの一環として、さまざまなWeb技術カテゴリーについての調査結果を発表した。</p>



<p>調査対象となるのは人気ランキングの上位1000万サイトで、<strong>2021年1月1日と2022年1月1日の使用Webサイト数を比較し、最も増加幅が大きかった上位３つの技術を「Web Technologies of the Year 2021」</strong>として発表してます。このWeb Technologies of the Yearの調査は毎年実施されています。</p>



<figure class="wp-block-image size-full"><a href="https://w3techs.com/blog/entry/web_technologies_of_the_year_2021" target="_blank" rel="noopener"><img decoding="async" width="800" height="496" src="https://creator-kid.com/wp-content/uploads/Screen-Shot-2022-01-04-at-23.15.20.png" alt="Web Technologies of the Year 2021" class="wp-image-4039" srcset="https://creator-kid.com/wp-content/uploads/Screen-Shot-2022-01-04-at-23.15.20.png 800w, https://creator-kid.com/wp-content/uploads/Screen-Shot-2022-01-04-at-23.15.20-300x186.png 300w, https://creator-kid.com/wp-content/uploads/Screen-Shot-2022-01-04-at-23.15.20-768x476.png 768w, https://creator-kid.com/wp-content/uploads/Screen-Shot-2022-01-04-at-23.15.20-485x301.png 485w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption><meta charset="utf-8"><strong>Web Technologies of the Year 2021</strong></figcaption></figure>



<h2 class="wp-block-heading">2021年に躍進したWeb技術（ <strong>Web Technologies of the Year 2021</strong> ）</h2>



<div class="wp-block-stk-plugin-cbox cbox intitle is-style-black_box type_simple"><div class="box_title"><span class="span__box_title">参考ページ</span></div><div class="cboxcomment">
<p><a href="https://w3techs.com/blog/entry/web_technologies_of_the_year_2021">https://w3techs.com/blog/entry/web_technologies_of_the_year_2021</a></p>
</div></div>



<h3 class="wp-block-heading">コンテンツ管理システム（CMS）</h3>



<ol class="wp-block-list"><li>WordPress</li><li>Shopify</li><li>Wix</li></ol>



<p>「もちろんまたWordPress」と言いたくなるくらい、<strong>WordPress</strong>は使用サイト数年間増加幅で12年連続で１位になっていて、Webサイトでの使用率は43.2%に達している。</p>



<p><strong>Shopify</strong>は去年と同様にコンテンツ管理システム(CMS)で２番目の速さで成長している。<meta charset="utf-8">Webサイトでの使用率は、去年の3.2%から4.4%にまで増加している。</p>



<p>Joomla や Drupalを退けて３位にランクインしたのは<strong>Wix</strong>で、Shopifyとともにホスト型CMSのトレンドの代表的な例です。</p>



<p>ホスト型CMSを使用するとWebサイトをより迅速に作成できますが、セルフホスト型CMSを使用するとより詳細な制御が可能になります。 </p>



<div class="wp-block-stk-plugin-cbox cbox intitle is-style-site_color type_normal"><div class="box_title"><span class="span__box_title">セルフホスト型CMS</span></div><div class="cboxcomment">
<p>WordPressやJoomla、Drupalなどのセルフホスト型CMSを使用する場合、ブログもしくはウェブサイトの作成の際に、別途サーバーとドメインを用意しなければならないことを意味します。</p>
</div></div>



<div class="wp-block-stk-plugin-cbox cbox intitle is-style-site_color type_normal"><div class="box_title"><span class="span__box_title">ホスト型CMS</span></div><div class="cboxcomment">
<p>ホスト型CMSにはSquarespaceやWixなどが含まれ、ブログやウェブサイトの作成に別途ドメイン名やホスティングサービスを用意する必要がなく、アカウントを登録するだけで始められます。</p>
</div></div>



<h3 class="wp-block-heading">サーバーサイドプログラミング言語</h3>



<ol class="wp-block-list"><li>Ruby</li><li>JavaScript</li><li>Java</li></ol>



<p><strong>Ruby</strong>が4年連続１位となりました。たくさんの新しいウェブサイトでは、Ruby(Ruby on Rails)がベースとなっている「Shopify」が使用されています。<br>２番目は<strong>JavaScript</strong>で、2021年にユーザーベースが55%も増加しました。<br>３番目にランクインしたのは<strong>Java</strong>で、何年にも渡り使用率の増減が見られましたが2021年は続伸しました。</p>



<h3 class="wp-block-heading">JavaScriptライブラリ</h3>



<ol class="wp-block-list"><li>Underscore</li><li>React</li><li>Lodash</li></ol>



<p>今回初めてJavaScriptライブラリーオブザイヤーに輝いた<strong>Underscore</strong>は、極めて多くの使い勝手の良い関数型プログラミングヘルパーを、彼らのウェブサイトで提供していると主張しています。ますます多くの人々がそれらを好んでいるようです。</p>



<p>2番目にランク付けされた<strong>React</strong>と3番目の<strong>Lodash</strong>のどちらとも、人気のあるWebサイトビルダー「Wix」に使用された恩恵を受けた形となった。</p>



<h3 class="wp-block-heading">Webサーバー</h3>



<ol class="wp-block-list"><li>Cloudflare Server</li><li>LiteSpeed</li><li>Node.js</li></ol>



<p>Nginxは2021年5月にApacheを追い抜いて「最も人気のあるWebサーバー」になるという大きな瞬間を迎えました。ただし、他のツールの成長率はさらに高かった。<br><strong>CloudFlare</strong>のサーバーは、CloudFlareのCDNサービスの力強い成長により、昨年に続き勝利しました。</p>



<p><strong>LiteSpeed</strong>は昨年と同じ2番目で、次に<strong>Node.js</strong>が続きます。</p>



<h3 class="wp-block-heading"><span style="color:#cf2e2e" class="tadv-color">(New!)</span> Webパネル</h3>



<ol class="wp-block-list"><li>RunCloud</li><li>GridPane</li></ol>



<p>これは私たち(W3techs)の調査の新しいカテゴリーです。PleskとcPanelは最も人気のある競合他社ですが、2021年に最も力強い成長を遂げたのは<strong>RunCloud</strong>で、今回のWebパネルオブザイヤーです。<br>2番目は<strong>GridPane</strong>です。他のWebパネルプロバイダーの人気が高まっていないため、3番目のランクはなし。</p>



<h3 class="wp-block-heading">OS（オペレーティングシステム）</h3>



<ol class="wp-block-list"><li>Linux</li><li>Debian</li><li>Ubuntu</li></ol>



<p><strong>Linux</strong>は、今回初めてオペレーティングシステムオブザイヤーを獲得しました。Linuxは近年急速に成長していますが、今年はLinuxサーバーの成長が不均衡に高く、特定のLinuxディストリビューションに割り当てることができません。<br>2位と3位にランクインしている<strong>Debian</strong>と<strong>Ubuntu</strong>が、ほとんどのWebサイトを獲得したディストリビューションです。</p>



<div class="wp-block-stk-plugin-cbox cbox intitle is-style-site_color type_normal"><div class="box_title"><span class="span__box_title">Linux とは？</span></div><div class="cboxcomment">
<p>Linuxとは、本来OSのコアであるカーネルといわれるものをさす言葉です。しかし、普段目にしているOSはOSのコア以外のものも含まれており、それを普段OSとして認識しているといえます。</p>



<p>通常Linuxを利用する場合、カーネル以外にも様々なソフトウェアが組み合わされた状態で利用します。このカーネル以外のその他のソフトウェアを一式含んだ状態が広義のLinuxです。つまり、一般的にいうLinuxとはこの広義の意味でのLinuxをさします。</p>
</div></div>



<div class="wp-block-stk-plugin-cbox cbox intitle is-style-site_color type_normal"><div class="box_title"><span class="span__box_title"><meta charset="utf-8">Linux ディストリビューションとは？</span></div><div class="cboxcomment">
<p>LinuxカーネルとOSを構成するその他のソフトウェアを組み合わせた形で配布する、という形がディストリビューションです。つまり、ディストリビューションとは、カーネル・シェル・各種ドライバー・アプリケーションソフトなどひとまとめにしてパッケージ化したもの。<br>通常Linuxといった場合、このディストリビューションを指していることがほとんどです。</p>
</div></div>



<h3 class="wp-block-heading">Webホスティングプロバイダー</h3>



<ol class="wp-block-list"><li>Shopify</li><li>Hostinger</li><li>Wix</li></ol>



<p><strong>Shopify</strong>は、専用のホスティングプロバイダーよりも速くホスト型eコマースプラットフォームを成長させることにより、Webホスティングカテゴリーでのタイトルを守りました。<br>2番目は<strong>Hostinger</strong>で、2021年にマーケットシェアを0.4％から1.2％に増やしました&nbsp;。<br>3番目はホスト型CMSプロバイダーである<strong>Wix</strong>です。</p>



<h3 class="wp-block-heading"><span style="color:#cf2e2e" class="tadv-color">(New!)</span> データセンタープロバイダー</h3>



<ol class="wp-block-list"><li>Amazon</li><li>Hostinger</li><li>DigitalOcean</li></ol>



<p>データセンタープロバイダーは、<meta charset="utf-8">私たち(W3techs)の調査の新しいカテゴリーです。<strong>Amazon</strong>は最も人気のあるプロバイダーであるだけでなく、2021年に最も急速に成長しているため、最初のデータセンタープロバイダーオブザイヤーです。<br><strong>Hostinger</strong>は非常に成功した年であり、2位にランクインしています。&nbsp;<br><strong>DigitalOcean</strong>は3番目です。</p>



<h3 class="wp-block-heading">リバースプロキシプロバイダー</h3>



<ol class="wp-block-list"><li>Cloudflare</li><li>Fastly</li><li>Amazon CloudFront</li></ol>



<p><strong>Cloudflare</strong>は、6年連続でリバースプロキシプロバイダーオブザイヤーです。ウェブサイトの19.4％がCloudflareを使用しており、1年前の15.4％から増加しています。これは非常に印象的な増加です。<br><strong>Fastly</strong>と<strong>Amazon CloudFront</strong>は、昨年と同様に２番目と３番目です。</p>



<h3 class="wp-block-heading">DNSサーバプロバイダー</h3>



<ol class="wp-block-list"><li>Cloudflare</li><li>Newfold Digital Group</li><li>Hostinger</li></ol>



<p><strong>Cloudflare</strong>は、このカテゴリーでのリードをさらに拡大することにより、今回もDNSサーバープロバイダーオブザイヤーの称号を獲得しています。&nbsp;<strong>Newfold Digital Group</strong>（前Endurance）は2番目であり、<strong>Hostinger</strong>はこのカテゴリでもトップ3にランクインしています。</p>



<h3 class="wp-block-heading">電子メールサーバプロバイダー</h3>



<ol class="wp-block-list"><li>Microsoft</li><li>Gmail</li><li>Hostinger</li></ol>



<p>電子メールサーバー分野での<strong>Microsoft</strong>と<strong>Gmail</strong>の成長率は2021年とほぼ同じでしたが、Microsoftが少し先を行っており、昨年の優勝者であるGmailからタイトルを獲得しています。&nbsp;<br><strong>Hostinger</strong>はもう1つのカテゴリーでも3番目にランクインしました。</p>



<h3 class="wp-block-heading">SSL認証局（CA）</h3>



<ol class="wp-block-list"><li>Let’s Encrypt</li><li>Sectigo</li><li>DigiCert Group</li></ol>



<p><strong>Let&#8217;s Encrypt</strong>はすでにここ数年で非常に成功していますが、ほとんどの場合、ルート証明書として「IdenTrust」を使用していました。しかし現在、独自のルート証明書が確立されたことが2021年の彼らの力強い成長を説明するものであり、今回初めてタイトルを獲得しました。<br>Comodoと呼ばれていた頃に2度タイトルを獲得した<strong>Sectigo</strong>(前Comodo)が2位、<strong>DigiCertGroup</strong>が3位です。</p>



<h3 class="wp-block-heading"><meta charset="utf-8">JavaScript CDN</h3>



<ol class="wp-block-list"><li>CDNJS</li><li>jsDelivr</li><li>unpkg</li></ol>



<p>JavaScriptコンテンツ配信ネットワークカテゴリーの結果は、過去3年間とまったく同じです&nbsp;。<strong>CDNJS</strong>は6回連続で優勝しています。CDNJSは、2021年8月に最も人気のあるJavaScript CDNとしてGoogle Hosted Librariesに取って代わりました&nbsp;。<br>２番目の<strong>jsDelivr</strong>は、RawGitを取得したことで恩恵を受けています。&nbsp;<strong>unpkg</strong>は3番目。</p>



<h3 class="wp-block-heading">トラフィック分析ツール</h3>



<ol class="wp-block-list"><li>Google Analytics</li><li>Facebook Pixel</li><li>Hotjar</li></ol>



<p><strong>Google Analytics</strong>は過去7回の優勝を経て、今回2位の<strong>FacebookPixel</strong>からタイトルを取り戻しました&nbsp;。&nbsp;<strong>Hotjar</strong>は過去2年間と同様に3番目です。</p>



<h3 class="wp-block-heading">広告ネットワーク</h3>



<ol class="wp-block-list"><li>Google Ads</li><li>Xandr</li><li>Amazon Associates</li></ol>



<p><strong>Google</strong>はウェブ広告市場での優位性をさらに高めることに成功している。何年も前に別々のネットワークとして数えた「DoubleClick」と「Google AdSense」を含めると、これで8回目となる最も急速に成長している広告ネットワークです。&nbsp;<br>マイクロソフトに買収されようとしている<strong>Xandr</strong>は、この市場で2番目に速い成長率を示しました。2017年の勝者である<strong>Amazon Associates</strong>は、今年は第3位。</p>



<h3 class="wp-block-heading">タグマネージャー</h3>



<ol class="wp-block-list"><li>Google Tag Manager</li><li>Tealium</li><li>Ensighten</li></ol>



<p>タグマネージャー市場は、99.6％という驚くべきマーケットシェアを持つ<strong>Google Tag Manager</strong>によって完全に支配されています。Google Tag Managerは成長を続けており、8年連続でタグマネージャーオブザイヤーです。<br>タグマネージャー界で最も急成長している競合他社は、<strong>Tealium</strong>と<strong>Ensighten</strong>です。</p>



<h3 class="wp-block-heading">ソーシャルウィジェット</h3>



<ol class="wp-block-list"><li>Twitter</li><li>Facebook</li><li>LinkedIn</li></ol>



<p><strong>Twitter</strong>は2021年8月に最も人気のあるソーシャルウィジェットになりました。これは2014年と2015年にタイトルを獲得して以来のソーシャルウィジェットオブイヤーです&nbsp;。<br>２番目は<strong>Facebook</strong>、<strong>LinkedIn</strong>は３番目です。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>今回の記事を作成してよかったことが３点ありました。</p>



<p>１つ目は、Web技術についてのトレンドを知れたことです。Web制作の勉強を始めて3ヶ月が経った現時点で「今勉強していることは時代遅れなんじゃないか？」などの不安が巡っていました。行動を起こすことにより、W3Techsの2021年Web技術の調査結果のページに巡り合え、トレンドを知ることで自分が勉強しているプログラミング言語の立ち位置を知ることができました。</p>



<p>２つ目は、Web技術についての知見が広がったことです。プログラミングの勉強を始めてから間もなくわからないことばかりなので、 W3Techsの2021年Web技術の調査結果を読んだときは、英語を理解できても文章を理解できませんでした。その都度わからないIT用語を調べることで、理解が深まり知見が広がりました。</p>



<p>そして３つ目は、久しぶりに英語に触れたことです。普段日本で生活していると自分で意識しない限りなかなか英語に触れる機会がありません。しかし、世界中のいろんな大多数の情報は英語で発信されています。特にIT関係の情報は英語で発信されていることが多い（英語の方が情報量が多い）ので、継続するべきだと感じました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
