<?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>Seek Rise</title>
	<atom:link href="https://seek-rise.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://seek-rise.com</link>
	<description></description>
	<lastBuildDate>Mon, 09 Feb 2026 11:30:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://seek-rise.com/wp-content/uploads/2019/10/cropped-favicon-32x32.png</url>
	<title>Seek Rise</title>
	<link>https://seek-rise.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/><site xmlns="com-wordpress:feed-additions:1">167377966</site>	<item>
		<title>固定IP（グローバルIP）が必要になったエンジニアへ｜VPS×WireGuardという選択肢</title>
		<link>https://seek-rise.com/web%e9%96%8b%e7%99%ba/post-483/</link>
					<comments>https://seek-rise.com/web%e9%96%8b%e7%99%ba/post-483/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 09 Feb 2026 11:28:37 +0000</pubDate>
				<category><![CDATA[Web開発]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=483</guid>

					<description><![CDATA[フリーランスや副業エンジニアとして仕事をしていると、 「IP制限がかかっているので、固定IPを教えてください」 と言われることがあります。 自宅回線は動的IP。固定IPはオプションで高額。既存の固定IPサービスは値段の割 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="160" data-end="202">フリーランスや副業エンジニアとして仕事をしていると、</p>
<p data-start="160" data-end="202">「IP制限がかかっているので、固定IPを教えてください」</p>
<p data-start="234" data-end="247">と言われることがあります。</p>
<p data-start="249" data-end="303">自宅回線は動的IP。<br data-start="259" data-end="262" />固定IPはオプションで高額。<br data-start="276" data-end="279" />既存の固定IPサービスは値段の割に速度も出ず不安定なこともある。</p>
<p data-start="305" data-end="319">“どうするのが現実的なのか”</p>
<p data-start="321" data-end="333">私が最終的に選んだのは、</p>
<p data-start="335" data-end="375"><strong data-start="335" data-end="371">VPSを契約し、その中にWireGuardでVPNを構築する方法</strong>でした。</p>
<hr data-start="377" data-end="380" />
<h2 data-start="382" data-end="394">なぜこの構成なのか</h2>
<p data-start="396" data-end="406">構成はシンプルです。</p>
<p data-start="408" data-end="451">自宅（10.0.0.x）<br data-start="420" data-end="423" />→ VPSでNAT<br data-start="432" data-end="435" />→ 固定グローバルIPで外へ出る</p>
<p data-start="453" data-end="486">月額数百円。<br data-start="459" data-end="462" />実務で使える速度。<br data-start="471" data-end="474" />自分で制御できる安心感。</p>
<p data-start="488" data-end="502">実際に速度を計測したところ、</p>
<p data-start="504" data-end="538">通常回線：下り400Mbps超<br data-start="519" data-end="522" />VPN経由：下り60Mbps前後</p>
<p data-start="504" data-end="538"><a href="https://seek-rise.com/wp-content/uploads/2026/02/5c58480a6d7d092d22cc46420eb487a1.png"><img decoding="async" class="alignnone wp-image-485 size-medium" src="https://seek-rise.com/wp-content/uploads/2026/02/5c58480a6d7d092d22cc46420eb487a1-300x162.png" alt="通常回線" width="300" height="162" srcset="https://seek-rise.com/wp-content/uploads/2026/02/5c58480a6d7d092d22cc46420eb487a1-300x162.png 300w, https://seek-rise.com/wp-content/uploads/2026/02/5c58480a6d7d092d22cc46420eb487a1.png 743w" sizes="(max-width: 300px) 100vw, 300px" /></a><img decoding="async" class="alignnone wp-image-484 size-medium" src="https://seek-rise.com/wp-content/uploads/2026/02/27acf6db8b0efda421efa9cfe56e6a36-300x161.png" alt="VPN経由" width="300" height="161" srcset="https://seek-rise.com/wp-content/uploads/2026/02/27acf6db8b0efda421efa9cfe56e6a36-300x161.png 300w, https://seek-rise.com/wp-content/uploads/2026/02/27acf6db8b0efda421efa9cfe56e6a36.png 748w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p data-start="540" data-end="570">数字だけ見ると落ちますが、<br data-start="553" data-end="556" />実務用途では十分な帯域です。</p>
<p data-start="572" data-end="581">むしろ重要なのは、</p>
<p data-start="583" data-end="612">・安定性<br data-start="587" data-end="590" />・再現性<br data-start="594" data-end="597" />・トラブル時に自分で直せること</p>
<p data-start="614" data-end="620">ここでした。</p>
<hr data-start="622" data-end="625" />
<h2 data-start="627" data-end="642">でも、構築は意外とハマる</h2>
<p data-start="644" data-end="673">実際にやってみると、<br data-start="654" data-end="657" />次のポイントで詰まりやすいです。</p>
<p data-start="675" data-end="774">・パケットフィルターを開け忘れる<br data-start="691" data-end="694" />・UFWのFORWARDがDROPのまま<br data-start="714" data-end="717" />・NATのインターフェース名を間違える<br data-start="736" data-end="739" />・DNSだけ通らない<br data-start="749" data-end="752" />・SaveConfigでPeerが消える</p>
<p data-start="776" data-end="792">「繋がっているのに通信できない」</p>
<p data-start="794" data-end="808">この状態が一番しんどいです。</p>
<p data-start="810" data-end="833">原因が分からないと、<br data-start="820" data-end="823" />時間だけが溶けます。</p>
<hr data-start="835" data-end="838" />
<h2 data-start="840" data-end="857">そこで、手順書をまとめました</h2>
<p data-start="859" data-end="885">実際に構築して、<br data-start="867" data-end="870" />ハマった順番で整理しています。</p>
<p data-start="887" data-end="895">内容は以下です。</p>
<p data-start="897" data-end="1041">・シンVPS契約手順（SSHキー自動生成含む）<br data-start="920" data-end="923" />・パケットフィルター設定（TCP22 / UDP51820）<br data-start="953" data-end="956" />・UFW / FORWARD / NATの正しい設定<br data-start="982" data-end="985" />・WireGuard鍵構造の整理<br data-start="1001" data-end="1004" />・Mac / iPhoneの具体設定<br data-start="1022" data-end="1025" />・DNSトラブルの切り分け順</p>
<p data-start="1043" data-end="1091">コマンドはコピペで進められるようにしつつ、<br data-start="1064" data-end="1067" />「なぜその操作をしているのか」も解説しています。</p>
<hr data-start="1093" data-end="1096" />
<h2 data-start="1098" data-end="1112">こんな人に向いています</h2>
<p data-start="1114" data-end="1197">・取引先に固定IP提出が必要<br data-start="1128" data-end="1131" />・安定した固定IP環境を自分で持ちたい<br data-start="1150" data-end="1153" />・ブラックボックスなサービスに依存したくない<br data-start="1175" data-end="1178" />・ネットワークの理解を一段深めたい</p>
<p data-start="1199" data-end="1230">初心者向けというより、<br data-start="1210" data-end="1213" /><strong data-start="1213" data-end="1227">エンジニア寄りの内容</strong>です。</p>
<hr data-start="1232" data-end="1235" />
<h2 data-start="1237" data-end="1246">詳細はこちら</h2>
<p data-start="1248" data-end="1269">noteで有料手順書として公開しています。</p>
<p data-start="1325" data-end="1338">→<a href="https://note.com/noa_advance_1223/n/n71f908089dc6">シンVPS×WireGuardで「VPN」を作る手順書（Mac/iPhone対応）――固定IP（グローバルIP）が必要なあなたへ</a></p>
<hr data-start="1340" data-end="1343" />
<p data-start="1345" data-end="1348">もし、</p>
<p data-start="1350" data-end="1373">「固定IPが必要だけど、どうするか迷っている」</p>
<p data-start="1375" data-end="1404">そんな状態なら、<br data-start="1383" data-end="1386" />この構成はかなり現実的な選択肢です。</p>
<p data-start="1406" data-end="1441">自分専用の“出口”を持つだけで、<br data-start="1422" data-end="1425" />仕事の自由度は大きく変わります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web%e9%96%8b%e7%99%ba/post-483/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">483</post-id>	</item>
		<item>
		<title>7-1 MySQLとは？データベースの役割と全体像</title>
		<link>https://seek-rise.com/web-development/php-practical/post-452/</link>
					<comments>https://seek-rise.com/web-development/php-practical/post-452/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Thu, 25 Dec 2025 12:34:45 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[PHP実務・セキュリティ]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[PHP応用]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=452</guid>

					<description><![CDATA[これまでのPHP基礎章では、フォーム送信・バリデーション・セキュリティ・セッションまで学び、「画面とPHPがつながる仕組み」 を理解してきました。 しかし、ここまでの処理には 決定的に足りない要素 があります。 それが、 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="192" data-end="275">これまでのPHP基礎章では、<br data-start="206" data-end="209" />フォーム送信・バリデーション・セキュリティ・セッションまで学び、<br data-start="241" data-end="244" /><strong data-start="244" data-end="264">「画面とPHPがつながる仕組み」</strong> を理解してきました。</p>
<p data-start="277" data-end="315">しかし、<br data-start="281" data-end="284" />ここまでの処理には <strong data-start="294" data-end="308">決定的に足りない要素</strong> があります。</p>
<p data-start="317" data-end="342">それが、<br data-start="321" data-end="324" /><strong data-start="324" data-end="338">データを保存する場所</strong> です。</p>
<p data-start="344" data-end="373">・ユーザー情報<br data-start="351" data-end="354" />・投稿内容<br data-start="359" data-end="362" />・お問い合わせ履歴</p>
<p data-start="375" data-end="403">これらを毎回消えてしまう変数だけで扱うことはできません。</p>
<p data-start="405" data-end="439">そこで登場するのが、<br data-start="415" data-end="418" /><strong data-start="418" data-end="435">データベース（MySQL）</strong> です。</p>
<p data-start="441" data-end="513">この記事では、<br data-start="448" data-end="451" /><strong data-start="451" data-end="490">MySQLとは何か、なぜ必要なのか、<br data-start="471" data-end="474" />PHPとどう関係しているのか</strong> を<br data-start="492" data-end="495" />実装に進む前の段階として整理します。</p>
<hr data-start="515" data-end="518" />
<h2 data-start="520" data-end="533">この記事で学べること</h2>
<p data-start="535" data-end="607">・データベースとは何か<br data-start="546" data-end="549" />・MySQLの役割<br data-start="558" data-end="561" />・PHPとMySQLの関係<br data-start="574" data-end="577" />・CRUDという考え方<br data-start="588" data-end="591" />・次の記事で何を実装するのか</p>
<hr data-start="609" data-end="612" />
<h2 data-start="614" data-end="627">データベースとは何か</h2>
<p data-start="629" data-end="675">データベースとは、<br data-start="638" data-end="641" /><strong data-start="641" data-end="671">データを整理して保存し、必要なときに取り出せる仕組み</strong> です。</p>
<p data-start="677" data-end="691">単なるファイル保存とは違い、</p>
<p data-start="693" data-end="731">・大量のデータを扱える<br data-start="704" data-end="707" />・高速に検索できる<br data-start="716" data-end="719" />・同時アクセスに強い</p>
<p data-start="733" data-end="744">という特徴があります。</p>
<p data-start="746" data-end="795">Webサービスでは、<br data-start="756" data-end="759" /><strong data-start="759" data-end="777">データベースなしはあり得ない</strong><br data-start="777" data-end="780" />と言っても過言ではありません。</p>
<hr data-start="797" data-end="800" />
<h2 data-start="802" data-end="820">なぜファイル保存ではダメなのか</h2>
<p data-start="822" data-end="858">「テキストファイルに保存すればいいのでは？」<br data-start="844" data-end="847" />と思うかもしれません。</p>
<p data-start="860" data-end="878">しかし、実際には次の問題があります。</p>
<p data-start="880" data-end="929">・検索が遅い<br data-start="886" data-end="889" />・同時アクセスに弱い<br data-start="899" data-end="902" />・データの整合性が取れない<br data-start="915" data-end="918" />・更新・削除が複雑</p>
<p data-start="931" data-end="962">データベースは、<br data-start="939" data-end="942" />これらの問題を解決するために存在します。</p>
<hr data-start="964" data-end="967" />
<h2 data-start="969" data-end="981">MySQLとは何か</h2>
<p data-start="983" data-end="1027">MySQLは、<br data-start="990" data-end="993" /><strong data-start="993" data-end="1023">世界で最も使われているデータベース管理システムの一つ</strong> です。</p>
<p data-start="1029" data-end="1036">特徴としては、</p>
<p data-start="1038" data-end="1076">・無料で使える<br data-start="1045" data-end="1048" />・高速<br data-start="1051" data-end="1054" />・情報が豊富<br data-start="1060" data-end="1063" />・PHPとの相性が良い</p>
<p data-start="1078" data-end="1088">という点があります。</p>
<p data-start="1090" data-end="1123">WordPressも、<br data-start="1101" data-end="1104" />内部では MySQL を使っています。</p>
<hr data-start="1125" data-end="1128" />
<h2 data-start="1130" data-end="1147">データベースは「表」で考える</h2>
<p data-start="1149" data-end="1194">データベースは、<br data-start="1157" data-end="1160" /><strong data-start="1160" data-end="1171">表（テーブル）</strong> の集まりとして考えると分かりやすくなります。</p>
<p data-start="1196" data-end="1205">イメージとしては、</p>
<p data-start="1207" data-end="1237">・Excelのシート<br data-start="1217" data-end="1220" />・Googleスプレッドシート</p>
<p data-start="1239" data-end="1245">に近いです。</p>
<hr data-start="1247" data-end="1250" />
<h2 data-start="1252" data-end="1264">テーブルの基本構造</h2>
<p data-start="1266" data-end="1290">1つのテーブルは、<br data-start="1275" data-end="1278" />次の要素で構成されます。</p>
<p data-start="1292" data-end="1312">・列（カラム）<br data-start="1299" data-end="1302" />・行（レコード）</p>
<p data-start="1314" data-end="1335">例えば、<br data-start="1318" data-end="1321" />ユーザー情報のテーブルでは、</p>
<p data-start="1337" data-end="1359">・id<br data-start="1340" data-end="1343" />・名前<br data-start="1346" data-end="1349" />・メールアドレス</p>
<p data-start="1361" data-end="1388">といった列があり、<br data-start="1370" data-end="1373" />1人分の情報が1行になります。</p>
<hr data-start="1390" data-end="1393" />
<h2 data-start="1395" data-end="1408">主キー（id）の役割</h2>
<p data-start="1410" data-end="1440">多くのテーブルには、<br data-start="1420" data-end="1423" /><strong data-start="1423" data-end="1429">id</strong> という列があります。</p>
<p data-start="1442" data-end="1446">これは、</p>
<p data-start="1448" data-end="1480">・1行を一意に識別する<br data-start="1459" data-end="1462" />・重複しない<br data-start="1468" data-end="1471" />・自動で増える</p>
<p data-start="1482" data-end="1504">という特徴を持つ<br data-start="1490" data-end="1493" /><strong data-start="1493" data-end="1500">主キー</strong> です。</p>
<p data-start="1506" data-end="1543">PHPとMySQLを連携する際、<br data-start="1522" data-end="1525" />この id が非常に重要になります。</p>
<hr data-start="1545" data-end="1548" />
<h2 data-start="1550" data-end="1565">PHPとMySQLの関係</h2>
<p data-start="1567" data-end="1572">PHPは、</p>
<p data-start="1574" data-end="1601">・データを受け取る<br data-start="1583" data-end="1586" />・処理する<br data-start="1591" data-end="1594" />・表示する</p>
<p data-start="1603" data-end="1611">役割を持ちます。</p>
<p data-start="1613" data-end="1623">一方、MySQLは、</p>
<p data-start="1625" data-end="1652">・データを保存する<br data-start="1634" data-end="1637" />・検索する<br data-start="1642" data-end="1645" />・更新する</p>
<p data-start="1654" data-end="1662">役割を持ちます。</p>
<p data-start="1664" data-end="1701">PHPは、<br data-start="1669" data-end="1672" /><strong data-start="1672" data-end="1688">MySQLに命令を出す側</strong><br data-start="1688" data-end="1691" />だと考えてください。</p>
<hr data-start="1703" data-end="1706" />
<h2 data-start="1708" data-end="1718">SQLとは何か</h2>
<p data-start="1720" data-end="1764">MySQLに対して命令を出すための言語が、<br data-start="1741" data-end="1744" /><strong data-start="1744" data-end="1760">SQL（エスキューエル）</strong> です。</p>
<p data-start="1766" data-end="1776">SQLを使うことで、</p>
<p data-start="1778" data-end="1825">・データを保存する<br data-start="1787" data-end="1790" />・データを取得する<br data-start="1799" data-end="1802" />・データを更新する<br data-start="1811" data-end="1814" />・データを削除する</p>
<p data-start="1827" data-end="1839">といった操作ができます。</p>
<hr data-start="1841" data-end="1844" />
<h2 data-start="1846" data-end="1859">CRUDという考え方</h2>
<p data-start="1861" data-end="1890">Webアプリのデータ操作は、<br data-start="1875" data-end="1878" />次の4つに分類できます。</p>
<p data-start="1892" data-end="1945">・Create（作成）<br data-start="1903" data-end="1906" />・Read（取得）<br data-start="1915" data-end="1918" />・Update（更新）<br data-start="1929" data-end="1932" />・Delete（削除）</p>
<p data-start="1947" data-end="1972">これをまとめて<br data-start="1954" data-end="1957" /><strong data-start="1957" data-end="1965">CRUD</strong> と呼びます。</p>
<p data-start="1974" data-end="2004">実務のWeb開発は、<br data-start="1984" data-end="1987" />ほぼ CRUD の組み合わせです。</p>
<hr data-start="2006" data-end="2009" />
<h2 data-start="2011" data-end="2032">PHP × MySQL 学習のゴール</h2>
<p data-start="2034" data-end="2062">この章（7章）のゴールは、<br data-start="2047" data-end="2050" />次の状態になることです。</p>
<p data-start="2064" data-end="2127">・PHPからMySQLに接続できる<br data-start="2081" data-end="2084" />・データを保存できる<br data-start="2094" data-end="2097" />・データを一覧表示できる<br data-start="2109" data-end="2112" />・データを更新・削除できる</p>
<p data-start="2129" data-end="2181">ここまでできるようになると、<br data-start="2143" data-end="2146" /><strong data-start="2146" data-end="2162">「Webアプリを作れる」</strong><br data-start="2162" data-end="2165" />という実感がはっきり出てきます。</p>
<hr data-start="2183" data-end="2186" />
<h2 data-start="2188" data-end="2202">次の記事で何をするのか</h2>
<p data-start="2204" data-end="2229">次の記事では、<br data-start="2211" data-end="2214" />いよいよ実際に手を動かします。</p>
<p data-start="2231" data-end="2268">・MySQLに接続する<br data-start="2242" data-end="2245" />・データベースを作る<br data-start="2255" data-end="2258" />・テーブルを作る</p>
<p data-start="2270" data-end="2296">環境構築と操作の基礎から<br data-start="2282" data-end="2285" />順番に進めていきます。</p>
<hr data-start="2298" data-end="2301" />
<h2 data-start="2303" data-end="2309">まとめ</h2>
<p data-start="2311" data-end="2318">MySQLは、</p>
<p data-start="2320" data-end="2369">・Webアプリのデータを保存する場所<br data-start="2338" data-end="2341" />・PHPと組み合わせて使う<br data-start="2354" data-end="2357" />・CRUD操作が基本</p>
<p data-start="2371" data-end="2384">という役割を持っています。</p>
<p data-start="2386" data-end="2441">PHP基礎を終えた今、<br data-start="2397" data-end="2400" />MySQLに進むのは<br data-start="2410" data-end="2413" /><strong data-start="2413" data-end="2437">最も自然で、最も成長を実感できるステップ</strong> です。</p>
<hr data-start="2443" data-end="2446" />
<h2 data-start="2448" data-end="2459">次に読むべき記事</h2>
<p data-start="2461" data-end="2499">▶ 次の記事<br data-start="2467" data-end="2470" />7-2 MySQLの基本操作（データベース・テーブル作成）</p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-practical/post-452/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">452</post-id>	</item>
		<item>
		<title>6-14 PHP基礎のまとめと次のステップ</title>
		<link>https://seek-rise.com/web-development/php-basic/post-449/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-449/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 01:08:41 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[学習ロードマップ]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHPまとめ]]></category>
		<category><![CDATA[次のステップ]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=449</guid>

					<description><![CDATA[この章では、PHPを使ったWeb開発の 基礎から実践直前レベル までを一気に学んできました。 文法だけでなく、 ・フォーム処理・セキュリティ・セッション・ログイン処理 といった「Webアプリとして動くために必要な要素」  [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="190" data-end="246">この章では、<br data-start="196" data-end="199" />PHPを使ったWeb開発の <strong data-start="213" data-end="228">基礎から実践直前レベル</strong> までを<br data-start="232" data-end="235" />一気に学んできました。</p>
<p data-start="248" data-end="256">文法だけでなく、</p>
<p data-start="258" data-end="296">・フォーム処理<br data-start="265" data-end="268" />・セキュリティ<br data-start="275" data-end="278" />・セッション<br data-start="284" data-end="287" />・ログイン処理</p>
<p data-start="298" data-end="357">といった<br data-start="302" data-end="305" /><strong data-start="305" data-end="330">「Webアプリとして動くために必要な要素」</strong> を<br data-start="332" data-end="335" />一通り体験したことが、6章の最大の成果です。</p>
<p data-start="359" data-end="382">この記事では、<br data-start="366" data-end="369" />6章全体を振り返りながら、</p>
<p data-start="384" data-end="429">・何ができるようになったのか<br data-start="398" data-end="401" />・なぜこの順番で学んだのか<br data-start="414" data-end="417" />・次に何へ進むべきか</p>
<p data-start="431" data-end="438">を整理します。</p>
<hr data-start="440" data-end="443" />
<h2 data-start="445" data-end="460">6章のゴールを再確認する</h2>
<p data-start="462" data-end="486">6章のゴールは、<br data-start="470" data-end="473" />次の状態になることでした。</p>
<p data-start="488" data-end="581">・PHPのコードを読んで意味を説明できる<br data-start="508" data-end="511" />・フォームからの入力を正しく処理できる<br data-start="530" data-end="533" />・危険な入力をそのまま扱わない意識がある<br data-start="553" data-end="556" />・ログインの仕組みを「流れ」として理解している</p>
<p data-start="583" data-end="627"><strong data-start="583" data-end="595">完璧に書けること</strong> ではなく、<br data-start="601" data-end="604" /><strong data-start="604" data-end="620">仕組みを理解していること</strong> が重要です。</p>
<hr data-start="629" data-end="632" />
<h2 data-start="634" data-end="653">6章で学んだ内容を流れで整理する</h2>
<p data-start="655" data-end="691">ここまでの記事を、<br data-start="664" data-end="667" /><strong data-start="667" data-end="683">Webアプリの処理の流れ</strong> で整理します。</p>
<hr data-start="693" data-end="696" />
<h3 data-start="698" data-end="723">① PHPの基本文法（6-2 / 6-3）</h3>
<p data-start="725" data-end="775">・PHPはサーバーで動く<br data-start="737" data-end="740" />・変数とデータ型を使って値を扱う<br data-start="756" data-end="759" />・処理は上から順に実行される</p>
<p data-start="777" data-end="815">ここで、<br data-start="781" data-end="784" />「PHPでコードを書くための最低限の土台」<br data-start="805" data-end="808" />を作りました。</p>
<hr data-start="817" data-end="820" />
<h3 data-start="822" data-end="852">② 処理を制御する（6-4 / 6-5 / 6-6）</h3>
<p data-start="854" data-end="908">・条件分岐（if / elseif / switch）<br data-start="881" data-end="884" />・繰り返し処理（for / foreach）</p>
<p data-start="910" data-end="916">これにより、</p>
<p data-start="918" data-end="948">・場合によって処理を変える<br data-start="931" data-end="934" />・同じ処理をまとめて書く</p>
<p data-start="950" data-end="984">という<br data-start="953" data-end="956" /><strong data-start="956" data-end="970">プログラムらしい動き</strong> ができるようになりました。</p>
<hr data-start="986" data-end="989" />
<h3 data-start="991" data-end="1012">③ データをまとめて扱う（6-7）</h3>
<p data-start="1014" data-end="1052">・インデックス配列<br data-start="1023" data-end="1026" />・連想配列<br data-start="1031" data-end="1034" />・foreach との組み合わせ</p>
<p data-start="1054" data-end="1102">フォーム入力やエラー管理など、<br data-start="1069" data-end="1072" /><strong data-start="1072" data-end="1088">Web開発では配列が前提</strong> であることを理解しました。</p>
<hr data-start="1104" data-end="1107" />
<h3 data-start="1109" data-end="1135">④ ユーザー入力を扱う（6-8 / 6-9）</h3>
<p data-start="1137" data-end="1197">・HTMLフォームとPHPの連携<br data-start="1153" data-end="1156" />・$_POST / $_GET の仕組み<br data-start="1176" data-end="1179" />・バリデーション（入力チェック）</p>
<p data-start="1199" data-end="1241">ここで初めて、<br data-start="1206" data-end="1209" /><strong data-start="1209" data-end="1230">ユーザーとPHPが直接つながる処理</strong><br data-start="1230" data-end="1233" />を実装しました。</p>
<hr data-start="1243" data-end="1246" />
<h3 data-start="1248" data-end="1276">⑤ セキュリティの基礎（6-10 / 6-11）</h3>
<p data-start="1278" data-end="1312">・XSS（表示時の危険）<br data-start="1290" data-end="1293" />・CSRF（意図しない操作の危険）</p>
<p data-start="1314" data-end="1354">「動くコード」から<br data-start="1323" data-end="1326" />「安全なコード」へ<br data-start="1335" data-end="1338" />視点を一段引き上げたパートです。</p>
<hr data-start="1356" data-end="1359" />
<h3 data-start="1361" data-end="1387">⑥ 状態を管理する（6-12 / 6-13）</h3>
<p data-start="1389" data-end="1427">・セッションの役割<br data-start="1398" data-end="1401" />・ログイン状態の管理<br data-start="1411" data-end="1414" />・ログイン処理の全体像</p>
<p data-start="1429" data-end="1468">ここで初めて、<br data-start="1436" data-end="1439" /><strong data-start="1439" data-end="1456">Webアプリとしての完成形</strong> を<br data-start="1458" data-end="1461" />体験しました。</p>
<hr data-start="1470" data-end="1473" />
<h2 data-start="1475" data-end="1492">今できるようになっていること</h2>
<p data-start="1494" data-end="1528">6章を終えた時点で、<br data-start="1504" data-end="1507" />次のようなことができる状態になっています。</p>
<p data-start="1530" data-end="1607">・フォームを作り、PHPで受け取れる<br data-start="1548" data-end="1551" />・入力値をチェックして処理を分けられる<br data-start="1570" data-end="1573" />・危険な入力をそのまま表示しない<br data-start="1589" data-end="1592" />・ログイン状態を管理できる</p>
<p data-start="1609" data-end="1645">これは、<br data-start="1613" data-end="1616" /><strong data-start="1616" data-end="1641">Web開発の「基礎体力」が一通り揃った状態</strong> です。</p>
<hr data-start="1647" data-end="1650" />
<h2 data-start="1652" data-end="1669">まだ「できなくて普通」なこと</h2>
<p data-start="1671" data-end="1699">この時点で、<br data-start="1677" data-end="1680" />次のことができなくても問題ありません。</p>
<p data-start="1701" data-end="1759">・データベース連携<br data-start="1710" data-end="1713" />・パスワードの安全な保存<br data-start="1725" data-end="1728" />・複雑な設計（MVCなど）<br data-start="1741" data-end="1744" />・フレームワークの内部構造</p>
<p data-start="1761" data-end="1788">これらは、<br data-start="1766" data-end="1769" /><strong data-start="1769" data-end="1784">次のステップで学ぶ内容</strong> です。</p>
<hr data-start="1790" data-end="1793" />
<h2 data-start="1795" data-end="1814">次に進む前のおすすめ確認ポイント</h2>
<p data-start="1816" data-end="1844">次の章に進む前に、<br data-start="1825" data-end="1828" />以下を一度確認してみてください。</p>
<p data-start="1846" data-end="1937">・if 文の条件を日本語で説明できるか<br data-start="1865" data-end="1868" />・foreach が何をしているか説明できるか<br data-start="1891" data-end="1894" />・XSS と CSRF の違いを説明できるか<br data-start="1916" data-end="1919" />・セッションの役割を説明できるか</p>
<p data-start="1939" data-end="1994">すべて完璧でなくても、<br data-start="1950" data-end="1953" />「聞いたことがある」ではなく<br data-start="1967" data-end="1970" /><strong data-start="1970" data-end="1982">「意味が分かる」</strong> 状態であれば十分です。</p>
<hr data-start="1996" data-end="1999" />
<h2 data-start="2001" data-end="2015">次に学ぶべき内容は何か</h2>
<p data-start="2017" data-end="2064">6章の次として、<br data-start="2025" data-end="2028" />最も自然でおすすめなのは<br data-start="2040" data-end="2043" /><strong data-start="2043" data-end="2060">データベース（MySQL）</strong> です。</p>
<p data-start="2066" data-end="2074">理由は明確です。</p>
<p data-start="2076" data-end="2128">・ログイン情報を保存したい<br data-start="2089" data-end="2092" />・投稿やお問い合わせを保存したい<br data-start="2108" data-end="2111" />・一覧表示・編集・削除をしたい</p>
<p data-start="2130" data-end="2163">これらはすべて、<br data-start="2138" data-end="2141" /><strong data-start="2141" data-end="2162">データベースなしでは実現できません</strong>。</p>
<hr data-start="2165" data-end="2168" />
<h2 data-start="2170" data-end="2184">次章（7章）の位置づけ</h2>
<p data-start="2186" data-end="2191">7章では、</p>
<p data-start="2193" data-end="2265">・MySQLとは何か<br data-start="2203" data-end="2206" />・データベースとテーブルの考え方<br data-start="2222" data-end="2225" />・PHPからデータを保存・取得する<br data-start="2242" data-end="2245" />・CRUD（作成・取得・更新・削除）</p>
<p data-start="2267" data-end="2276">を順番に扱います。</p>
<p data-start="2278" data-end="2319">ここまで進むと、<br data-start="2286" data-end="2289" />「Webアプリを作っている感覚」<br data-start="2305" data-end="2308" />がはっきり出てきます。</p>
<hr data-start="2321" data-end="2324" />
<h2 data-start="2326" data-end="2346">フレームワークはまだ使わなくていい</h2>
<p data-start="2348" data-end="2399">この段階では、<br data-start="2355" data-end="2358" />Laravel などのフレームワークは<br data-start="2377" data-end="2380" /><strong data-start="2380" data-end="2398">まだ使わなくて問題ありません</strong>。</p>
<p data-start="2401" data-end="2404">今は、</p>
<p data-start="2406" data-end="2437">・PHPが何をしているのか<br data-start="2419" data-end="2422" />・なぜその処理が必要なのか</p>
<p data-start="2439" data-end="2463">を理解していることの方が<br data-start="2451" data-end="2454" />はるかに重要です。</p>
<hr data-start="2465" data-end="2468" />
<h2 data-start="2470" data-end="2476">まとめ</h2>
<p data-start="2478" data-end="2503">6章では、<br data-start="2483" data-end="2486" />PHPを使ったWeb開発の基礎を、</p>
<p data-start="2505" data-end="2537">・文法<br data-start="2508" data-end="2511" />・処理の流れ<br data-start="2517" data-end="2520" />・セキュリティ<br data-start="2527" data-end="2530" />・状態管理</p>
<p data-start="2539" data-end="2565">という観点から<br data-start="2546" data-end="2549" /><strong data-start="2549" data-end="2564">実装ベースで学びました</strong>。</p>
<p data-start="2567" data-end="2629">ここまで来たあなたは、<br data-start="2578" data-end="2581" />「PHPを少し触った人」ではなく、<br data-start="2598" data-end="2601" /><strong data-start="2601" data-end="2623">Webアプリの仕組みを理解している人</strong><br data-start="2623" data-end="2626" />です。</p>
<p data-start="2631" data-end="2685">次のステップとして、<br data-start="2641" data-end="2644" /><strong data-start="2644" data-end="2665">MySQL × PHP（CRUD）</strong> に進む準備は<br data-start="2672" data-end="2675" />十分に整っています。</p>
<hr data-start="2687" data-end="2690" />
<h2 data-start="2692" data-end="2703">次に読むべき記事</h2>
<p data-start="2705" data-end="2741">▶ 次の記事<br data-start="2711" data-end="2714" /><a href="https://seek-rise.com/web-development/php-practical/post-452/">7-1 MySQLとは？データベースの役割と全体像</a></p>
<p data-start="2743" data-end="2779">▶ 関連記事<br data-start="2749" data-end="2752" /><a href="https://seek-rise.com/web-development/php-basic/post-446/">6-13 PHPでログイン処理の基本を作ってみよう</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-449/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">449</post-id>	</item>
		<item>
		<title>6-13 PHPでログイン処理の基本を作ってみよう</title>
		<link>https://seek-rise.com/web-development/php-basic/post-446/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-446/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 14:49:02 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[PHPログイン]]></category>
		<category><![CDATA[セッション]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=446</guid>

					<description><![CDATA[ここまでで、PHPでWebアプリを作るための すべての基礎部品 が揃いました。 ・フォーム送信・バリデーション・XSS対策・CSRF対策・セッション管理 これらは、ログイン処理 を作るために必要な要素です。 この記事では [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="249" data-end="295">ここまでで、<br data-start="255" data-end="258" />PHPでWebアプリを作るための <strong data-start="275" data-end="287">すべての基礎部品</strong> が揃いました。</p>
<p data-start="297" data-end="347">・フォーム送信<br data-start="304" data-end="307" />・バリデーション<br data-start="315" data-end="318" />・XSS対策<br data-start="324" data-end="327" />・CSRF対策<br data-start="334" data-end="337" />・セッション管理</p>
<p data-start="349" data-end="382">これらは、<br data-start="354" data-end="357" /><strong data-start="357" data-end="367">ログイン処理</strong> を作るために必要な要素です。</p>
<p data-start="384" data-end="461">この記事では、<br data-start="391" data-end="394" />これまで学んだ内容を総動員して、<br data-start="410" data-end="413" /><strong data-start="413" data-end="432">学習用のシンプルなログイン処理</strong> を実装しながら、<br data-start="441" data-end="444" />Webアプリの全体像を整理します。</p>
<hr data-start="463" data-end="466" />
<h2 data-start="468" data-end="481">この記事で学べること</h2>
<p data-start="483" data-end="547">・ログイン処理の全体構造<br data-start="495" data-end="498" />・フォームから認証までの流れ<br data-start="512" data-end="515" />・セッションを使ったログイン管理<br data-start="531" data-end="534" />・実務につながる考え方</p>
<hr data-start="549" data-end="552" />
<h2 data-start="554" data-end="567">ログイン処理の全体像</h2>
<p data-start="569" data-end="592">まずは、<br data-start="573" data-end="576" />ログイン処理の流れを整理します。</p>
<ol data-start="594" data-end="706">
<li data-start="594" data-end="610">
<p data-start="597" data-end="610">ログインフォームを表示</p>
</li>
<li data-start="611" data-end="632">
<p data-start="614" data-end="632">ユーザーがID・パスワードを入力</p>
</li>
<li data-start="633" data-end="651">
<p data-start="636" data-end="651">PHPで入力内容を受け取る</p>
</li>
<li data-start="652" data-end="667">
<p data-start="655" data-end="667">バリデーションを行う</p>
</li>
<li data-start="668" data-end="689">
<p data-start="671" data-end="689">認証に成功したらセッションに保存</p>
</li>
<li data-start="690" data-end="706">
<p data-start="693" data-end="706">ログイン後ページを表示</p>
</li>
</ol>
<p data-start="708" data-end="746">今回は、<br data-start="712" data-end="715" /><strong data-start="715" data-end="729">データベースは使わず</strong>、<br data-start="730" data-end="733" />仕組みの理解に集中します。</p>
<hr data-start="748" data-end="751" />
<h2 data-start="753" data-end="769">ログインフォームを作成する</h2>
<h3 data-start="771" data-end="792">サンプルコード①：ログインフォーム</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span></span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"login.php"</span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">label</span></span>&gt;
    ユーザー名：
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span>&gt;
  <span class="hljs-tag">&lt;/<span class="hljs-name">label</span></span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">br</span></span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">label</span></span>&gt;
    パスワード：
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span>&gt;
  <span class="hljs-tag">&lt;/<span class="hljs-name">label</span></span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">br</span></span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span>&gt;ログイン<span class="hljs-tag">&lt;/<span class="hljs-name">button</span></span>&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span></span>&gt;
</code></pre>
</div>
<hr data-start="1055" data-end="1058" />
<h3 data-start="1060" data-end="1068">ポイント</h3>
<p data-start="1070" data-end="1142">・name 属性が PHP 側と対応<br data-start="1088" data-end="1091" />・password は type=&#8221;password&#8221; を使用<br data-start="1122" data-end="1125" />・action で送信先を指定</p>
<hr data-start="1144" data-end="1147" />
<h2 data-start="1149" data-end="1164">ログイン処理（PHP側）</h2>
<p data-start="1166" data-end="1195">次に、<br data-start="1169" data-end="1172" />フォーム送信を受け取る PHP を作成します。</p>
<h3 data-start="1197" data-end="1219">サンプルコード②：ログイン処理の基本</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-variable">$errors</span> = [];

<span class="hljs-variable">$username</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'username'</span>] ?? <span class="hljs-string">''</span>;
<span class="hljs-variable">$password</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'password'</span>] ?? <span class="hljs-string">''</span>;

<span class="hljs-keyword">if</span> (<span class="hljs-variable">$username</span> === <span class="hljs-string">''</span>) {
  <span class="hljs-variable">$errors</span>[] = <span class="hljs-string">'ユーザー名を入力してください'</span>;
}

<span class="hljs-keyword">if</span> (<span class="hljs-variable">$password</span> === <span class="hljs-string">''</span>) {
  <span class="hljs-variable">$errors</span>[] = <span class="hljs-string">'パスワードを入力してください'</span>;
}

<span class="hljs-keyword">if</span> (<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$errors</span>)) {
  <span class="hljs-keyword">if</span> (<span class="hljs-variable">$username</span> === <span class="hljs-string">'admin'</span> &amp;&amp; <span class="hljs-variable">$password</span> === <span class="hljs-string">'password'</span>) {
    <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'is_login'</span>] = <span class="hljs-literal">true</span>;
    <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'username'</span>] = <span class="hljs-variable">$username</span>;
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'ログイン成功'</span>;
  } <span class="hljs-keyword">else</span> {
    <span class="hljs-keyword">echo</span> <span class="hljs-string">'ユーザー名またはパスワードが違います'</span>;
  }
} <span class="hljs-keyword">else</span> {
  <span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$errors</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$error</span>) {
    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$error</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
  }
}
</code></pre>
</div>
<hr data-start="1759" data-end="1762" />
<h2 data-start="1764" data-end="1778">コードの流れを整理する</h2>
<p data-start="1780" data-end="1803">このコードでは、<br data-start="1788" data-end="1791" />次のことを行っています。</p>
<p data-start="1805" data-end="1864">・フォームデータを受け取る<br data-start="1818" data-end="1821" />・未入力チェックを行う<br data-start="1832" data-end="1835" />・認証情報を確認する<br data-start="1845" data-end="1848" />・成功したらセッションに保存</p>
<p data-start="1866" data-end="1904">これまで学んだ内容が<br data-start="1876" data-end="1879" /><strong data-start="1879" data-end="1892">すべて含まれている</strong> 点に注目してください。</p>
<hr data-start="1906" data-end="1909" />
<h2 data-start="1911" data-end="1926">セッションに保存する意味</h2>
<p data-start="1928" data-end="1937">ログイン成功時に、</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'is_login'</span>] = <span class="hljs-literal">true</span>;
</code></pre>
</div>
<p data-start="1981" data-end="1990">を保存することで、</p>
<p data-start="1992" data-end="2008">・このユーザーはログイン済み</p>
<p data-start="2010" data-end="2040">という状態を、<br data-start="2017" data-end="2020" /><strong data-start="2020" data-end="2034">ページをまたいで保持</strong> できます。</p>
<hr data-start="2042" data-end="2045" />
<h2 data-start="2047" data-end="2060">ログイン後ページの例</h2>
<p data-start="2062" data-end="2094">ログイン後に表示するページでは、<br data-start="2078" data-end="2081" />次のようにチェックします。</p>
<h3 data-start="2096" data-end="2115">サンプルコード③：ログイン判定</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-keyword">if</span> (<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'is_login'</span>])) {
  <span class="hljs-keyword">echo</span> <span class="hljs-string">'ログインしてください'</span>;
  <span class="hljs-keyword">exit</span>;
}

<span class="hljs-keyword">echo</span> <span class="hljs-string">'ようこそ、'</span> . <span class="hljs-title function_ invoke__">htmlspecialchars</span>(<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'username'</span>], ENT_QUOTES, <span class="hljs-string">'UTF-8'</span>) . <span class="hljs-string">'さん'</span>;
</code></pre>
</div>
<hr data-start="2305" data-end="2308" />
<h3 data-start="2310" data-end="2318">ポイント</h3>
<p data-start="2320" data-end="2358">・ログインしていなければ処理を止める<br data-start="2338" data-end="2341" />・表示時は XSS 対策を行う</p>
<p data-start="2360" data-end="2393">ログイン判定は、<br data-start="2368" data-end="2371" /><strong data-start="2371" data-end="2389">保護したいページすべてに必要</strong> です。</p>
<hr data-start="2395" data-end="2398" />
<h2 data-start="2400" data-end="2412">ログアウト処理の例</h2>
<h3 data-start="2414" data-end="2432">サンプルコード④：ログアウト</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-variable">$_SESSION</span> = [];
<span class="hljs-title function_ invoke__">session_destroy</span>();

<span class="hljs-keyword">echo</span> <span class="hljs-string">'ログアウトしました'</span>;
</code></pre>
</div>
<hr data-start="2524" data-end="2527" />
<h2 data-start="2529" data-end="2546">このログイン処理は「学習用」</h2>
<p data-start="2548" data-end="2557">重要な注意点です。</p>
<p data-start="2559" data-end="2565">今回の例は、</p>
<p data-start="2567" data-end="2594">・パスワードを平文で比較<br data-start="2579" data-end="2582" />・データベース未使用</p>
<p data-start="2596" data-end="2618">という<br data-start="2599" data-end="2602" /><strong data-start="2602" data-end="2614">学習用の簡易実装</strong> です。</p>
<p data-start="2620" data-end="2625">実務では、</p>
<p data-start="2627" data-end="2653">・パスワードのハッシュ化<br data-start="2639" data-end="2642" />・データベース連携</p>
<p data-start="2655" data-end="2664">が必須になります。</p>
<hr data-start="2666" data-end="2669" />
<h2 data-start="2671" data-end="2688">それでもこの実装が重要な理由</h2>
<p data-start="2690" data-end="2706">このログイン処理を理解できると、</p>
<p data-start="2708" data-end="2757">・Webアプリの全体像が見える<br data-start="2723" data-end="2726" />・フレームワークの仕組みが分かる<br data-start="2742" data-end="2745" />・次の学習につながる</p>
<p data-start="2759" data-end="2773">という大きな意味があります。</p>
<p data-start="2775" data-end="2814">「なぜ Laravel がこうなっているのか」<br data-start="2798" data-end="2801" />が、後で必ず理解できます。</p>
<hr data-start="2816" data-end="2819" />
<h2 data-start="2821" data-end="2838">初心者がよくつまずくポイント</h2>
<p data-start="2840" data-end="2854">ログイン処理で多いミスです。</p>
<p data-start="2856" data-end="2908">・session_start の書き忘れ<br data-start="2876" data-end="2879" />・ログイン判定を書いていない<br data-start="2893" data-end="2896" />・XSS対策を忘れる</p>
<p data-start="2910" data-end="2939">「ログインできた＝完成」<br data-start="2922" data-end="2925" />ではない点に注意しましょう。</p>
<hr data-start="2941" data-end="2944" />
<h2 data-start="2946" data-end="2952">まとめ</h2>
<p data-start="2954" data-end="2967">PHPでのログイン処理は、</p>
<p data-start="2969" data-end="3004">・フォーム<br data-start="2974" data-end="2977" />・バリデーション<br data-start="2985" data-end="2988" />・セッション<br data-start="2994" data-end="2997" />・条件分岐</p>
<p data-start="3006" data-end="3030">を組み合わせた<br data-start="3013" data-end="3016" /><strong data-start="3016" data-end="3026">基礎の集大成</strong> です。</p>
<p data-start="3032" data-end="3079">ここまで実装できれば、<br data-start="3043" data-end="3046" />PHP基礎としては<br data-start="3055" data-end="3058" /><strong data-start="3058" data-end="3072">実務の入口に十分到達</strong> しています。</p>
<hr data-start="3081" data-end="3084" />
<h2 data-start="3086" data-end="3097">次に読むべき記事</h2>
<p data-start="3099" data-end="3131">▶ 次の記事<br data-start="3105" data-end="3108" /><a href="https://seek-rise.com/web-development/php-basic/post-449/">6-14 PHP基礎のまとめと次のステップ</a></p>
<p data-start="3133" data-end="3169">▶ 関連記事<br data-start="3139" data-end="3142" /><a href="https://seek-rise.com/web-development/php-basic/post-443/">6-12 PHPでセッションを使って状態を管理する</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-446/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">446</post-id>	</item>
		<item>
		<title>6-12 PHPでセッションを使って状態を管理する</title>
		<link>https://seek-rise.com/web-development/php-basic/post-443/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-443/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 14:26:50 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[PHPセッション]]></category>
		<category><![CDATA[ログイン処理]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=443</guid>

					<description><![CDATA[ここまでの記事で、フォーム処理・バリデーション・XSS・CSRF と、安全に入力を扱うための基礎 を一通り学びました。 しかし、Webアプリケーションにはもう一つ欠かせない要素があります。 それが、「状態を保持する仕組み [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="250" data-end="319">ここまでの記事で、<br data-start="259" data-end="262" />フォーム処理・バリデーション・XSS・CSRF と、<br data-start="288" data-end="291" /><strong data-start="291" data-end="308">安全に入力を扱うための基礎</strong> を一通り学びました。</p>
<p data-start="321" data-end="358">しかし、Webアプリケーションには<br data-start="338" data-end="341" />もう一つ欠かせない要素があります。</p>
<p data-start="360" data-end="387">それが、<br data-start="364" data-end="367" /><strong data-start="367" data-end="383">「状態を保持する仕組み」</strong> です。</p>
<p data-start="389" data-end="443">・ログイン状態を覚えておきたい<br data-start="404" data-end="407" />・前の画面の情報を引き継ぎたい<br data-start="422" data-end="425" />・ユーザーごとに情報を管理したい</p>
<p data-start="445" data-end="483">これらを実現するために使われるのが、<br data-start="463" data-end="466" /><strong data-start="466" data-end="479">PHPのセッション</strong> です。</p>
<p data-start="485" data-end="546">この記事では、<br data-start="492" data-end="495" /><strong data-start="495" data-end="532">セッションとは何か、なぜ必要なのか、<br data-start="515" data-end="518" />PHPでの基本的な使い方</strong> をコード付きで解説します。</p>
<hr data-start="548" data-end="551" />
<h2 data-start="553" data-end="566">この記事で学べること</h2>
<p data-start="568" data-end="654">・セッションとは何か<br data-start="578" data-end="581" />・なぜセッションが必要なのか<br data-start="595" data-end="598" />・session_start の役割<br data-start="616" data-end="619" />・セッションへの保存・取得方法<br data-start="634" data-end="637" />・ログイン処理につながる考え方</p>
<hr data-start="656" data-end="659" />
<h2 data-start="661" data-end="673">セッションとは何か</h2>
<p data-start="675" data-end="717">セッションとは、<br data-start="683" data-end="686" /><strong data-start="686" data-end="713">ユーザーごとにサーバー側で情報を保存する仕組み</strong> です。</p>
<p data-start="719" data-end="762">Webの通信（HTTP）は、<br data-start="733" data-end="736" />本来 <strong data-start="739" data-end="750">状態を持たない</strong> という特徴があります。</p>
<p data-start="764" data-end="768">つまり、</p>
<p data-start="770" data-end="799">・ページを移動すると<br data-start="780" data-end="783" />・前の情報は基本的に失われる</p>
<p data-start="801" data-end="810">という仕組みです。</p>
<p data-start="812" data-end="833">この弱点を補うのが、<br data-start="822" data-end="825" />セッションです。</p>
<hr data-start="835" data-end="838" />
<h2 data-start="840" data-end="856">クッキーとセッションの違い</h2>
<p data-start="858" data-end="879">混同しやすいので、<br data-start="867" data-end="870" />ここで整理します。</p>
<p data-start="881" data-end="931">・クッキー<br data-start="886" data-end="889" />　→ ブラウザ（ユーザー側）に保存<br data-start="906" data-end="909" />・セッション<br data-start="915" data-end="918" />　→ サーバー側に保存</p>
<p data-start="933" data-end="940">セッションは、</p>
<p data-start="942" data-end="967">・内容が外から見えない<br data-start="953" data-end="956" />・改ざんされにくい</p>
<p data-start="969" data-end="998">という点で、<br data-start="975" data-end="978" /><strong data-start="978" data-end="997">重要な情報の管理に向いています</strong>。</p>
<hr data-start="1000" data-end="1003" />
<h2 data-start="1005" data-end="1022">セッションは何に使われるのか</h2>
<p data-start="1024" data-end="1034">代表的な利用例です。</p>
<p data-start="1036" data-end="1089">・ログイン状態の管理<br data-start="1046" data-end="1049" />・ユーザーIDの保持<br data-start="1059" data-end="1062" />・一時的なメッセージ表示<br data-start="1074" data-end="1077" />・フォームの確認画面</p>
<p data-start="1091" data-end="1123">Webサービスでは、<br data-start="1101" data-end="1104" /><strong data-start="1104" data-end="1119">ほぼ必ず使われる仕組み</strong> です。</p>
<hr data-start="1125" data-end="1128" />
<h2 data-start="1130" data-end="1146">セッションを使うための準備</h2>
<p data-start="1148" data-end="1186">PHPでセッションを使うには、<br data-start="1163" data-end="1166" /><strong data-start="1166" data-end="1179">必ず最初に行う処理</strong> があります。</p>
<p data-start="1188" data-end="1218">それが、<br data-start="1192" data-end="1195" /><strong data-start="1195" data-end="1214">session_start()</strong> です。</p>
<hr data-start="1220" data-end="1223" />
<h2 data-start="1225" data-end="1238">セッションを開始する</h2>
<h3 data-start="1240" data-end="1260">サンプルコード①：セッション開始</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();
</code></pre>
</div>
<hr data-start="1297" data-end="1300" />
<h3 data-start="1302" data-end="1310">ポイント</h3>
<p data-start="1312" data-end="1381">・この1行でセッションが使えるようになる<br data-start="1332" data-end="1335" />・$_SESSION という配列が利用可能になる<br data-start="1359" data-end="1362" />・必ず <strong data-start="1366" data-end="1375">出力より前</strong> に書く</p>
<hr data-start="1383" data-end="1386" />
<h2 data-start="1388" data-end="1403">セッションに値を保存する</h2>
<p data-start="1405" data-end="1427">セッションは、<br data-start="1412" data-end="1415" />連想配列として扱います。</p>
<h3 data-start="1429" data-end="1450">サンプルコード②：セッションに保存</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'username'</span>] = <span class="hljs-string">'太郎'</span>;
</code></pre>
</div>
<p data-start="1518" data-end="1522">これで、</p>
<p data-start="1524" data-end="1546">・キー：username<br data-start="1536" data-end="1539" />・値：太郎</p>
<p data-start="1548" data-end="1567">が、<br data-start="1550" data-end="1553" />ユーザーごとに保存されます。</p>
<hr data-start="1569" data-end="1572" />
<h2 data-start="1574" data-end="1590">セッションから値を取り出す</h2>
<p data-start="1592" data-end="1616">保存した値は、<br data-start="1599" data-end="1602" />別のページでも取り出せます。</p>
<h3 data-start="1618" data-end="1639">サンプルコード③：セッションの取得</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-keyword">echo</span> <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'username'</span>];
</code></pre>
</div>
<p data-start="1705" data-end="1742">ページを移動しても、<br data-start="1715" data-end="1718" />同じユーザーであれば<br data-start="1728" data-end="1731" />この値は保持されます。</p>
<hr data-start="1744" data-end="1747" />
<h2 data-start="1749" data-end="1766">ログイン状態を管理する考え方</h2>
<p data-start="1768" data-end="1790">ログイン処理では、<br data-start="1777" data-end="1780" />次のように考えます。</p>
<p data-start="1792" data-end="1843">・ログイン成功時<br data-start="1800" data-end="1803" />　→ セッションに情報を保存<br data-start="1817" data-end="1820" />・ログアウト時<br data-start="1827" data-end="1830" />　→ セッションを削除</p>
<p data-start="1845" data-end="1876">この仕組みだけで、<br data-start="1854" data-end="1857" /><strong data-start="1857" data-end="1870">ログイン状態を管理</strong> できます。</p>
<hr data-start="1878" data-end="1881" />
<h2 data-start="1883" data-end="1895">ログイン成功時の例</h2>
<h3 data-start="1897" data-end="1917">サンプルコード④：ログイン成功時</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'is_login'</span>] = <span class="hljs-literal">true</span>;
<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'user_id'</span>] = <span class="hljs-number">1</span>;
</code></pre>
</div>
<p data-start="2011" data-end="2015">これで、</p>
<p data-start="2017" data-end="2044">・ログインしているか<br data-start="2027" data-end="2030" />・誰がログインしているか</p>
<p data-start="2046" data-end="2070">を、<br data-start="2048" data-end="2051" />セッションで判断できるようになります。</p>
<hr data-start="2072" data-end="2075" />
<h2 data-start="2077" data-end="2091">ログイン状態を判定する</h2>
<h3 data-start="2093" data-end="2114">サンプルコード⑤：ログインチェック</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-keyword">if</span> (!<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'is_login'</span>])) {
  <span class="hljs-keyword">echo</span> <span class="hljs-string">'ログイン中です'</span>;
} <span class="hljs-keyword">else</span> {
  <span class="hljs-keyword">echo</span> <span class="hljs-string">'ログインしてください'</span>;
}
</code></pre>
</div>
<p data-start="2239" data-end="2273">この判定は、<br data-start="2245" data-end="2248" /><strong data-start="2248" data-end="2266">ログインが必要なページすべて</strong> に書きます。</p>
<hr data-start="2275" data-end="2278" />
<h2 data-start="2280" data-end="2293">ログアウト処理の基本</h2>
<p data-start="2295" data-end="2319">ログアウト時には、<br data-start="2304" data-end="2307" />セッションを破棄します。</p>
<h3 data-start="2321" data-end="2339">サンプルコード⑥：ログアウト</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-variable">$_SESSION</span> = [];
<span class="hljs-title function_ invoke__">session_destroy</span>();
</code></pre>
</div>
<p data-start="2412" data-end="2448">これで、<br data-start="2416" data-end="2419" />セッションに保存されていた情報は<br data-start="2435" data-end="2438" />すべて削除されます。</p>
<hr data-start="2450" data-end="2453" />
<h2 data-start="2455" data-end="2470">セッション使用時の注意点</h2>
<p data-start="2472" data-end="2488">セッションを使う際の注意点です。</p>
<p data-start="2490" data-end="2539">・session_start を忘れない<br data-start="2510" data-end="2513" />・出力前に呼び出す<br data-start="2522" data-end="2525" />・重要情報を入れすぎない</p>
<p data-start="2541" data-end="2587">特に、<br data-start="2544" data-end="2547" /><strong data-start="2547" data-end="2570">session_start の書き忘れ</strong> は<br data-start="2572" data-end="2575" />非常によくあるミスです。</p>
<hr data-start="2589" data-end="2592" />
<h2 data-start="2594" data-end="2610">セッションとCSRFの関係</h2>
<p data-start="2612" data-end="2649">前回学んだ<br data-start="2617" data-end="2620" />CSRFトークンも、<br data-start="2630" data-end="2633" />セッションに保存されていました。</p>
<p data-start="2651" data-end="2655">これは、</p>
<p data-start="2657" data-end="2684">・ユーザーごとに<br data-start="2665" data-end="2668" />・安全に<br data-start="2672" data-end="2675" />・値を保持する</p>
<p data-start="2686" data-end="2710">という、<br data-start="2690" data-end="2693" />セッションの特性を活かした例です。</p>
<hr data-start="2712" data-end="2715" />
<h2 data-start="2717" data-end="2730">初心者がよくやるミス</h2>
<p data-start="2732" data-end="2745">セッションで多いミスです。</p>
<p data-start="2747" data-end="2808">・session_start を書き忘れる<br data-start="2768" data-end="2771" />・セッションが消える理由が分からない<br data-start="2789" data-end="2792" />・ログイン判定を書いていない</p>
<p data-start="2810" data-end="2841">「セッションはページをまたぐ」<br data-start="2825" data-end="2828" />という点を意識しましょう。</p>
<hr data-start="2843" data-end="2846" />
<h2 data-start="2848" data-end="2854">まとめ</h2>
<p data-start="2856" data-end="2880">この記事では、<br data-start="2863" data-end="2866" />PHPのセッションについて、</p>
<p data-start="2882" data-end="2919">・セッションの役割<br data-start="2891" data-end="2894" />・保存と取得の方法<br data-start="2903" data-end="2906" />・ログイン管理の考え方</p>
<p data-start="2921" data-end="2928">を学びました。</p>
<p data-start="2930" data-end="2981">セッションが理解できると、<br data-start="2943" data-end="2946" />Webアプリケーションは<br data-start="2958" data-end="2961" />一気に <strong data-start="2965" data-end="2974">実用的な形</strong> になります。</p>
<hr data-start="2983" data-end="2986" />
<h2 data-start="2988" data-end="2999">次に読むべき記事</h2>
<p data-start="3001" data-end="3037">▶ 次の記事<br data-start="3007" data-end="3010" /><a href="https://seek-rise.com/web-development/php-basic/post-446/">6-13 PHPでログイン処理の基本を作ってみよう</a></p>
<p data-start="3039" data-end="3068">▶ 関連記事<br data-start="3045" data-end="3048" /><a href="https://seek-rise.com/web-development/php-basic/post-441/">6-11 CSRFとは？仕組みと対策</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-443/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">443</post-id>	</item>
		<item>
		<title>6-11 CSRFとは？仕組みと対策</title>
		<link>https://seek-rise.com/web-development/php-basic/post-441/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-441/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 14:19:24 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[CSRF]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=441</guid>

					<description><![CDATA[前の記事では、XSS（クロスサイトスクリプティング） という「表示時の危険性」について学びました。 今回扱う CSRF は、それとは別の方向から攻撃が行われます。 CSRFは、ユーザーが意図していない操作を、正規ユーザー [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="236" data-end="295">前の記事では、<br data-start="243" data-end="246" /><strong data-start="246" data-end="269">XSS（クロスサイトスクリプティング）</strong> という<br data-start="273" data-end="276" />「表示時の危険性」について学びました。</p>
<p data-start="297" data-end="335">今回扱う <strong data-start="302" data-end="310">CSRF</strong> は、<br data-start="313" data-end="316" />それとは別の方向から攻撃が行われます。</p>
<p data-start="337" data-end="395">CSRFは、<br data-start="343" data-end="346" /><strong data-start="346" data-end="391">ユーザーが意図していない操作を、<br data-start="364" data-end="367" />正規ユーザーとして実行させられてしまう脆弱性</strong> です。</p>
<p data-start="397" data-end="435">フォーム処理を行うPHPでは、<br data-start="412" data-end="415" /><strong data-start="415" data-end="428">CSRF対策は必須</strong> になります。</p>
<p data-start="437" data-end="501">この記事では、<br data-start="444" data-end="447" /><strong data-start="447" data-end="484">CSRFとは何か、なぜ危険なのか、<br data-start="466" data-end="469" />PHPでの基本的な対策方法</strong> を<br data-start="486" data-end="489" />コード付きで解説します。</p>
<hr data-start="503" data-end="506" />
<h2 data-start="508" data-end="521">この記事で学べること</h2>
<p data-start="523" data-end="594">・CSRFとは何か<br data-start="532" data-end="535" />・CSRF攻撃の仕組み<br data-start="546" data-end="549" />・なぜCSRFが危険なのか<br data-start="562" data-end="565" />・PHPでの基本的なCSRF対策<br data-start="581" data-end="584" />・XSSとの違い</p>
<hr data-start="596" data-end="599" />
<h2 data-start="601" data-end="612">CSRFとは何か</h2>
<p data-start="614" data-end="699">CSRF（Cross Site Request Forgery）とは、<br data-start="649" data-end="652" /><strong data-start="652" data-end="695">ログイン中のユーザーの権限を悪用し、<br data-start="672" data-end="675" />意図しないリクエストを送信させる攻撃</strong> です。</p>
<p data-start="701" data-end="754">攻撃者自身がログインするわけではなく、<br data-start="720" data-end="723" /><strong data-start="723" data-end="741">被害者がログインしている状態</strong> を利用する点が特徴です。</p>
<hr data-start="756" data-end="759" />
<h2 data-start="761" data-end="777">CSRF攻撃の典型的な流れ</h2>
<p data-start="779" data-end="802">CSRFは、<br data-start="785" data-end="788" />次のような流れで行われます。</p>
<ol data-start="804" data-end="918">
<li data-start="804" data-end="826">
<p data-start="807" data-end="826">ユーザーがWebサービスにログイン</p>
</li>
<li data-start="827" data-end="850">
<p data-start="830" data-end="850">ログイン状態のまま、別のサイトを閲覧</p>
</li>
<li data-start="851" data-end="877">
<p data-start="854" data-end="877">そのサイトから勝手にリクエストが送信される</p>
</li>
<li data-start="878" data-end="901">
<p data-start="881" data-end="901">サーバーは正規ユーザーの操作だと判断</p>
</li>
<li data-start="902" data-end="918">
<p data-start="905" data-end="918">処理が実行されてしまう</p>
</li>
</ol>
<p data-start="920" data-end="969">ユーザーは、<br data-start="926" data-end="929" /><strong data-start="929" data-end="956">自分が操作したつもりがなくても処理が実行される</strong><br data-start="956" data-end="959" />という点が問題です。</p>
<hr data-start="971" data-end="974" />
<h2 data-start="976" data-end="991">CSRFで何が起こるのか</h2>
<p data-start="993" data-end="1021">CSRFが成立すると、<br data-start="1004" data-end="1007" />次のような被害が起こります。</p>
<p data-start="1023" data-end="1065">・パスワード変更<br data-start="1031" data-end="1034" />・メールアドレス変更<br data-start="1044" data-end="1047" />・投稿や削除処理<br data-start="1055" data-end="1058" />・退会処理</p>
<p data-start="1067" data-end="1105">どれも<br data-start="1070" data-end="1073" /><strong data-start="1073" data-end="1093">本人の意思とは無関係に実行される</strong><br data-start="1093" data-end="1096" />可能性があります。</p>
<hr data-start="1107" data-end="1110" />
<h2 data-start="1112" data-end="1127">なぜCSRFが起きるのか</h2>
<p data-start="1129" data-end="1139">原因はシンプルです。</p>
<p data-start="1141" data-end="1176"><strong data-start="1141" data-end="1176">「そのリクエストが、本当に本人の操作かどうかを確認していない」</strong></p>
<p data-start="1178" data-end="1185">サーバー側が、</p>
<p data-start="1187" data-end="1222">・ログインしている<br data-start="1196" data-end="1199" />という理由だけで<br data-start="1207" data-end="1210" />・正当な操作だと判断</p>
<p data-start="1224" data-end="1237">してしまうことが問題です。</p>
<hr data-start="1239" data-end="1242" />
<h2 data-start="1244" data-end="1258">XSSとCSRFの違い</h2>
<p data-start="1260" data-end="1274">ここで整理しておきましょう。</p>
<p data-start="1276" data-end="1301">・XSS<br data-start="1280" data-end="1283" />　→ スクリプトを実行させる攻撃</p>
<p data-start="1303" data-end="1329">・CSRF<br data-start="1308" data-end="1311" />　→ リクエストを実行させる攻撃</p>
<p data-start="1331" data-end="1363">どちらも危険ですが、<br data-start="1341" data-end="1344" /><strong data-start="1344" data-end="1362">攻撃の方法と対策が異なります</strong>。</p>
<hr data-start="1365" data-end="1368" />
<h2 data-start="1370" data-end="1389">CSRF対策の基本は「トークン」</h2>
<p data-start="1391" data-end="1426">CSRF対策の基本は、<br data-start="1402" data-end="1405" /><strong data-start="1405" data-end="1417">CSRFトークン</strong> を使う方法です。</p>
<p data-start="1428" data-end="1435">トークンとは、</p>
<p data-start="1437" data-end="1475">・推測できない文字列<br data-start="1447" data-end="1450" />・フォームごとに発行<br data-start="1460" data-end="1463" />・送信時に一緒に送る</p>
<p data-start="1477" data-end="1486">という仕組みです。</p>
<hr data-start="1488" data-end="1491" />
<h2 data-start="1493" data-end="1513">PHPでCSRFトークンを生成する</h2>
<p data-start="1515" data-end="1546">まずは、<br data-start="1519" data-end="1522" />トークンを生成して<br data-start="1531" data-end="1534" />セッションに保存します。</p>
<h3 data-start="1548" data-end="1567">サンプルコード①：トークン生成</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-keyword">if</span> (<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'csrf_token'</span>])) {
  <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'csrf_token'</span>] = <span class="hljs-title function_ invoke__">bin2hex</span>(<span class="hljs-title function_ invoke__">random_bytes</span>(<span class="hljs-number">32</span>));
}
</code></pre>
</div>
<hr data-start="1700" data-end="1703" />
<h3 data-start="1705" data-end="1717">コードの読み解き</h3>
<p data-start="1719" data-end="1800">・session_start<br data-start="1733" data-end="1736" />　→ セッションを開始<br data-start="1747" data-end="1750" />・random_bytes<br data-start="1763" data-end="1766" />　→ 安全なランダム文字列生成<br data-start="1781" data-end="1784" />・$_SESSION に保存</p>
<p data-start="1802" data-end="1830">トークンは、<br data-start="1808" data-end="1811" /><strong data-start="1811" data-end="1824">ユーザーごとに保持</strong> されます。</p>
<hr data-start="1832" data-end="1835" />
<h2 data-start="1837" data-end="1854">フォームにトークンを埋め込む</h2>
<p data-start="1856" data-end="1877">次に、<br data-start="1859" data-end="1862" />フォームにトークンを含めます。</p>
<h3 data-start="1879" data-end="1897">サンプルコード②：フォーム側</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span></span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"result.php"</span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">input</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"hidden"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"csrf_token"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"&lt;?php echo $_SESSION['csrf_token']; ?&gt;"</span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span>&gt;送信<span class="hljs-tag">&lt;/<span class="hljs-name">button</span></span>&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span></span>&gt;
</code></pre>
</div>
<hr data-start="2086" data-end="2089" />
<h3 data-start="2091" data-end="2099">ポイント</h3>
<p data-start="2101" data-end="2153">・hidden フィールドで送信<br data-start="2117" data-end="2120" />・ユーザーには見えない<br data-start="2131" data-end="2134" />・正規フォームからしか送信できない</p>
<hr data-start="2155" data-end="2158" />
<h2 data-start="2160" data-end="2176">送信時にトークンを検証する</h2>
<p data-start="2178" data-end="2205">フォーム送信後、<br data-start="2186" data-end="2189" />PHP側でトークンを確認します。</p>
<h3 data-start="2207" data-end="2226">サンプルコード③：トークン検証</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-title function_ invoke__">session_start</span>();

<span class="hljs-keyword">if</span> (
  <span class="hljs-keyword">empty</span>(<span class="hljs-variable">$_POST</span>[<span class="hljs-string">'csrf_token'</span>]) ||
  <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'csrf_token'</span>] !== <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'csrf_token'</span>]
) {
  <span class="hljs-keyword">echo</span> <span class="hljs-string">'不正なリクエストです'</span>;
  <span class="hljs-keyword">exit</span>;
}

<span class="hljs-keyword">echo</span> <span class="hljs-string">'正規のリクエストです'</span>;
</code></pre>
</div>
<hr data-start="2408" data-end="2411" />
<h3 data-start="2413" data-end="2425">コードの読み解き</h3>
<p data-start="2427" data-end="2457">・トークンが存在するか<br data-start="2438" data-end="2441" />・セッションの値と一致するか</p>
<p data-start="2459" data-end="2489">どちらかでも失敗した場合、<br data-start="2472" data-end="2475" /><strong data-start="2475" data-end="2484">処理を中断</strong> します。</p>
<hr data-start="2491" data-end="2494" />
<h2 data-start="2496" data-end="2511">CSRF対策が必要な処理</h2>
<p data-start="2513" data-end="2541">特にCSRF対策が必要なのは、<br data-start="2528" data-end="2531" />次のような処理です。</p>
<p data-start="2543" data-end="2568">・登録<br data-start="2546" data-end="2549" />・更新<br data-start="2552" data-end="2555" />・削除<br data-start="2558" data-end="2561" />・設定変更</p>
<p data-start="2570" data-end="2602">逆に、<br data-start="2573" data-end="2576" />表示のみの処理では<br data-start="2585" data-end="2588" />必須ではない場合もあります。</p>
<hr data-start="2604" data-end="2607" />
<h2 data-start="2609" data-end="2622">初心者がよくやるミス</h2>
<p data-start="2624" data-end="2638">CSRF対策で多いミスです。</p>
<p data-start="2640" data-end="2690">・ログインしているから安全だと思う<br data-start="2657" data-end="2660" />・トークンを検証していない<br data-start="2673" data-end="2676" />・GETで更新処理を行う</p>
<p data-start="2692" data-end="2724"><strong data-start="2692" data-end="2710">更新系処理＝CSRF対策必須</strong><br data-start="2710" data-end="2713" />と覚えておきましょう。</p>
<hr data-start="2726" data-end="2729" />
<h2 data-start="2731" data-end="2756">フレームワークがCSRF対策を自動化する理由</h2>
<p data-start="2758" data-end="2794">Laravelなどのフレームワークが<br data-start="2776" data-end="2779" />CSRF対策を自動で行うのは、</p>
<p data-start="2796" data-end="2820">・実装ミスが起きやすい<br data-start="2807" data-end="2810" />・忘れると致命的</p>
<p data-start="2822" data-end="2828">だからです。</p>
<p data-start="2830" data-end="2877">基礎を理解しておくことで、<br data-start="2843" data-end="2846" />フレームワークの仕組みも<br data-start="2858" data-end="2861" />正しく理解できるようになります。</p>
<hr data-start="2879" data-end="2882" />
<h2 data-start="2884" data-end="2890">まとめ</h2>
<p data-start="2892" data-end="2898">CSRFは、</p>
<p data-start="2900" data-end="2937">・ログイン中のユーザーを利用した<br data-start="2916" data-end="2919" />・意図しない操作を実行させる攻撃</p>
<p data-start="2939" data-end="2942">です。</p>
<p data-start="2944" data-end="2951">対策の基本は、</p>
<p data-start="2953" data-end="2992">・CSRFトークンを発行<br data-start="2965" data-end="2968" />・フォームに埋め込む<br data-start="2978" data-end="2981" />・送信時に検証する</p>
<p data-start="2994" data-end="3006">この流れを守ることです。</p>
<p data-start="3008" data-end="3054">ここまで理解できれば、<br data-start="3019" data-end="3022" />フォーム処理に必要な<br data-start="3032" data-end="3035" /><strong data-start="3035" data-end="3050">セキュリティ基礎は完成</strong> です。</p>
<hr data-start="3056" data-end="3059" />
<h2 data-start="3061" data-end="3072">次に読むべき記事</h2>
<p data-start="3074" data-end="3110">▶ 次の記事<br data-start="3080" data-end="3083" /><a href="https://seek-rise.com/web-development/php-basic/post-443/">6-12 PHPでセッションを使って状態を管理する</a></p>
<p data-start="3112" data-end="3141">▶ 関連記事<br data-start="3118" data-end="3121" /><a href="https://seek-rise.com/web-development/php-basic/post-438/">6-10 XSSとは？なぜ危険なのか</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-441/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">441</post-id>	</item>
		<item>
		<title>6-10 XSSとは？なぜ危険なのか</title>
		<link>https://seek-rise.com/web-development/php-basic/post-438/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-438/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 14:15:11 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=438</guid>

					<description><![CDATA[前の記事では、PHPで バリデーション（入力チェック） を行い、「正しいデータだけを処理する」方法を学びました。 しかし、バリデーションだけではセキュリティは十分ではありません。 入力されたデータは、「正しい内容」であっ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="238" data-end="304">前の記事では、<br data-start="245" data-end="248" />PHPで <strong data-start="253" data-end="272">バリデーション（入力チェック）</strong> を行い、<br data-start="277" data-end="280" />「正しいデータだけを処理する」方法を学びました。</p>
<p data-start="306" data-end="348">しかし、<br data-start="310" data-end="313" />バリデーションだけでは<br data-start="324" data-end="327" /><strong data-start="327" data-end="347">セキュリティは十分ではありません</strong>。</p>
<p data-start="350" data-end="396">入力されたデータは、<br data-start="360" data-end="363" />「正しい内容」であっても<br data-start="375" data-end="378" /><strong data-start="378" data-end="390">安全とは限らない</strong> からです。</p>
<p data-start="398" data-end="439">その代表的な脆弱性が、<br data-start="409" data-end="412" /><strong data-start="412" data-end="435">XSS（クロスサイトスクリプティング）</strong> です。</p>
<p data-start="441" data-end="504">この記事では、<br data-start="448" data-end="451" /><strong data-start="451" data-end="487">XSSとは何か、なぜ危険なのか、<br data-start="469" data-end="472" />PHPでの基本的な対策方法</strong> を<br data-start="489" data-end="492" />コード付きで解説します。</p>
<hr data-start="506" data-end="509" />
<h2 data-start="511" data-end="524">この記事で学べること</h2>
<p data-start="526" data-end="597">・XSSとは何か<br data-start="534" data-end="537" />・XSSが起きる仕組み<br data-start="548" data-end="551" />・XSSで何が起こるのか<br data-start="563" data-end="566" />・PHPでの基本的な対策方法<br data-start="580" data-end="583" />・バリデーションとの違い</p>
<hr data-start="599" data-end="602" />
<h2 data-start="604" data-end="614">XSSとは何か</h2>
<p data-start="616" data-end="694">XSS（Cross Site Scripting）とは、<br data-start="644" data-end="647" /><strong data-start="647" data-end="690">ユーザーが入力した内容が、<br data-start="662" data-end="665" />意図せずスクリプトとして実行されてしまう脆弱性</strong> です。</p>
<p data-start="696" data-end="715">本来はただの文字として扱うべき内容が、</p>
<p data-start="717" data-end="753">・HTMLとして解釈され<br data-start="729" data-end="732" />・JavaScriptとして実行される</p>
<p data-start="755" data-end="775">ことで、<br data-start="759" data-end="762" />深刻な被害につながります。</p>
<hr data-start="777" data-end="780" />
<h2 data-start="782" data-end="797">XSSが起きる典型的な例</h2>
<p data-start="799" data-end="828">まずは、<br data-start="803" data-end="806" /><strong data-start="806" data-end="818">問題のあるコード</strong> を見てみましょう。</p>
<h3 data-start="830" data-end="850">サンプルコード①：危険な表示方法</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$message</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'message'</span>] ?? <span class="hljs-string">''</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-variable">$message</span>;
</code></pre>
</div>
<p data-start="921" data-end="929">このコードでは、</p>
<p data-start="931" data-end="958">・ユーザー入力を<br data-start="939" data-end="942" />・そのまま<br data-start="947" data-end="950" />・画面に表示</p>
<p data-start="960" data-end="966">しています。</p>
<hr data-start="968" data-end="971" />
<h2 data-start="973" data-end="988">悪意ある入力がされた場合</h2>
<p data-start="990" data-end="1020">もし、<br data-start="993" data-end="996" />次のような内容が入力されたらどうなるでしょうか。</p>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-text">&lt;script&gt;alert('XSS')&lt;/script&gt;
</code></pre>
</div>
<p data-start="1065" data-end="1085">この文字列が<br data-start="1071" data-end="1074" />そのまま表示されると、</p>
<p data-start="1087" data-end="1117">・scriptタグが実行され<br data-start="1101" data-end="1104" />・アラートが表示される</p>
<p data-start="1119" data-end="1130">という状態になります。</p>
<p data-start="1132" data-end="1147">これが <strong data-start="1136" data-end="1143">XSS</strong> です。</p>
<hr data-start="1149" data-end="1152" />
<h2 data-start="1154" data-end="1168">XSSで何が起こるのか</h2>
<p data-start="1170" data-end="1197">XSSが成立すると、<br data-start="1180" data-end="1183" />次のような被害が起こります。</p>
<p data-start="1199" data-end="1258">・偽の画面を表示される<br data-start="1210" data-end="1213" />・入力内容を盗まれる<br data-start="1223" data-end="1226" />・Cookieを不正に取得される<br data-start="1242" data-end="1245" />・なりすましが行われる</p>
<p data-start="1260" data-end="1300">ユーザーに直接被害が及ぶため、<br data-start="1275" data-end="1278" /><strong data-start="1278" data-end="1291">非常に危険な脆弱性</strong> とされています。</p>
<hr data-start="1302" data-end="1305" />
<h2 data-start="1307" data-end="1321">なぜXSSが起きるのか</h2>
<p data-start="1323" data-end="1336">原因は非常にシンプルです。</p>
<p data-start="1338" data-end="1366"><strong data-start="1338" data-end="1366">「ユーザー入力を信用して、そのまま出力している」</strong></p>
<p data-start="1368" data-end="1400">PHPは、<br data-start="1373" data-end="1376" />表示の安全性を<br data-start="1383" data-end="1386" />自動では保証してくれません。</p>
<hr data-start="1402" data-end="1405" />
<h2 data-start="1407" data-end="1426">XSS対策の基本は「エスケープ」</h2>
<p data-start="1428" data-end="1461">XSSを防ぐための基本対策は、<br data-start="1443" data-end="1446" /><strong data-start="1446" data-end="1457">エスケープ処理</strong> です。</p>
<p data-start="1463" data-end="1471">エスケープとは、</p>
<p data-start="1473" data-end="1505">・HTMLとして意味を持つ文字を<br data-start="1489" data-end="1492" />・ただの文字として扱う</p>
<p data-start="1507" data-end="1519">ように変換することです。</p>
<hr data-start="1521" data-end="1524" />
<h2 data-start="1526" data-end="1543">PHPでの基本的なXSS対策</h2>
<p data-start="1545" data-end="1568">PHPでは、<br data-start="1551" data-end="1554" />次の関数を使うのが基本です。</p>
<p data-start="1570" data-end="1587">・htmlspecialchars</p>
<hr data-start="1589" data-end="1592" />
<h3 data-start="1594" data-end="1614">サンプルコード②：安全な表示方法</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$message</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'message'</span>] ?? <span class="hljs-string">''</span>;
<span class="hljs-variable">$safeMessage</span> = <span class="hljs-title function_ invoke__">htmlspecialchars</span>(<span class="hljs-variable">$message</span>, ENT_QUOTES, <span class="hljs-string">'UTF-8'</span>);

<span class="hljs-keyword">echo</span> <span class="hljs-variable">$safeMessage</span>;
</code></pre>
</div>
<hr data-start="1754" data-end="1757" />
<h3 data-start="1759" data-end="1771">コードの読み解き</h3>
<p data-start="1773" data-end="1873">・htmlspecialchars<br data-start="1790" data-end="1793" />　→ 特殊文字をHTMLエンティティに変換<br data-start="1814" data-end="1817" />・ENT_QUOTES<br data-start="1828" data-end="1831" />　→ シングル・ダブルクォートも変換<br data-start="1849" data-end="1852" />・UTF-8<br data-start="1858" data-end="1861" />　→ 文字コード指定</p>
<p data-start="1875" data-end="1881">これにより、</p>
<p data-start="1883" data-end="1908">・<code data-start="1884" data-end="1887">&lt;</code> や <code data-start="1890" data-end="1893">&gt;</code><br data-start="1893" data-end="1896" />・<code data-start="1897" data-end="1900">"</code> や <code data-start="1903" data-end="1906">'</code></p>
<p data-start="1910" data-end="1935">が、<br data-start="1912" data-end="1915" /><strong data-start="1915" data-end="1929">ただの文字として表示</strong> されます。</p>
<hr data-start="1937" data-end="1940" />
<h2 data-start="1942" data-end="1961">バリデーションとXSS対策の違い</h2>
<p data-start="1963" data-end="1974">ここは非常に重要です。</p>
<p data-start="1976" data-end="2002">・バリデーション<br data-start="1984" data-end="1987" />　→ 入力が正しいかを確認</p>
<p data-start="2004" data-end="2028">・XSS対策<br data-start="2010" data-end="2013" />　→ 表示して安全かを確認</p>
<p data-start="2030" data-end="2063">バリデーションをしていても、<br data-start="2044" data-end="2047" /><strong data-start="2047" data-end="2059">XSS対策は必須</strong> です。</p>
<hr data-start="2065" data-end="2068" />
<h2 data-start="2070" data-end="2087">エスケープは「出力時」に行う</h2>
<p data-start="2089" data-end="2102">XSS対策の基本原則です。</p>
<p data-start="2104" data-end="2124"><strong data-start="2104" data-end="2124">エスケープは、表示する直前に行う</strong></p>
<p data-start="2126" data-end="2130">理由は、</p>
<p data-start="2132" data-end="2162">・保存形式を壊さない<br data-start="2142" data-end="2145" />・用途に応じて出力方法が変わる</p>
<p data-start="2164" data-end="2169">ためです。</p>
<p data-start="2171" data-end="2209">入力時ではなく、<br data-start="2179" data-end="2182" /><strong data-start="2182" data-end="2197">出力時に必ずエスケープ</strong><br data-start="2197" data-end="2200" />と覚えてください。</p>
<hr data-start="2211" data-end="2214" />
<h2 data-start="2216" data-end="2229">初心者がよくやるミス</h2>
<p data-start="2231" data-end="2244">XSS対策で多いミスです。</p>
<p data-start="2246" data-end="2291">・バリデーションだけで安心する<br data-start="2261" data-end="2264" />・一部の表示だけ対策する<br data-start="2276" data-end="2279" />・エスケープを忘れる</p>
<p data-start="2293" data-end="2323">「ユーザー入力を表示する」<br data-start="2306" data-end="2309" />＝<br data-start="2310" data-end="2313" />「XSS対策が必要」</p>
<p data-start="2325" data-end="2337">この意識を持ちましょう。</p>
<hr data-start="2339" data-end="2342" />
<h2 data-start="2344" data-end="2354">実務での考え方</h2>
<p data-start="2356" data-end="2361">実務では、</p>
<p data-start="2363" data-end="2404">・XSSが起きないようにする<br data-start="2377" data-end="2380" />ではなく<br data-start="2384" data-end="2387" />・XSSが起きる前提で対策する</p>
<p data-start="2406" data-end="2418">という考え方が基本です。</p>
<hr data-start="2420" data-end="2423" />
<h2 data-start="2425" data-end="2431">まとめ</h2>
<p data-start="2433" data-end="2438">XSSは、</p>
<p data-start="2440" data-end="2476">・ユーザー入力を<br data-start="2448" data-end="2451" />・そのまま表示することで<br data-start="2463" data-end="2466" />・発生する脆弱性</p>
<p data-start="2478" data-end="2481">です。</p>
<p data-start="2483" data-end="2490">対策の基本は、</p>
<p data-start="2492" data-end="2528">・出力時にエスケープ<br data-start="2502" data-end="2505" />・htmlspecialchars を使う</p>
<p data-start="2530" data-end="2537">この2点です。</p>
<p data-start="2539" data-end="2589">ここまで理解できれば、<br data-start="2550" data-end="2553" />フォーム処理の安全性は<br data-start="2564" data-end="2567" /><strong data-start="2567" data-end="2579">一段階上のレベル</strong> に到達しています。</p>
<hr data-start="2591" data-end="2594" />
<h2 data-start="2596" data-end="2607">次に読むべき記事</h2>
<p data-start="2609" data-end="2638">▶ 次の記事<br data-start="2615" data-end="2618" /><a href="https://seek-rise.com/web-development/php-basic/post-441/">6-11 CSRFとは？仕組みと対策</a></p>
<p data-start="2640" data-end="2670">▶ 関連記事<br data-start="2646" data-end="2649" /><a href="https://seek-rise.com/web-development/php-basic/post-434/">6-9 PHPのバリデーションとは何か</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-438/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">438</post-id>	</item>
		<item>
		<title>6-9 PHPのバリデーションとは何か</title>
		<link>https://seek-rise.com/web-development/php-basic/post-434/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-434/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 13:59:44 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[PHPバリデーション]]></category>
		<category><![CDATA[入力チェック]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=434</guid>

					<description><![CDATA[前の記事では、HTMLフォームから送信されたデータをPHPで 受け取って表示する ところまで進みました。 しかし、「受け取れる」だけではWebアプリケーションとしては不十分です。 ・未入力のまま送信されていないか・想定外 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="253" data-end="315">前の記事では、<br data-start="260" data-end="263" />HTMLフォームから送信されたデータを<br data-start="282" data-end="285" />PHPで <strong data-start="290" data-end="303">受け取って表示する</strong> ところまで進みました。</p>
<p data-start="317" data-end="359">しかし、<br data-start="321" data-end="324" />「受け取れる」だけでは<br data-start="335" data-end="338" />Webアプリケーションとしては不十分です。</p>
<p data-start="361" data-end="414">・未入力のまま送信されていないか<br data-start="377" data-end="380" />・想定外の値が入っていないか<br data-start="394" data-end="397" />・そのまま処理しても問題ないか</p>
<p data-start="416" data-end="456">これらをチェックする処理が、<br data-start="430" data-end="433" /><strong data-start="433" data-end="452">バリデーション（入力チェック）</strong> です。</p>
<p data-start="458" data-end="517">この記事では、<br data-start="465" data-end="468" />PHPでバリデーションを行うための<br data-start="485" data-end="488" /><strong data-start="488" data-end="500">考え方と最小実装</strong> を<br data-start="502" data-end="505" />コード付きで解説します。</p>
<hr data-start="519" data-end="522" />
<h2 data-start="524" data-end="537">この記事で学べること</h2>
<p data-start="539" data-end="624">・バリデーションとは何か<br data-start="551" data-end="554" />・なぜバリデーションが必要なのか<br data-start="570" data-end="573" />・必須入力チェックの実装方法<br data-start="587" data-end="590" />・エラーメッセージの管理方法<br data-start="604" data-end="607" />・フォーム処理での基本パターン</p>
<hr data-start="626" data-end="629" />
<h2 data-start="631" data-end="645">バリデーションとは何か</h2>
<p data-start="647" data-end="691">バリデーションとは、<br data-start="657" data-end="660" /><strong data-start="660" data-end="687">入力されたデータが正しいかどうかを確認する処理</strong> です。</p>
<p data-start="693" data-end="701">「正しい」とは、</p>
<p data-start="703" data-end="736">・空でない<br data-start="708" data-end="711" />・形式が合っている<br data-start="720" data-end="723" />・想定した範囲内である</p>
<p data-start="738" data-end="759">といった条件を満たしていることを指します。</p>
<hr data-start="761" data-end="764" />
<h2 data-start="766" data-end="784">なぜバリデーションが必要なのか</h2>
<p data-start="786" data-end="817">バリデーションを行わないと、<br data-start="800" data-end="803" />次のような問題が起こります。</p>
<p data-start="819" data-end="868">・未入力データが保存される<br data-start="832" data-end="835" />・処理の途中でエラーが起きる<br data-start="849" data-end="852" />・想定外の値で不具合が起こる</p>
<p data-start="870" data-end="928">また、<br data-start="873" data-end="876" />ユーザーは必ずしも<br data-start="885" data-end="888" /><strong data-start="888" data-end="908">正しく入力してくれるとは限らない</strong><br data-start="908" data-end="911" />という前提で考える必要があります。</p>
<hr data-start="930" data-end="933" />
<h2 data-start="935" data-end="953">バリデーションの基本的な考え方</h2>
<p data-start="955" data-end="992">PHPでのバリデーションは、<br data-start="969" data-end="972" />次の流れで考えると分かりやすくなります。</p>
<ol data-start="994" data-end="1068">
<li data-start="994" data-end="1009">
<p data-start="997" data-end="1009">入力データを受け取る</p>
</li>
<li data-start="1010" data-end="1028">
<p data-start="1013" data-end="1028">条件に合っているか確認する</p>
</li>
<li data-start="1029" data-end="1048">
<p data-start="1032" data-end="1048">問題があればエラーを保存する</p>
</li>
<li data-start="1049" data-end="1068">
<p data-start="1052" data-end="1068">問題がなければ次の処理へ進む</p>
</li>
</ol>
<hr data-start="1070" data-end="1073" />
<h2 data-start="1075" data-end="1089">エラーは配列で管理する</h2>
<p data-start="1091" data-end="1132">バリデーションでは、<br data-start="1101" data-end="1104" /><strong data-start="1104" data-end="1122">エラーメッセージを配列で管理</strong> するのが基本です。</p>
<p data-start="1134" data-end="1138">理由は、</p>
<p data-start="1140" data-end="1187">・複数のエラーを同時に扱える<br data-start="1154" data-end="1157" />・後で表示方法を変えやすい<br data-start="1170" data-end="1173" />・処理の流れが整理される</p>
<p data-start="1189" data-end="1194">からです。</p>
<hr data-start="1196" data-end="1199" />
<h2 data-start="1201" data-end="1215">必須入力チェックの基本</h2>
<p data-start="1217" data-end="1252">まずは、<br data-start="1221" data-end="1224" /><strong data-start="1224" data-end="1242">最も基本的な必須入力チェック</strong> を見てみましょう。</p>
<h3 data-start="1254" data-end="1273">サンプルコード①：必須チェック</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$errors</span> = [];

<span class="hljs-variable">$username</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'username'</span>] ?? <span class="hljs-string">''</span>;

<span class="hljs-keyword">if</span> (<span class="hljs-variable">$username</span> === <span class="hljs-string">''</span>) {
  <span class="hljs-variable">$errors</span>[] = <span class="hljs-string">'名前を入力してください'</span>;
}

<span class="hljs-keyword">if</span> (<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$errors</span>)) {
  <span class="hljs-keyword">echo</span> <span class="hljs-string">'処理を続行します'</span>;
} <span class="hljs-keyword">else</span> {
  <span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$errors</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$error</span>) {
    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$error</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
  }
}
</code></pre>
</div>
<hr data-start="1517" data-end="1520" />
<h3 data-start="1522" data-end="1534">コードの読み解き</h3>
<p data-start="1536" data-end="1633">・$errors<br data-start="1544" data-end="1547" />　→ エラーメッセージを入れる配列<br data-start="1564" data-end="1567" />・$username === &#8221;<br data-start="1584" data-end="1587" />　→ 空文字かどうかをチェック<br data-start="1602" data-end="1605" />・エラーがあれば配列に追加<br data-start="1618" data-end="1621" />・最後にまとめて表示</p>
<p data-start="1635" data-end="1665">この形が、<br data-start="1640" data-end="1643" /><strong data-start="1643" data-end="1661">PHPバリデーションの基本形</strong> です。</p>
<hr data-start="1667" data-end="1670" />
<h2 data-start="1672" data-end="1703">なぜ empty() ではなく === &#8221; を使うのか</h2>
<p data-start="1705" data-end="1720">empty() は便利ですが、</p>
<p data-start="1722" data-end="1733">・0<br data-start="1724" data-end="1727" />・&#8217;0&#8242;</p>
<p data-start="1735" data-end="1748">なども「空」と判定します。</p>
<p data-start="1750" data-end="1804">そのため、<br data-start="1755" data-end="1758" />文字入力の必須チェックでは<br data-start="1771" data-end="1774" /><strong data-start="1774" data-end="1792">空文字かどうかを明示的に確認</strong><br data-start="1792" data-end="1795" />する方が安全です。</p>
<hr data-start="1806" data-end="1809" />
<h2 data-start="1811" data-end="1826">複数項目のバリデーション</h2>
<p data-start="1828" data-end="1854">実際のフォームでは、<br data-start="1838" data-end="1841" />複数の入力項目を扱います。</p>
<h3 data-start="1856" data-end="1877">サンプルコード②：複数項目チェック</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$errors</span> = [];

<span class="hljs-variable">$name</span>  = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'name'</span>]  ?? <span class="hljs-string">''</span>;
<span class="hljs-variable">$email</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'email'</span>] ?? <span class="hljs-string">''</span>;

<span class="hljs-keyword">if</span> (<span class="hljs-variable">$name</span> === <span class="hljs-string">''</span>) {
  <span class="hljs-variable">$errors</span>[] = <span class="hljs-string">'名前を入力してください'</span>;
}

<span class="hljs-keyword">if</span> (<span class="hljs-variable">$email</span> === <span class="hljs-string">''</span>) {
  <span class="hljs-variable">$errors</span>[] = <span class="hljs-string">'メールアドレスを入力してください'</span>;
}

<span class="hljs-keyword">if</span> (<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$errors</span>)) {
  <span class="hljs-keyword">echo</span> <span class="hljs-string">'すべての入力が正しいです'</span>;
} <span class="hljs-keyword">else</span> {
  <span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$errors</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$error</span>) {
    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$error</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
  }
}
</code></pre>
</div>
<hr data-start="2205" data-end="2208" />
<h2 data-start="2210" data-end="2223">文字数チェックの基本</h2>
<p data-start="2225" data-end="2245">次に、<br data-start="2228" data-end="2231" />文字数をチェックする例です。</p>
<h3 data-start="2247" data-end="2267">サンプルコード③：文字数チェック</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$name</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'name'</span>] ?? <span class="hljs-string">''</span>;
<span class="hljs-variable">$errors</span> = [];

