PHPのisset関数の使い方について

採用はこちら

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は問題ありませんが、$emailnullなので、全体として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)

0nullではないため、isset($number)trueです。

falseもtrueになる

真偽値のfalseも、isset()ではtrueになります。

$flag = false;

var_dump(isset($flag));

実行結果は次の通りです。

bool(true)

falsenullとは異なる値です。

そのため、isset($flag)trueになります。

空配列もtrueになる

空配列も、isset()ではtrueになります。

$items = [];

var_dump(isset($items));

実行結果は次の通りです。

bool(true)

空配列はnullではありません。

そのため、isset($items)trueになります。

issetで注意したい値の一覧

issetの判定結果

isset()の判定結果を整理すると、次のようになります。

issetの結果
未定義の変数false
nullfalse
'' 空文字true
0true
'0'true
falsetrue
[] 空配列true
'abc'true
123true

特に注意したいのは、空文字、0false、空配列が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の結果
未定義の変数falsetrue
nullfalsetrue
'' 空文字truetrue
0truetrue
'0'truetrue
falsetruetrue
[] 空配列truetrue
'abc'truefalse
123truefalse

簡単に言うと、次のように使い分けます。

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の比較表

状態issetarray_key_exists
キーが存在し、値が文字列truetrue
キーが存在し、値が0truetrue
キーが存在し、値がfalsetruetrue
キーが存在し、値がnullfalsetrue
キーが存在しないfalsefalse

使い分けは次の通りです。

値が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
nullfalse
空文字true
0true
falsetrue
空配列true
複数指定すべてセットされていてnullでなければtrue
配列キーの存在だけを確認したい場合array_key_exists()を使う
PHP 7以降の初期値設定??が便利

isset()は、未定義の変数や配列キーにアクセスする前の確認として非常に便利です。

ただし、isset()だけでは、値が空かどうか、正しい形式かどうか、安全かどうかまでは判断できません。

実務では、次のように他の処理と組み合わせて使うことが大切です。

isset()や??で値の存在を確認する
trim()で不要な空白を削除する
filter_var()などで形式を確認する
htmlspecialchars()で安全に出力する
SQLではプリペアドステートメントを使う

つまり、isset()は「値を安全に扱うための入口」として使うものです。

フォーム処理、配列操作、セッション確認、GET・POSTパラメータの取得など、PHPの基本的な場面でよく使うため、正しく理解しておくとコードの安全性と読みやすさが高まります。

以上、PHPのisset関数の使い方についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次