<?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/tag/%E5%88%9D%E5%BF%83%E8%80%85/feed/" rel="self" type="application/rss+xml" />
	<link>https://seek-rise.com</link>
	<description></description>
	<lastBuildDate>Sat, 03 Jan 2026 14:37:17 +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>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[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[PHP応用]]></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">データベースとは何か</a></li><li><a href="#toc3" tabindex="0">なぜファイル保存ではダメなのか</a></li><li><a href="#toc4" tabindex="0">MySQLとは何か</a></li><li><a href="#toc5" tabindex="0">データベースは「表」で考える</a></li><li><a href="#toc6" tabindex="0">テーブルの基本構造</a></li><li><a href="#toc7" tabindex="0">主キー（id）の役割</a></li><li><a href="#toc8" tabindex="0">PHPとMySQLの関係</a></li><li><a href="#toc9" tabindex="0">SQLとは何か</a></li><li><a href="#toc10" tabindex="0">CRUDという考え方</a></li><li><a href="#toc11" tabindex="0">PHP × MySQL 学習のゴール</a></li><li><a href="#toc12" tabindex="0">次の記事で何をするのか</a></li><li><a href="#toc13" tabindex="0">まとめ</a></li><li><a href="#toc14" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="520" data-end="533"><span id="toc1">この記事で学べること</span></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"><span id="toc2">データベースとは何か</span></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"><span id="toc3">なぜファイル保存ではダメなのか</span></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"><span id="toc4">MySQLとは何か</span></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"><span id="toc5">データベースは「表」で考える</span></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"><span id="toc6">テーブルの基本構造</span></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"><span id="toc7">主キー（id）の役割</span></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"><span id="toc8">PHPとMySQLの関係</span></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"><span id="toc9">SQLとは何か</span></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"><span id="toc10">CRUDという考え方</span></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"><span id="toc11">PHP × MySQL 学習のゴール</span></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"><span id="toc12">次の記事で何をするのか</span></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"><span id="toc13">まとめ</span></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"><span id="toc14">次に読むべき記事</span></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[PHPまとめ]]></category>
		<category><![CDATA[次のステップ]]></category>
		<category><![CDATA[学習ロードマップ]]></category>
		<category><![CDATA[Web開発]]></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">6章のゴールを再確認する</a></li><li><a href="#toc2" tabindex="0">6章で学んだ内容を流れで整理する</a><ol><li><a href="#toc3" tabindex="0">① PHPの基本文法（6-2 / 6-3）</a></li><li><a href="#toc4" tabindex="0">② 処理を制御する（6-4 / 6-5 / 6-6）</a></li><li><a href="#toc5" tabindex="0">③ データをまとめて扱う（6-7）</a></li><li><a href="#toc6" tabindex="0">④ ユーザー入力を扱う（6-8 / 6-9）</a></li><li><a href="#toc7" tabindex="0">⑤ セキュリティの基礎（6-10 / 6-11）</a></li><li><a href="#toc8" tabindex="0">⑥ 状態を管理する（6-12 / 6-13）</a></li></ol></li><li><a href="#toc9" tabindex="0">今できるようになっていること</a></li><li><a href="#toc10" tabindex="0">まだ「できなくて普通」なこと</a></li><li><a href="#toc11" tabindex="0">次に進む前のおすすめ確認ポイント</a></li><li><a href="#toc12" tabindex="0">次に学ぶべき内容は何か</a></li><li><a href="#toc13" tabindex="0">次章（7章）の位置づけ</a></li><li><a href="#toc14" tabindex="0">フレームワークはまだ使わなくていい</a></li><li><a href="#toc15" tabindex="0">まとめ</a></li><li><a href="#toc16" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="445" data-end="460"><span id="toc1">6章のゴールを再確認する</span></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"><span id="toc2">6章で学んだ内容を流れで整理する</span></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"><span id="toc3">① PHPの基本文法（6-2 / 6-3）</span></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"><span id="toc4">② 処理を制御する（6-4 / 6-5 / 6-6）</span></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"><span id="toc5">③ データをまとめて扱う（6-7）</span></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"><span id="toc6">④ ユーザー入力を扱う（6-8 / 6-9）</span></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"><span id="toc7">⑤ セキュリティの基礎（6-10 / 6-11）</span></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"><span id="toc8">⑥ 状態を管理する（6-12 / 6-13）</span></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"><span id="toc9">今できるようになっていること</span></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"><span id="toc10">まだ「できなくて普通」なこと</span></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"><span id="toc11">次に進む前のおすすめ確認ポイント</span></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"><span id="toc12">次に学ぶべき内容は何か</span></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"><span id="toc13">次章（7章）の位置づけ</span></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"><span id="toc14">フレームワークはまだ使わなくていい</span></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"><span id="toc15">まとめ</span></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"><span id="toc16">次に読むべき記事</span></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">ログイン処理の全体像</a></li><li><a href="#toc3" tabindex="0">ログインフォームを作成する</a><ol><li><a href="#toc4" tabindex="0">サンプルコード①：ログインフォーム</a></li><li><a href="#toc5" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc6" tabindex="0">ログイン処理（PHP側）</a><ol><li><a href="#toc7" tabindex="0">サンプルコード②：ログイン処理の基本</a></li></ol></li><li><a href="#toc8" tabindex="0">コードの流れを整理する</a></li><li><a href="#toc9" tabindex="0">セッションに保存する意味</a></li><li><a href="#toc10" tabindex="0">ログイン後ページの例</a><ol><li><a href="#toc11" tabindex="0">サンプルコード③：ログイン判定</a></li><li><a href="#toc12" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc13" tabindex="0">ログアウト処理の例</a><ol><li><a href="#toc14" tabindex="0">サンプルコード④：ログアウト</a></li></ol></li><li><a href="#toc15" tabindex="0">このログイン処理は「学習用」</a></li><li><a href="#toc16" tabindex="0">それでもこの実装が重要な理由</a></li><li><a href="#toc17" tabindex="0">初心者がよくつまずくポイント</a></li><li><a href="#toc18" tabindex="0">まとめ</a></li><li><a href="#toc19" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="468" data-end="481"><span id="toc1">この記事で学べること</span></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"><span id="toc2">ログイン処理の全体像</span></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"><span id="toc3">ログインフォームを作成する</span></h2>