<span class="hljs-keyword">if</span> (<span class="hljs-title function_ invoke__">mb_strlen</span>(<span class="hljs-variable">$name</span>) &gt; <span class="hljs-number">20</span>) {
  <span class="hljs-variable">$errors</span>[] = <span class="hljs-string">'名前は20文字以内で入力してください'</span>;
}
</code></pre>
</div>
<hr data-start="2399" data-end="2402" />
<h3 data-start="2404" data-end="2412">ポイント</h3>
<p data-start="2414" data-end="2471">・mb_strlen<br data-start="2424" data-end="2427" />　→ 日本語を含めた文字数を正しく数える<br data-start="2447" data-end="2450" />・文字数制限は実務で非常によく使われる</p>
<hr data-start="2473" data-end="2476" />
<h2 data-start="2478" data-end="2499">バリデーションは「処理の入口」で行う</h2>
<p data-start="2501" data-end="2510">重要な考え方です。</p>
<p data-start="2512" data-end="2540">・データを使う前<br data-start="2520" data-end="2523" />・保存する前<br data-start="2529" data-end="2532" />・表示する前</p>
<p data-start="2542" data-end="2577"><strong data-start="2542" data-end="2561">必ず最初にバリデーションを行う</strong><br data-start="2561" data-end="2564" />ことで、処理が安定します。</p>
<hr data-start="2579" data-end="2582" />
<h2 data-start="2584" data-end="2604">バリデーションとセキュリティは別物</h2>
<p data-start="2606" data-end="2622">ここは混同しやすいポイントです。</p>
<p data-start="2624" data-end="2681">・バリデーション<br data-start="2632" data-end="2635" />　→ 入力が正しいか<br data-start="2645" data-end="2648" />・セキュリティ対策（XSSなど）<br data-start="2664" data-end="2667" />　→ 安全に表示できるか</p>
<p data-start="2683" data-end="2719">バリデーションをしていても、<br data-start="2697" data-end="2700" /><strong data-start="2700" data-end="2715">セキュリティ対策は必須</strong> です。</p>
<hr data-start="2721" data-end="2724" />
<h2 data-start="2726" data-end="2739">初心者がよくやるミス</h2>
<p data-start="2741" data-end="2756">バリデーションで多いミスです。</p>
<p data-start="2758" data-end="2806">・エラーが1つしか表示できない<br data-start="2773" data-end="2776" />・チェックせずに処理を進める<br data-start="2790" data-end="2793" />・入力値を直接信用する</p>
<p data-start="2808" data-end="2836">「まずチェックする」<br data-start="2818" data-end="2821" />という順序を必ず守りましょう。</p>
<hr data-start="2838" data-end="2841" />
<h2 data-start="2843" data-end="2849">まとめ</h2>
<p data-start="2851" data-end="2878">この記事では、<br data-start="2858" data-end="2861" />PHPでのバリデーションについて、</p>
<p data-start="2880" data-end="2926">・入力チェックの役割<br data-start="2890" data-end="2893" />・エラーを配列で管理する理由<br data-start="2907" data-end="2910" />・必須・文字数チェックの実装</p>
<p data-start="2928" data-end="2935">を学びました。</p>
<p data-start="2937" data-end="2982">ここまでできるようになると、<br data-start="2951" data-end="2954" />フォーム処理は<br data-start="2961" data-end="2964" /><strong data-start="2964" data-end="2981">実務レベルに一段近づきます</strong>。</p>
<hr data-start="2984" data-end="2987" />
<h2 data-start="2989" data-end="3000">次に読むべき記事</h2>
<p data-start="3002" data-end="3031">▶ 次の記事<br data-start="3008" data-end="3011" /><a href="https://seek-rise.com/web-development/php-basic/post-438/">6-10 XSSとは？なぜ危険なのか</a></p>
<p data-start="3033" data-end="3069">▶ 関連記事<br data-start="3039" data-end="3042" /><a href="https://seek-rise.com/web-development/php-basic/post-428/">6-8 PHPでフォームデータを受け取って表示する</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-434/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">434</post-id>	</item>
		<item>
		<title>6-8 PHPでフォームデータを受け取って表示する</title>
		<link>https://seek-rise.com/web-development/php-basic/post-428/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-428/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 13:39:31 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[POST]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[PHPフォーム]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=428</guid>

					<description><![CDATA[ここまでで、 ・変数・条件分岐・繰り返し・配列 といった、PHPの基礎的な部品がすべて揃いました。 ここからは、それらを組み合わせてWebアプリケーションらしい処理 を書いていきます。 その第一歩が、フォームデータをPH [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="255" data-end="261">ここまでで、</p>
<p data-start="263" data-end="290">・変数<br data-start="266" data-end="269" />・条件分岐<br data-start="274" data-end="277" />・繰り返し<br data-start="282" data-end="285" />・配列</p>
<p data-start="292" data-end="317">といった、PHPの基礎的な部品がすべて揃いました。</p>
<p data-start="319" data-end="368">ここからは、それらを組み合わせて<br data-start="335" data-end="338" /><strong data-start="338" data-end="358">Webアプリケーションらしい処理</strong> を書いていきます。</p>
<p data-start="370" data-end="406">その第一歩が、<br data-start="377" data-end="380" /><strong data-start="380" data-end="402">フォームデータをPHPで受け取る処理</strong> です。</p>
<p data-start="408" data-end="415">この記事では、</p>
<p data-start="417" data-end="460">・HTMLフォームの送信<br data-start="429" data-end="432" />・PHPでの受け取り方<br data-start="443" data-end="446" />・表示するまでの最小構成</p>
<p data-start="462" data-end="479">を、実際に動くコードで解説します。</p>
<hr data-start="481" data-end="484" />
<h2 data-start="486" data-end="499">この記事で学べること</h2>
<p data-start="501" data-end="575">・HTMLフォームとPHPの関係<br data-start="517" data-end="520" />・$_POST / $_GET の役割<br data-start="539" data-end="542" />・フォームデータの受け取り方<br data-start="556" data-end="559" />・受け取った値を表示する方法</p>
<hr data-start="577" data-end="580" />
<h2 data-start="582" data-end="598">フォーム送信の基本的な流れ</h2>
<p data-start="600" data-end="623">フォーム処理は、<br data-start="608" data-end="611" />次の流れで動いています。</p>
<ol data-start="625" data-end="691">
<li data-start="625" data-end="642">
<p data-start="628" data-end="642">HTMLでフォームを表示</p>
</li>
<li data-start="643" data-end="659">
<p data-start="646" data-end="659">ユーザーが入力して送信</p>
</li>
<li data-start="660" data-end="677">
<p data-start="663" data-end="677">PHPがデータを受け取る</p>
</li>
<li data-start="678" data-end="691">
<p data-start="681" data-end="691">処理・表示を行う</p>
</li>
</ol>
<p data-start="693" data-end="724">この流れを<br data-start="698" data-end="701" /><strong data-start="701" data-end="717">一度しっかり体験すること</strong> が重要です。</p>
<hr data-start="726" data-end="729" />
<h2 data-start="731" data-end="747">HTMLフォームを作成する</h2>
<p data-start="749" data-end="776">まずは、<br data-start="753" data-end="756" /><strong data-start="756" data-end="769">最小構成のフォーム</strong> を作ります。</p>
<h3 data-start="778" data-end="799">サンプルコード①：HTMLフォーム</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span></span> <span class="hljs-attr">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"result.php"</span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">label</span></span>&gt;
    名前：
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"username"</span>&gt;
  <span class="hljs-tag">&lt;/<span class="hljs-name">label</span></span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">br</span></span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span>&gt;送信<span class="hljs-tag">&lt;/<span class="hljs-name">button</span></span>&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span></span>&gt;
</code></pre>
</div>
<hr data-start="975" data-end="978" />
<h3 data-start="980" data-end="988">ポイント</h3>
<p data-start="990" data-end="1075">・method=&#8221;post&#8221;<br data-start="1004" data-end="1007" />　→ POST送信を行う<br data-start="1019" data-end="1022" />・action<br data-start="1029" data-end="1032" />　→ 送信先のPHPファイル<br data-start="1046" data-end="1049" />・name 属性<br data-start="1057" data-end="1060" />　→ PHP側で使うキー名</p>
<p data-start="1077" data-end="1107">name 属性がないと、<br data-start="1089" data-end="1092" />PHPでは値を受け取れません。</p>
<hr data-start="1109" data-end="1112" />
<h2 data-start="1114" data-end="1133">PHPでフォームデータを受け取る</h2>
<p data-start="1135" data-end="1161">次に、<br data-start="1138" data-end="1141" />送信先の PHP ファイルを作成します。</p>
<h3 data-start="1163" data-end="1188">サンプルコード②：フォームデータの受け取り</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$username</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'username'</span>];

<span class="hljs-keyword">echo</span> <span class="hljs-variable">$username</span>;
</code></pre>
</div>
<hr data-start="1257" data-end="1260" />
<h3 data-start="1262" data-end="1274">コードの読み解き</h3>
<p data-start="1276" data-end="1366">・$_POST<br data-start="1283" data-end="1286" />　→ POST送信されたデータをまとめた配列<br data-start="1308" data-end="1311" />・[&#8216;username&#8217;]<br data-start="1324" data-end="1327" />　→ フォームの name 属性と対応<br data-start="1346" data-end="1349" />・echo<br data-start="1354" data-end="1357" />　→ 値を表示</p>
<p data-start="1368" data-end="1400">これで、<br data-start="1372" data-end="1375" />フォームに入力した内容が<br data-start="1387" data-end="1390" />画面に表示されます。</p>
<hr data-start="1402" data-end="1405" />
<h2 data-start="1407" data-end="1423">$_POST は配列である</h2>
<p data-start="1425" data-end="1436">ここは非常に重要です。</p>
<p data-start="1438" data-end="1462">$_POST は、<br data-start="1447" data-end="1450" /><strong data-start="1450" data-end="1458">連想配列</strong> です。</p>
<p data-start="1464" data-end="1468">つまり、</p>
<p data-start="1470" data-end="1500">・キー → name 属性<br data-start="1483" data-end="1486" />・値 → 入力された内容</p>
<p data-start="1502" data-end="1515">という構造になっています。</p>
<hr data-start="1517" data-end="1520" />
<h2 data-start="1522" data-end="1537">未定義エラーを防ぐ書き方</h2>
<p data-start="1539" data-end="1581">フォーム未送信時に<br data-start="1548" data-end="1551" />エラーが出るのを防ぐため、<br data-start="1564" data-end="1567" />次の書き方がよく使われます。</p>
<h3 data-start="1583" data-end="1604">サンプルコード③：安全な受け取り方</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$username</span> = <span class="hljs-variable">$_POST</span>[<span class="hljs-string">'username'</span>] ?? <span class="hljs-string">''</span>;

<span class="hljs-keyword">echo</span> <span class="hljs-variable">$username</span>;
</code></pre>
</div>
<hr data-start="1679" data-end="1682" />
<h3 data-start="1684" data-end="1692">ポイント</h3>
<p data-start="1694" data-end="1728">・??（null合体演算子）<br data-start="1708" data-end="1711" />　→ 値がなければ空文字にする</p>
<p data-start="1730" data-end="1753">この書き方は、<br data-start="1737" data-end="1740" />実務でも頻繁に使われます。</p>
<hr data-start="1755" data-end="1758" />
<h2 data-start="1760" data-end="1772">GET送信との違い</h2>
<p data-start="1774" data-end="1798">フォームは、<br data-start="1780" data-end="1783" />GET送信することもできます。</p>
<h3 data-start="1800" data-end="1822">サンプルコード④：GET送信フォーム</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-html"><span class="hljs-tag">&lt;<span class="hljs-name">form</span></span> <span class="hljs-attr">method</span>=<span class="hljs-string">"get"</span> <span class="hljs-attr">action</span>=<span class="hljs-string">"result.php"</span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">input</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"keyword"</span>&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span></span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span>&gt;検索<span class="hljs-tag">&lt;/<span class="hljs-name">button</span></span>&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">form</span></span>&gt;
</code></pre>
</div>
<hr data-start="1958" data-end="1961" />
<h3 data-start="1963" data-end="1976">PHP側の受け取り</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$keyword</span> = <span class="hljs-variable">$_GET</span>[<span class="hljs-string">'keyword'</span>] ?? <span class="hljs-string">''</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-variable">$keyword</span>;
</code></pre>
</div>
<hr data-start="2046" data-end="2049" />
<h3 data-start="2051" data-end="2068">POSTとGETの使い分け</h3>
<p data-start="2070" data-end="2080">目安は次の通りです。</p>
<p data-start="2082" data-end="2100">・登録・更新<br data-start="2088" data-end="2091" />　→ POST</p>
<p data-start="2102" data-end="2122">・検索・ページ移動<br data-start="2111" data-end="2114" />　→ GET</p>
<hr data-start="2124" data-end="2127" />
<h2 data-start="2129" data-end="2148">フォーム処理で必ず意識すべきこと</h2>
<p data-start="2150" data-end="2198">ここでは<br data-start="2154" data-end="2157" /><strong data-start="2157" data-end="2168">あえて表示だけ</strong> を行っていますが、<br data-start="2178" data-end="2181" />実務では次の処理が必須になります。</p>
<p data-start="2200" data-end="2238">・未入力チェック（バリデーション）<br data-start="2217" data-end="2220" />・XSS対策<br data-start="2226" data-end="2229" />・CSRF対策</p>
<p data-start="2240" data-end="2263">これらは、<br data-start="2245" data-end="2248" />次の記事以降で順番に扱います。</p>
<hr data-start="2265" data-end="2268" />
<h2 data-start="2270" data-end="2283">初心者がよくやるミス</h2>
<p data-start="2285" data-end="2299">フォーム処理で多いミスです。</p>
<p data-start="2301" data-end="2358">・name 属性を書き忘れる<br data-start="2315" data-end="2318" />・$_POST と $_GET を混同する<br data-start="2339" data-end="2342" />・未送信時のエラーを放置する</p>
<p data-start="2360" data-end="2390">「送信 → 受け取り」<br data-start="2371" data-end="2374" />の対応関係を必ず確認しましょう。</p>
<hr data-start="2392" data-end="2395" />
<h2 data-start="2397" data-end="2411">学習初期のおすすめ練習</h2>
<p data-start="2413" data-end="2425">次の練習がおすすめです。</p>
<p data-start="2427" data-end="2487">・入力欄を増やして受け取る<br data-start="2440" data-end="2443" />・複数項目を echo で表示する<br data-start="2460" data-end="2463" />・GET と POST を切り替えて確認する</p>
<hr data-start="2489" data-end="2492" />
<h2 data-start="2494" data-end="2500">まとめ</h2>
<p data-start="2502" data-end="2543">この記事では、<br data-start="2509" data-end="2512" />PHPでフォームデータを受け取るための<br data-start="2531" data-end="2534" />基本を学びました。</p>
<p data-start="2545" data-end="2599">・HTMLフォームと name 属性<br data-start="2563" data-end="2566" />・$_POST / $_GET の役割<br data-start="2585" data-end="2588" />・安全な受け取り方</p>
<p data-start="2601" data-end="2642">ここまで理解できれば、<br data-start="2612" data-end="2615" />PHPで <strong data-start="2620" data-end="2635">ユーザー入力を扱う土台</strong> が完成です。</p>
<hr data-start="2644" data-end="2647" />
<h2 data-start="2649" data-end="2660">次に読むべき記事</h2>
<p data-start="2662" data-end="2692">▶ 次の記事<br data-start="2668" data-end="2671" /><a href="https://seek-rise.com/web-development/php-basic/post-434/">6-9 PHPのバリデーションとは何か</a></p>
<p data-start="2694" data-end="2720">▶ 関連記事<br data-start="2700" data-end="2703" /><a href="https://seek-rise.com/web-development/php-basic/post-423/">6-7 PHPで配列を扱う基本</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-428/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">428</post-id>	</item>
		<item>
		<title>6-7 PHPで配列を扱う基本（array / 連想配列）</title>
		<link>https://seek-rise.com/web-development/php-basic/post-423/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-423/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 13:18:12 +0000</pubDate>
				<category><![CDATA[Web開発学習ロードマップ]]></category>
		<category><![CDATA[6.PHP基礎]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[foreach]]></category>
		<category><![CDATA[PHP配列]]></category>
		<category><![CDATA[連想配列]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=423</guid>

					<description><![CDATA[前の記事では、for / foreach を使った繰り返し処理 を学びました。 その中で何度も登場したのが、配列 です。 実際のWeb開発では、 ・フォームの入力値・エラーメッセージ・データベースから取得したデータ など [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="235" data-end="281">前の記事では、<br data-start="242" data-end="245" /><strong data-start="245" data-end="273">for / foreach を使った繰り返し処理</strong> を学びました。</p>
<p data-start="283" data-end="310">その中で何度も登場したのが、<br data-start="297" data-end="300" /><strong data-start="300" data-end="306">配列</strong> です。</p>
<p data-start="312" data-end="323">実際のWeb開発では、</p>
<p data-start="325" data-end="367">・フォームの入力値<br data-start="334" data-end="337" />・エラーメッセージ<br data-start="346" data-end="349" />・データベースから取得したデータ</p>
<p data-start="369" data-end="399">など、<br data-start="372" data-end="375" /><strong data-start="375" data-end="399">ほとんどのデータが配列として扱われます。</strong></p>
<p data-start="401" data-end="429">この記事では、<br data-start="408" data-end="411" />PHPで配列を扱うための基礎として、</p>
<p data-start="431" data-end="462">・配列とは何か<br data-start="438" data-end="441" />・配列の作り方<br data-start="448" data-end="451" />・配列の取り出し方</p>
<p data-start="464" data-end="481">を、実際に動くコードで整理します。</p>
<hr data-start="483" data-end="486" />
<h2 data-start="488" data-end="501">この記事で学べること</h2>
<p data-start="503" data-end="569">・配列の基本的な考え方<br data-start="514" data-end="517" />・配列の作成方法<br data-start="525" data-end="528" />・インデックス配列と連想配列の違い<br data-start="545" data-end="548" />・foreach と組み合わせた使い方</p>
<hr data-start="571" data-end="574" />
<h2 data-start="576" data-end="585">配列とは何か</h2>
<p data-start="587" data-end="624">配列とは、<br data-start="592" data-end="595" /><strong data-start="595" data-end="620">複数の値を1つにまとめて扱うためのデータ型</strong> です。</p>
<p data-start="626" data-end="652">変数が<br data-start="629" data-end="632" />「1つの値を入れる箱」<br data-start="643" data-end="646" />だとすると、</p>
<p data-start="654" data-end="692">配列は<br data-start="657" data-end="660" />「複数の箱をまとめたもの」<br data-start="673" data-end="676" />と考えると分かりやすくなります。</p>
<hr data-start="694" data-end="697" />
<h2 data-start="699" data-end="712">インデックス配列とは</h2>
<p data-start="714" data-end="753">インデックス配列は、<br data-start="724" data-end="727" /><strong data-start="727" data-end="749">番号（0,1,2…）で管理される配列</strong> です。</p>
<h3 data-start="755" data-end="776">サンプルコード①：インデックス配列</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$fruits</span> = [<span class="hljs-string">'りんご'</span>, <span class="hljs-string">'みかん'</span>, <span class="hljs-string">'ばなな'</span>];

<span class="hljs-keyword">echo</span> <span class="hljs-variable">$fruits</span>[<span class="hljs-number">0</span>];
</code></pre>
</div>
<hr data-start="847" data-end="850" />
<h3 data-start="852" data-end="864">コードの読み解き</h3>
<p data-start="866" data-end="902">・$fruits<br data-start="874" data-end="877" />　→ 配列<br data-start="882" data-end="885" />・[0]<br data-start="889" data-end="892" />　→ 最初の要素</p>
<p data-start="904" data-end="938">配列の番号は、<br data-start="911" data-end="914" /><strong data-start="914" data-end="924">0から始まる</strong><br data-start="924" data-end="927" />点に注意してください。</p>
<hr data-start="940" data-end="943" />
<h2 data-start="945" data-end="961">配列の中身をすべて表示する</h2>
<p data-start="963" data-end="1004">配列は、<br data-start="967" data-end="970" />foreach と組み合わせることで<br data-start="988" data-end="991" />簡単に中身を処理できます。</p>
<h3 data-start="1006" data-end="1027">サンプルコード②：配列を順番に表示</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$fruits</span> = [<span class="hljs-string">'りんご'</span>, <span class="hljs-string">'みかん'</span>, <span class="hljs-string">'ばなな'</span>];

<span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$fruits</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$fruit</span>) {
  <span class="hljs-keyword">echo</span> <span class="hljs-variable">$fruit</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
}
</code></pre>
</div>
<hr data-start="1137" data-end="1140" />
<h2 data-start="1142" data-end="1151">連想配列とは</h2>
<p data-start="1153" data-end="1186">連想配列は、<br data-start="1159" data-end="1162" /><strong data-start="1162" data-end="1182">キーと値のセットで管理される配列</strong> です。</p>
<p data-start="1188" data-end="1220">名前や設定値など、<br data-start="1197" data-end="1200" />意味のあるデータを扱うときに使われます。</p>
<hr data-start="1222" data-end="1225" />
<h2 data-start="1227" data-end="1237">連想配列の基本</h2>
<h3 data-start="1239" data-end="1256">サンプルコード③：連想配列</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$user</span> = [
  <span class="hljs-string">'name'</span> =&gt; <span class="hljs-string">'太郎'</span>,
  <span class="hljs-string">'age'</span> =&gt; <span class="hljs-number">20</span>,
  <span class="hljs-string">'email'</span> =&gt; <span class="hljs-string">'test@example.com'</span>
];

<span class="hljs-keyword">echo</span> <span class="hljs-variable">$user</span>[<span class="hljs-string">'name'</span>];
</code></pre>
</div>
<hr data-start="1375" data-end="1378" />
<h3 data-start="1380" data-end="1392">コードの読み解き</h3>
<p data-start="1394" data-end="1426">・&#8217;name&#8217;<br data-start="1401" data-end="1404" />　→ キー<br data-start="1409" data-end="1412" />・&#8217;太郎&#8217;<br data-start="1417" data-end="1420" />　→ 値</p>
<p data-start="1428" data-end="1469">番号ではなく、<br data-start="1435" data-end="1438" /><strong data-start="1438" data-end="1450">意味のあるキー名</strong> で<br data-start="1452" data-end="1455" />データを扱えるのが特徴です。</p>
<hr data-start="1471" data-end="1474" />
<h2 data-start="1476" data-end="1496">連想配列を foreach で扱う</h2>
<p data-start="1498" data-end="1523">連想配列も、<br data-start="1504" data-end="1507" />foreach で処理できます。</p>
<h3 data-start="1525" data-end="1548">サンプルコード④：キーと値を同時に使う</h3>
<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary">
<pre class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-php"><span class="hljs-meta">&lt;?php</span>
<span class="hljs-variable">$user</span> = [
  <span class="hljs-string">'name'</span> =&gt; <span class="hljs-string">'太郎'</span>,
  <span class="hljs-string">'age'</span> =&gt; <span class="hljs-number">20</span>,
  <span class="hljs-string">'email'</span> =&gt; <span class="hljs-string">'test@example.com'</span>
];

<span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$user</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$key</span> =&gt; <span class="hljs-variable">$value</span>) {
  <span class="hljs-keyword">echo</span> <span class="hljs-variable">$key</span> . <span class="hljs-string">'：'</span> . <span class="hljs-variable">$value</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
}
</code></pre>
</div>
<hr data-start="1722" data-end="1725" />
<h2 data-start="1727" data-end="1741">実務での配列の使われ方</h2>
<p data-start="1743" data-end="1766">配列は、<br data-start="1747" data-end="1750" />次のような場面で必ず使われます。</p>
<p data-start="1768" data-end="1816">・フォーム入力値（$_POST）<br data-start="1784" data-end="1787" />・エラーメッセージの管理<br data-start="1799" data-end="1802" />・データベースの検索結果</p>
<p data-start="1818" data-end="1859">これらはすべて<br data-start="1825" data-end="1828" /><strong data-start="1828" data-end="1841">配列として扱われる</strong><br data-start="1841" data-end="1844" />という点を覚えておきましょう。</p>
<hr data-start="1861" data-end="1864" />
<h2 data-start="1866" data-end="1887">配列と条件分岐・繰り返しの組み合わせ</h2>
<p data-start="1889" data-end="1893">配列は、</p>
<p data-start="1895" data-end="1912">・条件分岐<br data-start="1900" data-end="1903" />・繰り返し処理</p>
<p data-start="1914" data-end="1942">と組み合わせて使うことで、<br data-start="1927" data-end="1930" />初めて実用的になります。</p>
<p data-start="1944" data-end="1983">次の記事では、<br data-start="1951" data-end="1954" />配列を使った<br data-start="1960" data-end="1963" /><strong data-start="1963" data-end="1976">フォームデータ処理</strong> に進みます。</p>
<hr data-start="1985" data-end="1988" />
<h2 data-start="1990" data-end="2003">初心者がよくやるミス</h2>
<p data-start="2005" data-end="2015">配列で多いミスです。</p>
<p data-start="2017" data-end="2070">・配列なのに echo しようとする<br data-start="2035" data-end="2038" />・存在しないキーを参照する<br data-start="2051" data-end="2054" />・配列と普通の変数を混同する</p>
<p data-start="2072" data-end="2101">「今扱っているのは配列か？」<br data-start="2086" data-end="2089" />を常に意識してください。</p>
<hr data-start="2103" data-end="2106" />
<h2 data-start="2108" data-end="2122">学習初期のおすすめ練習</h2>
<p data-start="2124" data-end="2148">次の練習をすると、<br data-start="2133" data-end="2136" />配列の理解が深まります。</p>
<p data-start="2150" data-end="2202">・配列を作って表示する<br data-start="2161" data-end="2164" />・foreach で一覧表示する<br data-start="2180" data-end="2183" />・連想配列を条件分岐と組み合わせる</p>
<hr data-start="2204" data-end="2207" />
<h2 data-start="2209" data-end="2215">まとめ</h2>
<p data-start="2217" data-end="2245">この記事では、<br data-start="2224" data-end="2227" />PHPで配列を扱うための基本として、</p>
<p data-start="2247" data-end="2285">・インデックス配列<br data-start="2256" data-end="2259" />・連想配列<br data-start="2264" data-end="2267" />・foreach との組み合わせ</p>
<p data-start="2287" data-end="2294">を学びました。</p>
<p data-start="2296" data-end="2339">配列が理解できると、<br data-start="2306" data-end="2309" />PHPのコードは<br data-start="2317" data-end="2320" />一気に「Webアプリらしく」なります。</p>
<hr data-start="2341" data-end="2344" />
<h2 data-start="2346" data-end="2357">次に読むべき記事</h2>
<p data-start="2359" data-end="2395">▶ 次の記事<br data-start="2365" data-end="2368" /><a href="https://seek-rise.com/web-development/php-basic/post-428/">6-8 PHPでフォームデータを受け取って表示する</a></p>
<p data-start="2397" data-end="2437">▶ 関連記事<br data-start="2403" data-end="2406" /><a href="https://seek-rise.com/web-development/php-basic/post-420/">6-6 PHPで繰り返し処理（for / foreach）</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-423/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">423</post-id>	</item>
	</channel>
</rss>
