Cara Mengatasi Undefined Array Key di PHP

Undefined array key muncul ketika kode PHP mencoba membaca key array yang belum ada. Jawaban cepatnya: cek key dengan isset() atau array_key_exists(), lalu beri nilai default menggunakan operator ?? sebelum data dipakai.

Error ini sering muncul saat membaca data dari $_GET, $_POST, $_SESSION, $_FILES, atau hasil query database. Untuk pemula, error ini bukan berarti PHP rusak. Biasanya PHP hanya memberi tahu bahwa nama key yang kamu panggil tidak tersedia pada request saat itu.

Contoh Error yang Sering Muncul

Misalnya kamu punya form login:

<form method="POST" action="login.php">
    <input type="text" name="username">
    <button type="submit">Login</button>
</form>

Lalu di login.php kamu menulis:

<?php
$username = $_POST['username'];
$password = $_POST['password'];

echo "Username: " . $username;

Kode di atas bisa menghasilkan:

Warning: Undefined array key "password"

Penyebabnya sederhana: form hanya mengirim username, tetapi PHP diminta membaca $_POST['password']. Key password tidak pernah dikirim, jadi PHP memberi warning.

Penyebab Utama Undefined Array Key

Ada beberapa penyebab yang paling umum.

PenyebabContoh
Nama input form berbedaHTML memakai name="email", PHP membaca $_POST['username']
Request belum dikirimHalaman dibuka langsung dengan GET, tetapi PHP membaca $_POST
Parameter URL tidak adaKode membaca $_GET['id'], URL tidak punya ?id=...
Session belum disetKode membaca $_SESSION['user_id'] sebelum login
Upload file gagalKode membaca $_FILES['foto'], tetapi form tidak punya enctype
Hasil database kosongKode membaca $user['nama'], padahal $user kosong

Solusi Cepat dengan Null Coalescing

Cara paling praktis untuk kasus umum adalah operator ??.

<?php
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

if ($username === '' || $password === '') {
    echo "Username dan password wajib diisi.";
    exit;
}

echo "Login diproses untuk: " . htmlspecialchars($username);

Artinya: jika $_POST['username'] ada, pakai nilainya. Jika tidak ada, pakai string kosong.

Operator ini sangat cocok untuk mengambil input opsional dari form, query string, atau session.

<?php
$keyword = $_GET['q'] ?? '';
$halaman = (int) ($_GET['page'] ?? 1);
$userId = $_SESSION['user_id'] ?? null;

Solusi dengan isset()

Gunakan isset() ketika kamu ingin menjalankan kode hanya jika key tersedia dan nilainya bukan null.

<?php
if (isset($_GET['id'])) {
    $id = (int) $_GET['id'];
    echo "Menampilkan data dengan ID: " . $id;
} else {
    echo "ID tidak ditemukan di URL.";
}

Contoh URL yang benar:

detail.php?id=15

Jika user membuka detail.php tanpa ?id=15, kode tetap aman karena kamu sudah mengecek key lebih dulu.

Solusi dengan array_key_exists()

array_key_exists() berguna ketika key mungkin ada tetapi nilainya null.

<?php
$data = [
    'nama' => 'Budi',
    'catatan' => null,
];

if (array_key_exists('catatan', $data)) {
    echo "Key catatan ada, walaupun nilainya null.";
}

Untuk form harian, isset() dan ?? biasanya cukup. Gunakan array_key_exists() saat kamu benar-benar perlu membedakan antara "key tidak ada" dan "key ada tetapi nilainya null".

Contoh Benar untuk Form POST

Pola aman untuk form adalah mengecek method request lebih dulu.

<?php
$nama = '';
$email = '';
$errors = [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nama = trim($_POST['nama'] ?? '');
    $email = trim($_POST['email'] ?? '');

    if ($nama === '') {
        $errors[] = 'Nama wajib diisi.';
    }

    if ($email === '') {
        $errors[] = 'Email wajib diisi.';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = 'Format email tidak valid.';
    }
}
?>

<form method="POST">
    <input type="text" name="nama" value="<?= htmlspecialchars($nama) ?>">
    <input type="email" name="email" value="<?= htmlspecialchars($email) ?>">
    <button type="submit">Simpan</button>
</form>

Dengan pola ini, halaman tetap bisa dibuka pertama kali tanpa error. Data POST baru dibaca setelah form benar-benar dikirim.