<h3 data-start="771" data-end="792"><span id="toc4">サンプルコード①：ログインフォーム</span></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"><span id="toc5">ポイント</span></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"><span id="toc6">ログイン処理（PHP側）</span></h2>
<p data-start="1166" data-end="1195">次に、<br data-start="1169" data-end="1172" />フォーム送信を受け取る PHP を作成します。</p>
<h3 data-start="1197" data-end="1219"><span id="toc7">サンプルコード②：ログイン処理の基本</span></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"><span id="toc8">コードの流れを整理する</span></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"><span id="toc9">セッションに保存する意味</span></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"><span id="toc10">ログイン後ページの例</span></h2>
<p data-start="2062" data-end="2094">ログイン後に表示するページでは、<br data-start="2078" data-end="2081" />次のようにチェックします。</p>
<h3 data-start="2096" data-end="2115"><span id="toc11">サンプルコード③：ログイン判定</span></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"><span id="toc12">ポイント</span></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"><span id="toc13">ログアウト処理の例</span></h2>
<h3 data-start="2414" data-end="2432"><span id="toc14">サンプルコード④：ログアウト</span></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"><span id="toc15">このログイン処理は「学習用」</span></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"><span id="toc16">それでもこの実装が重要な理由</span></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"><span id="toc17">初心者がよくつまずくポイント</span></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"><span id="toc18">まとめ</span></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"><span id="toc19">次に読むべき記事</span></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[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[PHPセッション]]></category>
		<category><![CDATA[ログイン処理]]></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">セッションとは何か</a></li><li><a href="#toc3" tabindex="0">クッキーとセッションの違い</a></li><li><a href="#toc4" tabindex="0">セッションは何に使われるのか</a></li><li><a href="#toc5" tabindex="0">セッションを使うための準備</a></li><li><a href="#toc6" tabindex="0">セッションを開始する</a><ol><li><a href="#toc7" tabindex="0">サンプルコード①：セッション開始</a></li><li><a href="#toc8" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc9" tabindex="0">セッションに値を保存する</a><ol><li><a href="#toc10" tabindex="0">サンプルコード②：セッションに保存</a></li></ol></li><li><a href="#toc11" tabindex="0">セッションから値を取り出す</a><ol><li><a href="#toc12" tabindex="0">サンプルコード③：セッションの取得</a></li></ol></li><li><a href="#toc13" tabindex="0">ログイン状態を管理する考え方</a></li><li><a href="#toc14" tabindex="0">ログイン成功時の例</a><ol><li><a href="#toc15" tabindex="0">サンプルコード④：ログイン成功時</a></li></ol></li><li><a href="#toc16" tabindex="0">ログイン状態を判定する</a><ol><li><a href="#toc17" tabindex="0">サンプルコード⑤：ログインチェック</a></li></ol></li><li><a href="#toc18" tabindex="0">ログアウト処理の基本</a><ol><li><a href="#toc19" tabindex="0">サンプルコード⑥：ログアウト</a></li></ol></li><li><a href="#toc20" tabindex="0">セッション使用時の注意点</a></li><li><a href="#toc21" tabindex="0">セッションとCSRFの関係</a></li><li><a href="#toc22" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc23" tabindex="0">まとめ</a></li><li><a href="#toc24" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="553" data-end="566"><span id="toc1">この記事で学べること</span></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"><span id="toc2">セッションとは何か</span></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"><span id="toc3">クッキーとセッションの違い</span></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"><span id="toc4">セッションは何に使われるのか</span></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"><span id="toc5">セッションを使うための準備</span></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"><span id="toc6">セッションを開始する</span></h2>
