PHPのisset()は、変数がセットされているかどうかを確認するための構文です。
一般的には「isset関数」と呼ばれることも多いですが、厳密にはPHPの言語構造です。
とはいえ、初心者向けの学習や記事では「isset関数」という表現で説明されることも少なくありません。
isset()は、変数や配列のキー、オブジェクトのプロパティなどが存在していて、なおかつ値がnullではない場合にtrueを返します。
$name = '山田';
var_dump(isset($name));
実行結果は次のようになります。
bool(true)
$nameという変数が定義されていて、値もnullではないため、isset($name)はtrueになります。
issetの基本的な意味
変数が定義されていてnullではないかを確認する
isset()は、単純に「変数が存在するか」だけを見るものではありません。
正確には、次の2つを確認します。
変数が定義されている
かつ
値がnullではない
そのため、変数が存在していても、値がnullの場合はfalseになります。
$name = null;
var_dump(isset($name));
実行結果は次の通りです。
bool(false)
$nameという変数自体は定義されています。
しかし、値がnullなので、isset($name)はfalseになります。
issetの基本構文
1つの変数を確認する場合
isset()の基本的な書き方は次の通りです。
isset($変数)
例えば、次のように使います。
$name = '佐藤';
if (isset($name)) {
echo '変数$nameはセットされています';
} else {
echo '変数$nameはセットされていません';
}
この場合、$nameには'佐藤'という値が入っているため、isset($name)はtrueになります。
複数の変数をまとめて確認する場合
isset()には、複数の変数を指定することもできます。
isset($var1, $var2, $var3)
複数指定した場合は、**すべての変数が定義されていて、なおかつすべてがnullではない場合のみtrue**になります。
$name = '田中';
$email = 'tanaka@example.com';
if (isset($name, $email)) {
echo '名前とメールアドレスの両方が設定されています';
}
この例では、$nameと$emailの両方に値が入っているため、isset($name, $email)はtrueになります。
一方、次のように1つでもnullが含まれると、結果はfalseになります。
$name = '田中';
$email = null;
var_dump(isset($name, $email));
実行結果は次の通りです。
bool(false)
$nameは問題ありませんが、$emailがnullなので、全体としてfalseになります。
issetの戻り値
trueになる場合
isset()は、対象が定義されていて、値がnullではない場合にtrueを返します。
$text = 'Hello';
var_dump(isset($text));
実行結果は次の通りです。
bool(true)
文字列が入っているため、isset($text)はtrueです。
falseになる場合
isset()がfalseを返す主なケースは、次の2つです。
変数が未定義の場合
値がnullの場合
例えば、未定義の変数に対してisset()を使うと、次のようになります。
var_dump(isset($name));
実行結果は次の通りです。
bool(false)
$nameが定義されていないため、falseになります。
また、値がnullの場合もfalseです。
$name = null;
var_dump(isset($name));
実行結果は次の通りです。
bool(false)
issetでtrueになる値
空文字はtrueになる
isset()は「値が空かどうか」を確認するものではありません。
そのため、空文字でも、変数が定義されていてnullでなければtrueになります。
$text = '';
var_dump(isset($text));
実行結果は次の通りです。
bool(true)
空文字はnullではないため、isset($text)はtrueになります。
0もtrueになる
数値の0も、isset()ではtrueになります。
$number = 0;
var_dump(isset($number));
実行結果は次の通りです。
bool(true)
0はnullではないため、isset($number)はtrueです。
falseもtrueになる
真偽値のfalseも、isset()ではtrueになります。
$flag = false;
var_dump(isset($flag));
実行結果は次の通りです。
bool(true)
falseはnullとは異なる値です。
そのため、isset($flag)はtrueになります。
空配列もtrueになる
空配列も、isset()ではtrueになります。
$items = [];
var_dump(isset($items));
実行結果は次の通りです。
bool(true)
空配列はnullではありません。
そのため、isset($items)はtrueになります。
issetで注意したい値の一覧
issetの判定結果
isset()の判定結果を整理すると、次のようになります。
| 値 | issetの結果 |
|---|---|
| 未定義の変数 | false |
null | false |
'' 空文字 | true |
0 | true |
'0' | true |
false | true |
[] 空配列 | true |
'abc' | true |
123 | true |
特に注意したいのは、空文字、0、false、空配列がtrueになる点です。
isset()は、あくまで定義されていて、値がnullではないかを確認するためのものです。
「入力されているか」「空ではないか」を確認するものではありません。
issetとemptyの違い
issetはnullでないかを確認する
isset()は、変数が定義されていて、値がnullでなければtrueを返します。
$value = '';
var_dump(isset($value));
実行結果は次の通りです。
bool(true)
空文字であっても、nullではないためtrueになります。
emptyは空とみなされるかを確認する
empty()は、値が「空」とみなされるかどうかを確認します。
$value = '';
var_dump(empty($value));
実行結果は次の通りです。
bool(true)
空文字は、empty()では空と判断されます。
issetとemptyの比較表
isset()とempty()の違いは、次の表で整理できます。
| 値 | issetの結果 | emptyの結果 |
|---|---|---|
| 未定義の変数 | false | true |
null | false | true |
'' 空文字 | true | true |
0 | true | true |
'0' | true | true |
false | true | true |
[] 空配列 | true | true |
'abc' | true | false |
123 | true | false |
簡単に言うと、次のように使い分けます。
isset():変数が存在していて、nullではないかを確認する
empty():値が空とみなされるかを確認する
emptyを使うときの注意点
empty()は便利ですが、使い方には注意が必要です。
例えば、次のような値もempty()では空と判断されます。
$value = '0';
var_dump(empty($value));
実行結果は次の通りです。
bool(true)
文字列の'0'は、実際には値が入っています。
しかし、empty()では空とみなされます。
そのため、入力チェックでempty()を使うと、0や'0'を有効な値として扱いたい場面で問題になることがあります。
例えば、次のようなコードには注意が必要です。
$age = '0';
if (empty($age)) {
echo '年齢が入力されていません';
}
この場合、'0'が入力されていても、empty()では空と判定されます。
入力必須チェックを厳密に行いたい場合は、次のように空文字と比較する方法もあります。
if ($age === '') {
echo '年齢が入力されていません';
}
issetとis_nullの違い
is_nullはnullかどうかを確認する
is_null()は、値がnullかどうかを確認する関数です。
$value = null;
var_dump(is_null($value));
実行結果は次の通りです。
bool(true)
$valueの値がnullなので、is_null($value)はtrueになります。
issetとis_nullはnullに対して逆の結果になる
同じ値に対して、isset()とis_null()を使うと次のようになります。
$value = null;
var_dump(isset($value));
var_dump(is_null($value));
実行結果は次の通りです。
bool(false)
bool(true)
isset()は、値がnullの場合にfalseを返します。
一方、is_null()は、値がnullの場合にtrueを返します。
未定義の変数にis_nullを使うと注意が必要
未定義の変数に対してis_null()を使うと、警告が出る場合があります。
var_dump(is_null($value));
$valueが定義されていない場合、未定義変数に関する警告が出る可能性があります。
未定義の可能性がある値を扱う場合は、まずisset()や??を使って安全に値を取り出すとよいでしょう。
$value = $data['key'] ?? null;
if (is_null($value)) {
echo '値はnullです';
}
配列でissetを使う方法
配列のキーが存在し、値がnullでないか確認する
isset()は、配列のキーを確認するときによく使われます。
$user = [
'name' => '佐藤',
'age' => 30
];
if (isset($user['name'])) {
echo $user['name'];
}
この場合、$user['name']は存在していて、値もnullではありません。
そのため、isset($user['name'])はtrueになります。
存在しない配列キーを確認する
存在しない配列キーに対してisset()を使うと、falseになります。
$user = [
'name' => '佐藤',
'age' => 30
];
if (isset($user['email'])) {
echo $user['email'];
} else {
echo 'メールアドレスは登録されていません';
}
この場合、emailというキーは配列内に存在しません。
そのため、isset($user['email'])はfalseになります。
このように、配列キーにアクセスする前にisset()で確認しておくと、未定義キーに関する警告を避けやすくなります。
配列キーの値がnullの場合
配列のキーが存在していても、値がnullの場合はisset()ではfalseになります。
$user = [
'name' => '佐藤',
'email' => null
];
var_dump(isset($user['email']));
実行結果は次の通りです。
bool(false)
emailというキー自体は存在しています。
しかし、値がnullなので、isset($user['email'])はfalseになります。
この点は非常に重要です。
isset()は、配列キーの存在だけを確認するものではありません。
キーが存在していても、値がnullであればfalseになります。
issetとarray_key_existsの違い
array_key_existsはキーの存在を確認する
配列のキーが存在するかどうかだけを確認したい場合は、array_key_exists()を使います。
$user = [
'name' => '佐藤',
'email' => null
];
var_dump(isset($user['email']));
var_dump(array_key_exists('email', $user));
実行結果は次の通りです。
bool(false)
bool(true)
isset($user['email'])は、値がnullなのでfalseになります。
一方、array_key_exists('email', $user)は、emailというキーが存在しているためtrueになります。
issetとarray_key_existsの比較表
| 状態 | isset | array_key_exists |
|---|---|---|
| キーが存在し、値が文字列 | true | true |
| キーが存在し、値が0 | true | true |
| キーが存在し、値がfalse | true | true |
| キーが存在し、値がnull | false | true |
| キーが存在しない | false | false |
使い分けは次の通りです。
値がnullではないことまで確認したい場合:isset()
キーが存在するかだけを確認したい場合:array_key_exists()
オブジェクトでissetを使う方法
オブジェクトのプロパティを確認する
isset()は、オブジェクトのプロパティに対しても使えます。
$user = new stdClass();
$user->name = '鈴木';
if (isset($user->name)) {
echo $user->name;
}
この場合、$user->nameが存在していて、値もnullではないため、isset($user->name)はtrueになります。
プロパティの値がnullの場合
オブジェクトのプロパティが存在していても、値がnullの場合はfalseになります。
$user = new stdClass();
$user->email = null;
var_dump(isset($user->email));
実行結果は次の通りです。
bool(false)
emailというプロパティは存在しています。
しかし、値がnullなので、isset($user->email)はfalseになります。
issetとproperty_existsの違い
property_existsはプロパティの存在を確認する
オブジェクトのプロパティが存在するかどうかだけを確認したい場合は、property_exists()を使います。
$user = new stdClass();
$user->email = null;
var_dump(isset($user->email));
var_dump(property_exists($user, 'email'));
実行結果は次の通りです。
bool(false)
bool(true)
isset()は、値がnullなのでfalseになります。
一方、property_exists()は、プロパティが存在していればtrueになります。
オブジェクトでissetを使うときの注意点
通常のpublicプロパティであれば、isset()は分かりやすく使えます。
ただし、クラスによっては、privateプロパティやマジックメソッド__isset()が関係することがあります。
その場合、通常の変数や配列とは挙動が異なることがあります。
初心者のうちは、まず次のように理解しておくとよいです。
プロパティが存在し、値がnullでないか確認したい場合:isset()
プロパティの存在だけを確認したい場合:property_exists()
フォーム処理でissetを使う方法
POST送信された値を確認する
isset()は、フォームから送信された値を確認するときによく使われます。
例えば、次のようなHTMLフォームがあるとします。
<form method="post" action="submit.php">
<input type="text" name="username">
<button type="submit">送信</button>
</form>
PHP側では、次のように確認できます。
if (isset($_POST['username'])) {
echo $_POST['username'];
} else {
echo '名前が送信されていません';
}
$_POST['username']が存在していれば、入力された値を処理できます。
フォーム値を表示するときはエスケープする
フォームから送信された値をそのまま画面に表示するのは危険です。
例えば、次のコードは注意が必要です。
if (isset($_POST['username'])) {
echo $_POST['username'];
}
ユーザーがHTMLタグやJavaScriptを入力した場合、XSSのリスクがあります。
画面に表示する場合は、htmlspecialchars()を使ってエスケープします。
if (isset($_POST['username'])) {
echo htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
}
isset()は、値が送信されているかを確認するものです。
入力値が安全かどうかを保証するものではありません。
入力必須チェックではissetだけでは不十分
isset()は、値が存在していてnullでなければtrueになります。
そのため、空文字でもtrueになります。
$username = '';
var_dump(isset($username));
実行結果は次の通りです。
bool(true)
入力欄が空かどうかまで確認したい場合は、trim()や空文字との比較を組み合わせます。
$username = $_POST['username'] ?? '';
$username = trim($username);
if ($username === '') {
echo '名前を入力してください';
} else {
echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
}
このように、フォーム処理では次の流れで考えると安全です。
値を取得する
前後の空白を削除する
空文字かどうかを確認する
表示時にエスケープする
GETパラメータでissetを使う方法
URLパラメータを確認する
URLのクエリパラメータを受け取る場合にも、isset()はよく使われます。
例えば、次のようなURLがあるとします。
example.com/detail.php?id=10
この場合、PHP側では次のようにidを確認できます。
if (isset($_GET['id'])) {
$id = $_GET['id'];
echo 'IDは' . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . 'です';
} else {
echo 'IDが指定されていません';
}
$_GET['id']が存在している場合だけ、IDを取得できます。
GETパラメータはバリデーションが必要
isset($_GET['id'])は、あくまでidが存在するかどうかの確認です。
その値が正しいか、安全かまでは確認できません。
例えば、IDとして数値だけを受け取りたい場合は、次のようにチェックします。
if (isset($_GET['id']) && ctype_digit($_GET['id'])) {
$id = (int) $_GET['id'];
echo 'IDは' . $id . 'です';
} else {
echo '正しいIDを指定してください';
}
ctype_digit()を使うことで、文字列が数字だけで構成されているかを確認できます。
ただし、SQLで使用する場合は、数値チェックだけでなく、PDOなどのプリペアドステートメントを使うことが重要です。
チェックボックスでissetを使う方法
チェックされているか確認する
チェックボックスは、チェックされていない場合、値が送信されません。
そのため、チェックボックスの判定ではisset()がよく使われます。
<form method="post">
<label>
<input type="checkbox" name="agree" value="1">
利用規約に同意する
</label>
<button type="submit">送信</button>
</form>
PHP側では次のように確認できます。
if (isset($_POST['agree'])) {
echo '同意しています';
} else {
echo '同意していません';
}
チェックされていれば、$_POST['agree']が送信されます。
チェックされていなければ、$_POST['agree']自体が存在しません。
期待する値かどうかも確認する
実務では、存在確認だけでなく、値そのものも確認したほうが安全です。
if (isset($_POST['agree']) && $_POST['agree'] === '1') {
echo '同意しています';
} else {
echo '同意していません';
}
POSTデータはユーザー側で変更できるため、存在しているだけでなく、期待した値かどうかも確認するとより安全です。
ラジオボタンでissetを使う方法
選択されているか確認する
ラジオボタンも、選択されていない場合は値が送信されないことがあります。
<form method="post">
<label>
<input type="radio" name="gender" value="male">
男性
</label>
<label>
<input type="radio" name="gender" value="female">
女性
</label>
<button type="submit">送信</button>
</form>
PHP側では、次のように確認できます。
if (isset($_POST['gender'])) {
echo htmlspecialchars($_POST['gender'], ENT_QUOTES, 'UTF-8');
} else {
echo '選択されていません';
}
選択肢に含まれる値か確認する
ラジオボタンの場合も、送信された値が想定した選択肢の中にあるかを確認するのが安全です。
$allowed = ['male', 'female'];
if (isset($_POST['gender']) && in_array($_POST['gender'], $allowed, true)) {
echo htmlspecialchars($_POST['gender'], ENT_QUOTES, 'UTF-8');
} else {
echo '正しい値を選択してください';
}
isset()は存在確認には便利ですが、入力値が正しいかどうかまでは判定しません。
そのため、フォームの値を扱うときはバリデーションも組み合わせる必要があります。
セッションでissetを使う方法
ログイン状態を確認する
isset()は、セッションの値を確認するときにもよく使われます。
ログイン状態の確認では、次のようなコードが使われます。
session_start();
if (isset($_SESSION['user_id'])) {
echo 'ログイン中です';
} else {
echo 'ログインしていません';
}
$_SESSION['user_id']が存在していて、値がnullでなければログイン中と判断できます。
未ログインの場合にリダイレクトする
マイページなど、ログインが必要なページでは、次のように使えます。
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
echo 'マイページです';
$_SESSION['user_id']が存在しない場合は、ログインページへリダイレクトします。
ただし、実際のログイン処理では、セッションIDの管理、ログイン期限、ユーザー情報の整合性なども考慮する必要があります。
null合体演算子??との関係
??を使うと簡潔に書ける
PHP 7以降では、??というnull合体演算子が使えます。
??を使うと、値が存在しない場合やnullの場合に、デフォルト値を設定できます。
$name = $_POST['name'] ?? 'ゲスト';
これは、次のコードと似た意味になります。
$name = isset($_POST['name']) ? $_POST['name'] : 'ゲスト';
$_POST['name']が存在していて、値がnullでなければその値を使います。
存在しない、またはnullの場合は'ゲスト'を使います。
issetと??の使い分け
条件分岐として明確に処理を分けたい場合は、isset()を使うと分かりやすいです。
if (isset($_GET['id'])) {
echo 'IDが指定されています';
}
一方、値がなければ初期値を入れたいだけなら、??のほうが簡潔です。
$page = $_GET['page'] ?? 1;
使い分けは次のように考えるとよいでしょう。
条件分岐として確認したい場合:isset()
デフォルト値を設定したい場合:??
三項演算子とissetを組み合わせる方法
古くから使われる書き方
PHP 7より前のコードや、古いシステムでは、isset()と三項演算子を組み合わせた書き方がよく使われます。
$name = isset($_POST['name']) ? $_POST['name'] : 'ゲスト';
これは、次のような意味です。
$_POST['name']が存在していてnullでなければ、その値を使う
存在しない、またはnullなら、'ゲスト'を使う
現在は??を使うと読みやすい
PHP 7以降を前提にするなら、次のように書くほうが簡潔です。
$name = $_POST['name'] ?? 'ゲスト';
現在のPHPでは、単純な初期値設定なら??を使うケースが多いです。
ただし、条件によって処理を分けたい場合や、複数の条件を組み合わせたい場合は、isset()を使ったif文のほうが分かりやすいこともあります。
issetに渡せるもの
変数を渡せる
isset()には、変数を渡せます。
$name = '山田';
var_dump(isset($name));
配列要素を渡せる
配列の要素も渡せます。
$user = [
'name' => '山田'
];
var_dump(isset($user['name']));
オブジェクトのプロパティを渡せる
オブジェクトのプロパティも渡せます。
$user = new stdClass();
$user->name = '山田';
var_dump(isset($user->name));
式やリテラルを直接渡すものではない
isset()は、基本的に変数として扱えるものに対して使います。
次のような使い方は適切ではありません。
isset(1 + 2);
isset('text');
isset(trim($name));
isset()は、計算結果や文字列そのものを判定するためのものではありません。
例えば、trim($name)の結果が空かどうかを確認したい場合は、次のように書きます。
$name = trim($name);
if ($name !== '') {
echo '名前が入力されています';
}
WordPressでissetを使う例
フォーム値の存在確認に使う
WordPressのテーマ開発やプラグイン開発でも、isset()はよく使われます。
例えば、フォームから送信された値を確認する場合は、次のように書けます。
if (isset($_POST['keyword'])) {
$keyword = sanitize_text_field($_POST['keyword']);
} else {
$keyword = '';
}
ただし、WordPressで$_POSTや$_GETを扱う場合は、サニタイズやエスケープも重要です。
WordPressではサニタイズとエスケープを行う
WordPressでは、入力値をそのまま使うのではなく、sanitize_text_field()などでサニタイズします。
$keyword = '';
if (isset($_POST['keyword'])) {
$keyword = sanitize_text_field($_POST['keyword']);
}
echo esc_html($keyword);
入力時にはサニタイズ、出力時にはエスケープを行うのが基本です。
isset():値が送信されているか確認する
sanitize_text_field():入力値を整える
esc_html():出力時にエスケープする
WordPressフォームではnonce確認も重要
WordPressでフォームを処理する場合は、CSRF対策としてnonce確認も重要です。
if (
isset($_POST['keyword'], $_POST['_wpnonce']) &&
wp_verify_nonce($_POST['_wpnonce'], 'search_action')
) {
$keyword = sanitize_text_field(wp_unslash($_POST['keyword']));
echo esc_html($keyword);
}
WordPressでは、フォームから送信された値に対して、次のような処理を組み合わせると安全性が高まります。
isset()で存在確認する
wp_verify_nonce()でnonceを確認する
wp_unslash()でスラッシュを取り除く
sanitize_text_field()でサニタイズする
esc_html()でエスケープして表示する
issetを使うべき場面
未定義の変数を確認したい場合
未定義の変数をそのまま使うと、警告が出ることがあります。
echo $name;
$nameが定義されていない場合、未定義変数に関する警告が出る可能性があります。
そのような場合は、事前にisset()で確認できます。
if (isset($name)) {
echo $name;
} else {
echo '名前は設定されていません';
}
配列キーにアクセスする前に確認したい場合
配列キーが存在しない状態でアクセスすると、警告が出ることがあります。
echo $user['email'];
emailキーが存在しない場合、未定義キーに関する警告が出る可能性があります。
そのため、事前にisset()で確認すると安全です。
if (isset($user['email'])) {
echo $user['email'];
}
フォームの送信値を確認したい場合
フォームの値が送信されているか確認したい場合にも、isset()が使えます。
if (isset($_POST['email'])) {
echo 'メールアドレスが送信されました';
}
ただし、この時点では「送信されたか」を確認しているだけです。
メールアドレスとして正しい形式かどうかは、別途バリデーションが必要です。
if (isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
echo '正しいメールアドレスです';
} else {
echo 'メールアドレスが正しくありません';
}
issetだけでは不十分な場面
入力値が空かどうかを確認したい場合
isset()は、空文字でもtrueになります。
$name = '';
var_dump(isset($name));
実行結果は次の通りです。
bool(true)
そのため、入力欄が空かどうかを確認したい場合は、isset()だけでは不十分です。
$name = $_POST['name'] ?? '';
$name = trim($name);
if ($name === '') {
echo '名前を入力してください';
}
配列キーの存在だけを確認したい場合
配列キーが存在するかだけを確認したい場合は、isset()ではなくarray_key_exists()を使うほうが適切です。
$data = [
'memo' => null
];
var_dump(isset($data['memo']));
var_dump(array_key_exists('memo', $data));
実行結果は次の通りです。
bool(false)
bool(true)
値がnullでも、キーが存在するかどうかを知りたい場合は、array_key_exists()を使いましょう。
入力値の安全性を確認したい場合
isset()は、入力値が安全かどうかを判定するものではありません。
例えば、次のコードでは、メールアドレスの形式が正しいかどうかは確認できていません。
if (isset($_POST['email'])) {
echo $_POST['email'];
}
メールアドレスの形式を確認したい場合は、filter_var()などを使います。
if (isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
echo '正しいメールアドレスです';
}
また、画面に表示する場合は、htmlspecialchars()でエスケープします。
if (isset($_POST['email'])) {
echo htmlspecialchars($_POST['email'], ENT_QUOTES, 'UTF-8');
}
issetの実用例
GETパラメータに初期値を設定する
ページ番号をGETパラメータで受け取る場合の例です。
$page = $_GET['page'] ?? 1;
echo '現在のページ:' . $page;
$_GET['page']が存在すればその値を使い、存在しなければ1を使います。
isset()で書くと、次のようになります。
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 1;
}
echo '現在のページ:' . $page;
現在のPHPでは、単純な初期値設定であれば??を使うほうが簡潔です。
配列から値を安全に取り出す
配列にキーが存在しない可能性がある場合は、??を使うと簡単です。
$user = [
'name' => '高橋',
'age' => 28
];
$name = $user['name'] ?? '名前未設定';
$email = $user['email'] ?? 'メール未設定';
echo $name;
echo $email;
emailキーが存在しない場合でも、警告を避けながらデフォルト値を設定できます。
フォームの入力値を処理する
フォームから送信された名前を処理する例です。
$name = $_POST['name'] ?? '';
$name = trim($name);
if ($name === '') {
echo '名前を入力してください';
} else {
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
}
このコードでは、次の処理を行っています。
$_POST['name'] ?? ''で値を安全に取得する
trim()で前後の空白を削除する
空文字かどうかを確認する
htmlspecialchars()でエスケープして表示する
ログイン状態を確認する
セッションを使ってログイン状態を確認する例です。
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
echo 'ログイン中のユーザーです';
$_SESSION['user_id']が存在しない場合は、ログインページへ移動します。
issetを使うときのよくある間違い
nullでもtrueになると思ってしまう
isset()は、値がnullの場合にfalseになります。
$value = null;
if (isset($value)) {
echo '値があります';
} else {
echo '値はありません';
}
実行結果は次の通りです。
値はありません
変数自体は定義されていますが、値がnullなのでisset()ではfalseです。
空文字をfalseだと思ってしまう
空文字はnullではないため、isset()ではtrueになります。
$value = '';
if (isset($value)) {
echo '値はセットされています';
}
この場合、isset($value)はtrueです。
入力されているかどうかを確認したい場合は、空文字との比較を使います。
if ($value !== '') {
echo '入力されています';
}
issetだけでバリデーションしたつもりになる
isset()は、入力値の存在確認には使えます。
しかし、入力値が正しい形式かどうかまでは確認できません。
例えば、次のコードでは、メールアドレスが送信されているかどうかしか確認していません。
if (isset($_POST['email'])) {
echo 'メールアドレス:' . $_POST['email'];
}
メールアドレスとして正しいか確認するなら、次のようにします。
if (isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
echo '正しいメールアドレスです';
} else {
echo 'メールアドレスが正しくありません';
}
issetだけでセキュリティ対策になると思ってしまう
isset()は、値が存在するかどうかを確認するだけです。
XSSやSQLインジェクションなどを防ぐ機能はありません。
画面に表示するなら、htmlspecialchars()を使います。
echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
SQLに使うなら、プリペアドステートメントを使います。
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
isset()は便利ですが、セキュリティ対策とは役割が違います。
issetの使い分けまとめ
issetを使うとよい場面
isset()は、次のような場面で使うと便利です。
| 場面 | 例 |
|---|---|
| 変数がセットされているか確認したい | $name |
| 配列キーが存在し、値がnullでないか確認したい | $user['name'] |
| フォームの値が送信されたか確認したい | $_POST['email'] |
| GETパラメータがあるか確認したい | $_GET['id'] |
| セッション情報があるか確認したい | $_SESSION['user_id'] |
| オブジェクトのプロパティがnullでないか確認したい | $user->name |
isset以外を使ったほうがよい場面
一方で、次のような場合はisset()以外の方法を使ったほうが適切です。
| やりたいこと | 適した方法 |
|---|---|
| 配列キーの存在だけを確認したい | array_key_exists() |
| オブジェクトのプロパティの存在だけを確認したい | property_exists() |
| 値が空かどうか確認したい | empty()や厳密比較 |
| 入力値の形式を確認したい | filter_var()など |
| HTML出力を安全にしたい | htmlspecialchars() |
| SQLに安全に値を渡したい | プリペアドステートメント |
まとめ
issetは定義済みかつnullでないかを確認するもの
isset()は、PHPで非常によく使われる基本的な構文です。
主な役割は、変数や配列キー、オブジェクトのプロパティが存在していて、なおかつ値がnullではないかを確認することです。
重要なポイントは次の通りです。
| ポイント | 内容 |
|---|---|
| 役割 | 変数などがセットされていて、nullでないか確認する |
| 戻り値 | trueまたはfalse |
| 未定義の変数 | false |
null | false |
| 空文字 | true |
0 | true |
false | true |
| 空配列 | true |
| 複数指定 | すべてセットされていてnullでなければtrue |
| 配列キーの存在だけを確認したい場合 | array_key_exists()を使う |
| PHP 7以降の初期値設定 | ??が便利 |
isset()は、未定義の変数や配列キーにアクセスする前の確認として非常に便利です。
ただし、isset()だけでは、値が空かどうか、正しい形式かどうか、安全かどうかまでは判断できません。
実務では、次のように他の処理と組み合わせて使うことが大切です。
isset()や??で値の存在を確認する
trim()で不要な空白を削除する
filter_var()などで形式を確認する
htmlspecialchars()で安全に出力する
SQLではプリペアドステートメントを使う
つまり、isset()は「値を安全に扱うための入口」として使うものです。
フォーム処理、配列操作、セッション確認、GET・POSTパラメータの取得など、PHPの基本的な場面でよく使うため、正しく理解しておくとコードの安全性と読みやすさが高まります。
以上、PHPのisset関数の使い方についてでした。
最後までお読みいただき、ありがとうございました。