Pelajari dasar pengambilan data form di Form Handling dengan PHP dan lanjutkan ke Validasi & Sanitasi Input.

Contoh Benar untuk Parameter URL

Misalnya halaman detail produk membutuhkan parameter id.

<?php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

if ($id === null || $id === false) {
    http_response_code(404);
    echo "Produk tidak ditemukan.";
    exit;
}

echo "Ambil produk dengan ID: " . $id;

Kode ini lebih aman daripada langsung membaca $_GET['id'], karena sekaligus memastikan nilainya angka.

Contoh Benar untuk Session

Undefined array key juga sering muncul setelah login karena key session belum dibuat.

<?php
session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

echo "User ID: " . $_SESSION['user_id'];

Jangan langsung menulis:

<?php
session_start();

echo $_SESSION['user_id']; // Bisa warning jika user belum login

Jika error kamu berhubungan dengan login, baca juga Session dan Autentikasi dan Kenapa Session PHP Tidak Tersimpan?.

Contoh Benar untuk Upload File

Untuk upload file, key $_FILES['foto'] hanya ada jika input file benar-benar dikirim.

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_FILES['foto'])) {
        echo "File foto belum dikirim.";
        exit;
    }

    if ($_FILES['foto']['error'] !== UPLOAD_ERR_OK) {
        echo "Upload gagal dengan kode error: " . $_FILES['foto']['error'];
        exit;
    }

    echo "File siap diproses: " . htmlspecialchars($_FILES['foto']['name']);
}

Pastikan form upload memakai enctype="multipart/form-data". Detailnya ada di Upload File dengan PHP.

Cara Debug yang Rapi

Saat bingung key apa saja yang tersedia, tampilkan array sementara di lingkungan development.

<?php
echo '<pre>';
var_dump($_POST);
echo '</pre>';

Untuk URL:

<?php
echo '<pre>';
var_dump($_GET);
echo '</pre>';

Jangan biarkan var_dump() tampil di production karena bisa membocorkan data sensitif. Untuk cara menangani error yang lebih aman, baca Error Handling.

Kesalahan yang Sering Terjadi

1. Nama name di HTML tidak sama dengan key di PHP

<input type="text" name="email">
<?php
echo $_POST['username']; // Salah, key yang dikirim adalah email

Samakan nama key:

<?php
$email = $_POST['email'] ?? '';

2. Membaca POST saat halaman baru dibuka

Halaman form pertama kali biasanya dibuka dengan GET. Jika kamu langsung membaca $_POST, key belum ada.

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nama = $_POST['nama'] ?? '';
}

3. Menganggap semua parameter URL selalu ada

User bisa menghapus query string dari URL. Selalu siapkan default atau tampilkan 404.

<?php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

4. Lupa session_start()

Tanpa session_start(), data $_SESSION tidak tersedia dengan benar.

<?php
session_start();
$userId = $_SESSION['user_id'] ?? null;

5. Menyembunyikan warning tanpa memperbaiki kode

Jangan memakai @$_POST['nama'] untuk menutup warning. Warning hilang, tetapi bug tetap ada. Perbaiki dengan pengecekan key.

FAQ

Apa beda Undefined array key dan Undefined index?

Keduanya mirip. Pada PHP versi lama, pesan yang umum adalah Undefined index. Pada PHP 8+, pesan yang sering muncul adalah Undefined array key.

Apakah warning ini berbahaya?

Warning ini tidak selalu menghentikan aplikasi, tetapi tetap harus diperbaiki. Jika dibiarkan, halaman bisa menampilkan data kosong, alur login gagal, atau informasi teknis terlihat oleh user.

Lebih baik pakai isset() atau ???

Untuk memberi nilai default, ?? lebih ringkas. Untuk percabangan yang lebih jelas, isset() nyaman dipakai.

Kenapa error muncul hanya saat halaman pertama kali dibuka?

Karena data form belum dikirim. Baca $_POST hanya setelah $_SERVER['REQUEST_METHOD'] === 'POST'.

Apakah boleh mematikan display_errors?

Di production, ya, tetapi itu bukan pengganti perbaikan kode. Di development, tampilkan error agar bug cepat terlihat. Pelajari pengaturannya di Error Handling.

Artikel Terkait