<h3 data-start="1240" data-end="1260"><span id="toc7">サンプルコード①：セッション開始</span></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"><span id="toc8">ポイント</span></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"><span id="toc9">セッションに値を保存する</span></h2>
<p data-start="1405" data-end="1427">セッションは、<br data-start="1412" data-end="1415" />連想配列として扱います。</p>
<h3 data-start="1429" data-end="1450"><span id="toc10">サンプルコード②：セッションに保存</span></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"><span id="toc11">セッションから値を取り出す</span></h2>
<p data-start="1592" data-end="1616">保存した値は、<br data-start="1599" data-end="1602" />別のページでも取り出せます。</p>
<h3 data-start="1618" data-end="1639"><span id="toc12">サンプルコード③：セッションの取得</span></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"><span id="toc13">ログイン状態を管理する考え方</span></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"><span id="toc14">ログイン成功時の例</span></h2>
<h3 data-start="1897" data-end="1917"><span id="toc15">サンプルコード④：ログイン成功時</span></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"><span id="toc16">ログイン状態を判定する</span></h2>
<h3 data-start="2093" data-end="2114"><span id="toc17">サンプルコード⑤：ログインチェック</span></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"><span id="toc18">ログアウト処理の基本</span></h2>
<p data-start="2295" data-end="2319">ログアウト時には、<br data-start="2304" data-end="2307" />セッションを破棄します。</p>
<h3 data-start="2321" data-end="2339"><span id="toc19">サンプルコード⑥：ログアウト</span></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"><span id="toc20">セッション使用時の注意点</span></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"><span id="toc21">セッションとCSRFの関係</span></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"><span id="toc22">初心者がよくやるミス</span></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"><span id="toc23">まとめ</span></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"><span id="toc24">次に読むべき記事</span></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[PHP基礎]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[CSRF]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[初心者]]></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">CSRFとは何か</a></li><li><a href="#toc3" tabindex="0">CSRF攻撃の典型的な流れ</a></li><li><a href="#toc4" tabindex="0">CSRFで何が起こるのか</a></li><li><a href="#toc5" tabindex="0">なぜCSRFが起きるのか</a></li><li><a href="#toc6" tabindex="0">XSSとCSRFの違い</a></li><li><a href="#toc7" tabindex="0">CSRF対策の基本は「トークン」</a></li><li><a href="#toc8" tabindex="0">PHPでCSRFトークンを生成する</a><ol><li><a href="#toc9" tabindex="0">サンプルコード①：トークン生成</a></li><li><a href="#toc10" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc11" tabindex="0">フォームにトークンを埋め込む</a><ol><li><a href="#toc12" tabindex="0">サンプルコード②：フォーム側</a></li><li><a href="#toc13" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc14" tabindex="0">送信時にトークンを検証する</a><ol><li><a href="#toc15" tabindex="0">サンプルコード③：トークン検証</a></li><li><a href="#toc16" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc17" tabindex="0">CSRF対策が必要な処理</a></li><li><a href="#toc18" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc19" tabindex="0">フレームワークがCSRF対策を自動化する理由</a></li><li><a href="#toc20" tabindex="0">まとめ</a></li><li><a href="#toc21" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="508" data-end="521"><span id="toc1">この記事で学べること</span></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"><span id="toc2">CSRFとは何か</span></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"><span id="toc3">CSRF攻撃の典型的な流れ</span></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"><span id="toc4">CSRFで何が起こるのか</span></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"><span id="toc5">なぜCSRFが起きるのか</span></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"><span id="toc6">XSSとCSRFの違い</span></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"><span id="toc7">CSRF対策の基本は「トークン」</span></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"><span id="toc8">PHPでCSRFトークンを生成する</span></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"><span id="toc9">サンプルコード①：トークン生成</span></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"><span id="toc10">コードの読み解き</span></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"><span id="toc11">フォームにトークンを埋め込む</span></h2>
<p data-start="1856" data-end="1877">次に、<br data-start="1859" data-end="1862" />フォームにトークンを含めます。</p>
<h3 data-start="1879" data-end="1897"><span id="toc12">サンプルコード②：フォーム側</span></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"><span id="toc13">ポイント</span></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"><span id="toc14">送信時にトークンを検証する</span></h2>
<p data-start="2178" data-end="2205">フォーム送信後、<br data-start="2186" data-end="2189" />PHP側でトークンを確認します。</p>
<h3 data-start="2207" data-end="2226"><span id="toc15">サンプルコード③：トークン検証</span></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"><span id="toc16">コードの読み解き</span></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"><span id="toc17">CSRF対策が必要な処理</span></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"><span id="toc18">初心者がよくやるミス</span></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"><span id="toc19">フレームワークがCSRF対策を自動化する理由</span></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"><span id="toc20">まとめ</span></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"><span id="toc21">次に読むべき記事</span></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">XSSとは何か</a></li><li><a href="#toc3" tabindex="0">XSSが起きる典型的な例</a><ol><li><a href="#toc4" tabindex="0">サンプルコード①：危険な表示方法</a></li></ol></li><li><a href="#toc5" tabindex="0">悪意ある入力がされた場合</a></li><li><a href="#toc6" tabindex="0">XSSで何が起こるのか</a></li><li><a href="#toc7" tabindex="0">なぜXSSが起きるのか</a></li><li><a href="#toc8" tabindex="0">XSS対策の基本は「エスケープ」</a></li><li><a href="#toc9" tabindex="0">PHPでの基本的なXSS対策</a><ol><li><a href="#toc10" tabindex="0">サンプルコード②：安全な表示方法</a></li><li><a href="#toc11" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc12" tabindex="0">バリデーションとXSS対策の違い</a></li><li><a href="#toc13" tabindex="0">エスケープは「出力時」に行う</a></li><li><a href="#toc14" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc15" tabindex="0">実務での考え方</a></li><li><a href="#toc16" tabindex="0">まとめ</a></li><li><a href="#toc17" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="511" data-end="524"><span id="toc1">この記事で学べること</span></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"><span id="toc2">XSSとは何か</span></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"><span id="toc3">XSSが起きる典型的な例</span></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"><span id="toc4">サンプルコード①：危険な表示方法</span></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"><span id="toc5">悪意ある入力がされた場合</span></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"><span id="toc6">XSSで何が起こるのか</span></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"><span id="toc7">なぜXSSが起きるのか</span></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"><span id="toc8">XSS対策の基本は「エスケープ」</span></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"><span id="toc9">PHPでの基本的なXSS対策</span></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"><span id="toc10">サンプルコード②：安全な表示方法</span></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"><span id="toc11">コードの読み解き</span></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"><span id="toc12">バリデーションとXSS対策の違い</span></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"><span id="toc13">エスケープは「出力時」に行う</span></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"><span id="toc14">初心者がよくやるミス</span></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"><span id="toc15">実務での考え方</span></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"><span id="toc16">まとめ</span></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"><span id="toc17">次に読むべき記事</span></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[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[PHPバリデーション]]></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">バリデーションとは何か</a></li><li><a href="#toc3" tabindex="0">なぜバリデーションが必要なのか</a></li><li><a href="#toc4" tabindex="0">バリデーションの基本的な考え方</a></li><li><a href="#toc5" tabindex="0">エラーは配列で管理する</a></li><li><a href="#toc6" tabindex="0">必須入力チェックの基本</a><ol><li><a href="#toc7" tabindex="0">サンプルコード①：必須チェック</a></li><li><a href="#toc8" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc9" tabindex="0">なぜ empty() ではなく === &#8221; を使うのか</a></li><li><a href="#toc10" tabindex="0">複数項目のバリデーション</a><ol><li><a href="#toc11" tabindex="0">サンプルコード②：複数項目チェック</a></li></ol></li><li><a href="#toc12" tabindex="0">文字数チェックの基本</a><ol><li><a href="#toc13" tabindex="0">サンプルコード③：文字数チェック</a></li><li><a href="#toc14" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc15" tabindex="0">バリデーションは「処理の入口」で行う</a></li><li><a href="#toc16" tabindex="0">バリデーションとセキュリティは別物</a></li><li><a href="#toc17" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc18" tabindex="0">まとめ</a></li><li><a href="#toc19" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="524" data-end="537"><span id="toc1">この記事で学べること</span></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"><span id="toc2">バリデーションとは何か</span></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"><span id="toc3">なぜバリデーションが必要なのか</span></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"><span id="toc4">バリデーションの基本的な考え方</span></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"><span id="toc5">エラーは配列で管理する</span></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"><span id="toc6">必須入力チェックの基本</span></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"><span id="toc7">サンプルコード①：必須チェック</span></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"><span id="toc8">コードの読み解き</span></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"><span id="toc9">なぜ empty() ではなく === &#8221; を使うのか</span></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"><span id="toc10">複数項目のバリデーション</span></h2>
<p data-start="1828" data-end="1854">実際のフォームでは、<br data-start="1838" data-end="1841" />複数の入力項目を扱います。</p>
<h3 data-start="1856" data-end="1877"><span id="toc11">サンプルコード②：複数項目チェック</span></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"><span id="toc12">文字数チェックの基本</span></h2>
<p data-start="2225" data-end="2245">次に、<br data-start="2228" data-end="2231" />文字数をチェックする例です。</p>
<h3 data-start="2247" data-end="2267"><span id="toc13">サンプルコード③：文字数チェック</span></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"><span id="toc14">ポイント</span></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"><span id="toc15">バリデーションは「処理の入口」で行う</span></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"><span id="toc16">バリデーションとセキュリティは別物</span></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"><span id="toc17">初心者がよくやるミス</span></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"><span id="toc18">まとめ</span></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"><span id="toc19">次に読むべき記事</span></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[Web開発]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[PHP基礎]]></category>
		<category><![CDATA[PHPフォーム]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[POST]]></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">フォーム送信の基本的な流れ</a></li><li><a href="#toc3" tabindex="0">HTMLフォームを作成する</a><ol><li><a href="#toc4" tabindex="0">サンプルコード①：HTMLフォーム</a></li><li><a href="#toc5" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc6" tabindex="0">PHPでフォームデータを受け取る</a><ol><li><a href="#toc7" tabindex="0">サンプルコード②：フォームデータの受け取り</a></li><li><a href="#toc8" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc9" tabindex="0">$_POST は配列である</a></li><li><a href="#toc10" tabindex="0">未定義エラーを防ぐ書き方</a><ol><li><a href="#toc11" tabindex="0">サンプルコード③：安全な受け取り方</a></li><li><a href="#toc12" tabindex="0">ポイント</a></li></ol></li><li><a href="#toc13" tabindex="0">GET送信との違い</a><ol><li><a href="#toc14" tabindex="0">サンプルコード④：GET送信フォーム</a></li><li><a href="#toc15" tabindex="0">PHP側の受け取り</a></li><li><a href="#toc16" tabindex="0">POSTとGETの使い分け</a></li></ol></li><li><a href="#toc17" tabindex="0">フォーム処理で必ず意識すべきこと</a></li><li><a href="#toc18" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc19" tabindex="0">学習初期のおすすめ練習</a></li><li><a href="#toc20" tabindex="0">まとめ</a></li><li><a href="#toc21" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="486" data-end="499"><span id="toc1">この記事で学べること</span></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"><span id="toc2">フォーム送信の基本的な流れ</span></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"><span id="toc3">HTMLフォームを作成する</span></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"><span id="toc4">サンプルコード①：HTMLフォーム</span></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"><span id="toc5">ポイント</span></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"><span id="toc6">PHPでフォームデータを受け取る</span></h2>
<p data-start="1135" data-end="1161">次に、<br data-start="1138" data-end="1141" />送信先の PHP ファイルを作成します。</p>
<h3 data-start="1163" data-end="1188"><span id="toc7">サンプルコード②：フォームデータの受け取り</span></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"><span id="toc8">コードの読み解き</span></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"><span id="toc9">$_POST は配列である</span></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"><span id="toc10">未定義エラーを防ぐ書き方</span></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"><span id="toc11">サンプルコード③：安全な受け取り方</span></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"><span id="toc12">ポイント</span></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"><span id="toc13">GET送信との違い</span></h2>
<p data-start="1774" data-end="1798">フォームは、<br data-start="1780" data-end="1783" />GET送信することもできます。</p>
<h3 data-start="1800" data-end="1822"><span id="toc14">サンプルコード④：GET送信フォーム</span></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"><span id="toc15">PHP側の受け取り</span></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"><span id="toc16">POSTとGETの使い分け</span></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"><span id="toc17">フォーム処理で必ず意識すべきこと</span></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"><span id="toc18">初心者がよくやるミス</span></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"><span id="toc19">学習初期のおすすめ練習</span></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"><span id="toc20">まとめ</span></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"><span id="toc21">次に読むべき記事</span></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" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">配列とは何か</a></li><li><a href="#toc3" tabindex="0">インデックス配列とは</a><ol><li><a href="#toc4" tabindex="0">サンプルコード①：インデックス配列</a></li><li><a href="#toc5" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc6" tabindex="0">配列の中身をすべて表示する</a><ol><li><a href="#toc7" tabindex="0">サンプルコード②：配列を順番に表示</a></li></ol></li><li><a href="#toc8" tabindex="0">連想配列とは</a></li><li><a href="#toc9" tabindex="0">連想配列の基本</a><ol><li><a href="#toc10" tabindex="0">サンプルコード③：連想配列</a></li><li><a href="#toc11" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc12" tabindex="0">連想配列を foreach で扱う</a><ol><li><a href="#toc13" tabindex="0">サンプルコード④：キーと値を同時に使う</a></li></ol></li><li><a href="#toc14" tabindex="0">実務での配列の使われ方</a></li><li><a href="#toc15" tabindex="0">配列と条件分岐・繰り返しの組み合わせ</a></li><li><a href="#toc16" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc17" tabindex="0">学習初期のおすすめ練習</a></li><li><a href="#toc18" tabindex="0">まとめ</a></li><li><a href="#toc19" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="488" data-end="501"><span id="toc1">この記事で学べること</span></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"><span id="toc2">配列とは何か</span></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"><span id="toc3">インデックス配列とは</span></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"><span id="toc4">サンプルコード①：インデックス配列</span></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"><span id="toc5">コードの読み解き</span></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"><span id="toc6">配列の中身をすべて表示する</span></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"><span id="toc7">サンプルコード②：配列を順番に表示</span></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"><span id="toc8">連想配列とは</span></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"><span id="toc9">連想配列の基本</span></h2>
<h3 data-start="1239" data-end="1256"><span id="toc10">サンプルコード③：連想配列</span></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"><span id="toc11">コードの読み解き</span></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"><span id="toc12">連想配列を foreach で扱う</span></h2>
<p data-start="1498" data-end="1523">連想配列も、<br data-start="1504" data-end="1507" />foreach で処理できます。</p>
<h3 data-start="1525" data-end="1548"><span id="toc13">サンプルコード④：キーと値を同時に使う</span></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"><span id="toc14">実務での配列の使われ方</span></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"><span id="toc15">配列と条件分岐・繰り返しの組み合わせ</span></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"><span id="toc16">初心者がよくやるミス</span></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"><span id="toc17">学習初期のおすすめ練習</span></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"><span id="toc18">まとめ</span></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"><span id="toc19">次に読むべき記事</span></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>
		<item>
		<title>6-6 PHPで繰り返し処理（for / foreach）</title>
		<link>https://seek-rise.com/web-development/php-basic/post-420/</link>
					<comments>https://seek-rise.com/web-development/php-basic/post-420/#respond</comments>
		
		<dc:creator><![CDATA[NOA（ノア）]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 13:07:38 +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[for]]></category>
		<category><![CDATA[foreach]]></category>
		<guid isPermaLink="false">https://seek-rise.com/?p=420</guid>

					<description><![CDATA[前の記事では、条件分岐（if / elseif / switch） を使って処理を分ける方法を学びました。 しかし実際のWeb開発では、 ・同じ処理を何度も行いたい・配列の中身を順番に処理したい といった場面が頻繁に出て [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="263" data-end="326">前の記事では、<br data-start="270" data-end="273" /><strong data-start="273" data-end="303">条件分岐（if / elseif / switch）</strong> を使って<br data-start="308" data-end="311" />処理を分ける方法を学びました。</p>
<p data-start="328" data-end="342">しかし実際のWeb開発では、</p>
<p data-start="344" data-end="377">・同じ処理を何度も行いたい<br data-start="357" data-end="360" />・配列の中身を順番に処理したい</p>
<p data-start="379" data-end="395">といった場面が頻繁に出てきます。</p>
<p data-start="397" data-end="432">そのようなときに使うのが、<br data-start="410" data-end="413" /><strong data-start="413" data-end="428">繰り返し処理（ループ）</strong> です。</p>
<p data-start="434" data-end="503">この記事では、<br data-start="441" data-end="444" />PHPで最もよく使われる<br data-start="456" data-end="459" /><strong data-start="459" data-end="476">for と foreach</strong> を中心に、<br data-start="482" data-end="485" />実際に動くコードで理解していきます。</p>
<hr data-start="505" data-end="508" />

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事で学べること</a></li><li><a href="#toc2" tabindex="0">繰り返し処理とは何か</a></li><li><a href="#toc3" tabindex="0">for 文の基本的な考え方</a></li><li><a href="#toc4" tabindex="0">for 文の基本構文</a><ol><li><a href="#toc5" tabindex="0">サンプルコード①：for 文の基本</a></li><li><a href="#toc6" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc7" tabindex="0">for 文は「回数で考える」</a></li><li><a href="#toc8" tabindex="0">配列と for 文（考え方だけ）</a></li><li><a href="#toc9" tabindex="0">foreach 文とは何か</a></li><li><a href="#toc10" tabindex="0">foreach の基本構文</a><ol><li><a href="#toc11" tabindex="0">サンプルコード②：foreach の基本</a></li><li><a href="#toc12" tabindex="0">コードの読み解き</a></li></ol></li><li><a href="#toc13" tabindex="0">配列処理は foreach が基本</a></li><li><a href="#toc14" tabindex="0">キーと値を同時に使う foreach</a><ol><li><a href="#toc15" tabindex="0">サンプルコード③：キー付き foreach</a></li><li><a href="#toc16" tabindex="0">実務での使いどころ</a></li></ol></li><li><a href="#toc17" tabindex="0">for と foreach の使い分け</a></li><li><a href="#toc18" tabindex="0">初心者がよくやるミス</a></li><li><a href="#toc19" tabindex="0">学習初期のおすすめ練習</a></li><li><a href="#toc20" tabindex="0">まとめ</a></li><li><a href="#toc21" tabindex="0">次に読むべき記事</a></li></ol>
    </div>
  </div>

<h2 data-start="510" data-end="523"><span id="toc1">この記事で学べること</span></h2>
<p data-start="525" data-end="592">・繰り返し処理とは何か<br data-start="536" data-end="539" />・for 文の基本構造<br data-start="550" data-end="553" />・foreach 文の使い方<br data-start="567" data-end="570" />・for と foreach の使い分け</p>
<hr data-start="594" data-end="597" />
<h2 data-start="599" data-end="612"><span id="toc2">繰り返し処理とは何か</span></h2>
<p data-start="614" data-end="656">繰り返し処理とは、<br data-start="623" data-end="626" /><strong data-start="626" data-end="652">同じ処理を条件が満たされるまで繰り返す仕組み</strong> です。</p>
<p data-start="658" data-end="662">例えば、</p>
<p data-start="664" data-end="694">・1〜10まで表示する<br data-start="675" data-end="678" />・配列の中身をすべて表示する</p>
<p data-start="696" data-end="724">といった処理を、<br data-start="704" data-end="707" />短いコードで書けるようになります。</p>
<hr data-start="726" data-end="729" />
<h2 data-start="731" data-end="747"><span id="toc3">for 文の基本的な考え方</span></h2>
<p data-start="749" data-end="785">for 文は、<br data-start="756" data-end="759" /><strong data-start="759" data-end="776">回数が決まっている繰り返し</strong> に向いています。</p>
<p data-start="787" data-end="804">構造は次の3つで成り立っています。</p>
<ol data-start="806" data-end="839">
<li data-start="806" data-end="814">
<p data-start="809" data-end="814">初期値</p>
</li>
<li data-start="815" data-end="826">
<p data-start="818" data-end="826">繰り返す条件</p>
</li>
<li data-start="827" data-end="839">
<p data-start="830" data-end="839">1回ごとの増減</p>
</li>
</ol>
<hr data-start="841" data-end="844" />
<h2 data-start="846" data-end="859"><span id="toc4">for 文の基本構文</span></h2>
<h3 data-start="861" data-end="882"><span id="toc5">サンプルコード①：for 文の基本</span></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-keyword">for</span> (<span class="hljs-variable">$i</span> = <span class="hljs-number">1</span>; <span class="hljs-variable">$i</span> &lt;= <span class="hljs-number">5</span>; <span class="hljs-variable">$i</span>++) {
  <span class="hljs-keyword">echo</span> <span class="hljs-variable">$i</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
}
</code></pre>
</div>
<hr data-start="954" data-end="957" />
<h3 data-start="959" data-end="971"><span id="toc6">コードの読み解き</span></h3>
<p data-start="973" data-end="1042">・$i = 1<br data-start="980" data-end="983" />　→ カウンターの初期値<br data-start="995" data-end="998" />・$i &lt;= 5<br data-start="1006" data-end="1009" />　→ 繰り返す条件<br data-start="1018" data-end="1021" />・$i++<br data-start="1026" data-end="1029" />　→ 1回ごとに +1</p>
<p data-start="1044" data-end="1068">結果として、<br data-start="1050" data-end="1053" />1〜5 が順番に表示されます。</p>
<hr data-start="1070" data-end="1073" />
<h2 data-start="1075" data-end="1092"><span id="toc7">for 文は「回数で考える」</span></h2>
<p data-start="1094" data-end="1129">for 文を書くときは、<br data-start="1106" data-end="1109" />次のように考えると分かりやすくなります。</p>
<p data-start="1131" data-end="1147">「この処理は、何回繰り返すか？」</p>
<p data-start="1149" data-end="1173">回数が明確な場合は、<br data-start="1159" data-end="1162" />for 文が最適です。</p>
<hr data-start="1175" data-end="1178" />
<h2 data-start="1180" data-end="1199"><span id="toc8">配列と for 文（考え方だけ）</span></h2>
<p data-start="1201" data-end="1238">配列の要素数が分かっている場合、<br data-start="1217" data-end="1220" />for 文で処理することもできます。</p>
<p data-start="1240" data-end="1283">ただし、<br data-start="1244" data-end="1247" />PHPではこの用途には<br data-start="1258" data-end="1261" /><strong data-start="1261" data-end="1279">foreach の方が一般的</strong> です。</p>
<hr data-start="1285" data-end="1288" />
<h2 data-start="1290" data-end="1306"><span id="toc9">foreach 文とは何か</span></h2>
<p data-start="1308" data-end="1352">foreach は、<br data-start="1318" data-end="1321" /><strong data-start="1321" data-end="1348">配列の中身を1つずつ取り出すための繰り返し処理</strong> です。</p>
<p data-start="1354" data-end="1391">PHPでは、<br data-start="1360" data-end="1363" />配列処理のほとんどが<br data-start="1373" data-end="1376" />foreach で書かれます。</p>
<hr data-start="1393" data-end="1396" />
<h2 data-start="1398" data-end="1414"><span id="toc10">foreach の基本構文</span></h2>
<h3 data-start="1416" data-end="1440"><span id="toc11">サンプルコード②：foreach の基本</span></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">$colors</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">$colors</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$color</span>) {
  <span class="hljs-keyword">echo</span> <span class="hljs-variable">$color</span> . <span class="hljs-string">'&lt;br&gt;'</span>;
}
</code></pre>
</div>
<hr data-start="1544" data-end="1547" />
<h3 data-start="1549" data-end="1561"><span id="toc12">コードの読み解き</span></h3>
<p data-start="1563" data-end="1616">・$colors<br data-start="1571" data-end="1574" />　→ 対象となる配列<br data-start="1584" data-end="1587" />・$color<br data-start="1594" data-end="1597" />　→ 配列から1つずつ取り出した値</p>
<p data-start="1618" data-end="1650">配列の要素数を意識しなくても、<br data-start="1633" data-end="1636" />自動で最後まで処理されます。</p>
<hr data-start="1652" data-end="1655" />
<h2 data-start="1657" data-end="1677"><span id="toc13">配列処理は foreach が基本</span></h2>
<p data-start="1679" data-end="1685">PHPでは、</p>
<p data-start="1687" data-end="1726">・配列の中身を表示する<br data-start="1698" data-end="1701" />・配列の値をチェックする<br data-start="1713" data-end="1716" />・配列を加工する</p>
<p data-start="1728" data-end="1757">といった処理は、<br data-start="1736" data-end="1739" />ほぼ foreach で書かれます。</p>
<p data-start="1759" data-end="1790">for 文よりも<br data-start="1767" data-end="1770" /><strong data-start="1770" data-end="1782">安全で読みやすい</strong> のが理由です。</p>
<hr data-start="1792" data-end="1795" />
<h2 data-start="1797" data-end="1818"><span id="toc14">キーと値を同時に使う foreach</span></h2>
<p data-start="1820" data-end="1866">配列によっては、<br data-start="1828" data-end="1831" />「番号」や「名前」などの<br data-start="1843" data-end="1846" /><strong data-start="1846" data-end="1852">キー</strong> を使いたい場合があります。</p>
<h3 data-start="1868" data-end="1893"><span id="toc15">サンプルコード③：キー付き foreach</span></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-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="2034" data-end="2037" />
<h3 data-start="2039" data-end="2052"><span id="toc16">実務での使いどころ</span></h3>
<p data-start="2054" data-end="2093">・連想配列の中身を表示<br data-start="2065" data-end="2068" />・設定値を一覧表示<br data-start="2077" data-end="2080" />・フォームエラーの表示</p>
<p data-start="2095" data-end="2113">などで、<br data-start="2099" data-end="2102" />非常によく使われます。</p>
<hr data-start="2115" data-end="2118" />
<h2 data-start="2120" data-end="2142"><span id="toc17">for と foreach の使い分け</span></h2>
<p data-start="2144" data-end="2154">目安は次の通りです。</p>
<p data-start="2156" data-end="2177">・回数が決まっている<br data-start="2166" data-end="2169" />　→ for</p>
<p data-start="2179" data-end="2203">・配列を処理したい<br data-start="2188" data-end="2191" />　→ foreach</p>
<p data-start="2205" data-end="2236">無理に統一せず、<br data-start="2213" data-end="2216" /><strong data-start="2216" data-end="2227">意図が伝わる方</strong> を選びましょう。</p>
<hr data-start="2238" data-end="2241" />
<h2 data-start="2243" data-end="2256"><span id="toc18">初心者がよくやるミス</span></h2>
<p data-start="2258" data-end="2272">繰り返し処理で多いミスです。</p>
<p data-start="2274" data-end="2334">・条件が間違って無限ループ<br data-start="2287" data-end="2290" />・配列なのに for で無理に処理する<br data-start="2309" data-end="2312" />・foreach の変数名が分かりにくい</p>
<p data-start="2336" data-end="2370">「何を繰り返しているか」<br data-start="2348" data-end="2351" />が分かる変数名を付けることが大切です。</p>
<hr data-start="2372" data-end="2375" />
<h2 data-start="2377" data-end="2391"><span id="toc19">学習初期のおすすめ練習</span></h2>
<p data-start="2393" data-end="2423">次のような処理を書いてみると、<br data-start="2408" data-end="2411" />理解が一気に深まります。</p>
<p data-start="2425" data-end="2474">・1〜10を表示する<br data-start="2435" data-end="2438" />・配列の中身をすべて表示する<br data-start="2452" data-end="2455" />・配列の値を条件分岐と組み合わせる</p>
<p data-start="2476" data-end="2503">条件分岐と組み合わせることで、<br data-start="2491" data-end="2494" />実務に近づきます。</p>
<hr data-start="2505" data-end="2508" />
<h2 data-start="2510" data-end="2516"><span id="toc20">まとめ</span></h2>
<p data-start="2518" data-end="2542">この記事では、<br data-start="2525" data-end="2528" />PHPの繰り返し処理として、</p>
<p data-start="2544" data-end="2565">・for 文<br data-start="2550" data-end="2553" />・foreach 文</p>
<p data-start="2567" data-end="2577">の基本を学びました。</p>
<p data-start="2579" data-end="2631">繰り返し処理が書けるようになると、<br data-start="2596" data-end="2599" /><strong data-start="2599" data-end="2616">配列・フォーム・データ処理</strong> が<br data-start="2618" data-end="2621" />一気に楽になります。</p>
<p data-start="2633" data-end="2661">次は、</p>
<p data-start="2633" data-end="2661">配列そのものをもう一段深く理解していきます。</p>
<hr data-start="2663" data-end="2666" />
<h2 data-start="2668" data-end="2679"><span id="toc21">次に読むべき記事</span></h2>
<p data-start="2681" data-end="2707">▶ 次の記事<br data-start="2687" data-end="2690" /><a href="https://seek-rise.com/web-development/php-basic/post-423/">6-7 PHPで配列を扱う基本</a></p>
<p data-start="2709" data-end="2749">▶ 関連記事<br data-start="2715" data-end="2718" /><a href="https://seek-rise.com/web-development/php-basic/post-417/">6-5 PHPの条件分岐（elseif / switch）</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://seek-rise.com/web-development/php-basic/post-420/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">420</post-id>	</item>
	</channel>
</rss>
