PHP — bahasa di server.
HTML, CSS, JavaScript berjalan di browser pengunjung. PHP berbeda — dia berjalan di server. Inilah yang memungkinkan website mengingat data, memproses form, membuat sistem login, dan terhubung ke database.
Apa itu PHP?
PHP (PHP: Hypertext Preprocessor) adalah bahasa pemrograman yang berjalan di server. Hasilnya dikirim ke browser pengunjung sebagai HTML biasa.
Alur kerja
- Pengunjung buka
halaman.phpdi browser. - Request dikirim ke server.
- Server menjalankan code PHP di file tersebut.
- Hasilnya (biasanya HTML) dikirim balik ke browser.
- Pengunjung melihat halaman — mereka tidak pernah tahu ada PHP di belakangnya.
Bisa apa saja dengan PHP?
- Memproses form kontak, mengirim email.
- Membuat sistem login dan registrasi user.
- Simpan dan ambil data dari database (MySQL).
- Upload file, manipulasi gambar.
- Membuat CMS seperti WordPress (yang memang dibangun pakai PHP).
- Membuat API yang diakses aplikasi mobile.
Setup lingkungan PHP
Tidak seperti HTML/CSS/JS yang cukup double-click file-nya, PHP butuh web server untuk berjalan. Cara termudah untuk setup di komputer lokal:
Pilihan 1: XAMPP (paling populer)
- Download XAMPP dari apachefriends.org.
- Install dengan klik Next-Next-Finish.
- Buka XAMPP Control Panel, klik "Start" pada Apache (dan MySQL kalau butuh database).
- File PHP disimpan di folder
C:\xampp\htdocs\(Windows) atau/Applications/XAMPP/htdocs/(Mac). - Akses di browser:
http://localhost/nama-folder/file.php
Pilihan 2: Laragon (rekomendasi untuk Windows)
Lebih ringan dan modern. Download dari laragon.org, lalu start.
Test instalasi
Buat file test.php di folder htdocs, isi:
<?php
phpinfo();
?>
Buka http://localhost/test.php. Kalau muncul halaman info PHP warna ungu, berarti berhasil!
.php seperti HTML, dia akan terbuka sebagai teks — bukan dijalankan. PHP wajib diakses lewat http://localhost/... agar server bisa memprosesnya.
Sintaks dasar PHP
Code PHP diapit tag <?php ... ?>. Semua yang di luar tag itu dianggap HTML biasa.
<!DOCTYPE html>
<html>
<body>
<h1>
<?php echo "Halo dari PHP!"; ?>
</h1>
<?php
// Komentar satu baris
# Juga komentar satu baris
/*
Komentar
banyak baris
*/
$nama = "Budi";
echo "<p>Selamat datang, $nama</p>";
?>
</body>
</html>
Halo dari PHP!
Selamat datang, Budi
Aturan penting
- Setiap perintah diakhiri titik koma (
;). - Variabel diawali dengan
$. - PHP case-sensitive untuk variabel (
$namadan$Namabeda). - Tapi PHP tidak case-sensitive untuk keyword (
echodanECHOsama).
Perintah output
echo "teks";— cetak teks ke halaman.print "teks";— sama dengan echo, tapi bisa return nilai.var_dump($x);— cetak variabel lengkap dengan tipenya (untuk debugging).print_r($arr);— cetak array dengan rapi.
Variabel & tipe data
Variabel di PHP selalu diawali $. Tipe data tidak perlu dideklarasikan — PHP otomatis menentukan.
<?php
$nama = "Ani"; // String
$umur = 25; // Integer
$tinggi = 165.5; // Float
$sudahLulus = true; // Boolean
$nilai = null; // Null
echo $nama; // Ani
echo "<br>";
echo $umur; // 25
?>
Menggabung string
Di PHP, pakai titik (.) untuk gabung string, BUKAN tambah (+).
<?php
$nama = "Budi";
$umur = 20;
// Cara 1: concatenation dengan titik
echo "Nama: " . $nama . ", Umur: " . $umur;
// Cara 2: interpolation (hanya dengan double quote)
echo "Nama: $nama, Umur: $umur";
// Cara 3: dengan kurung kurawal (lebih jelas)
echo "Nama: {$nama}, Umur: {$umur}";
?>
"Halo $nama" → variabel diganti nilainya.'Halo $nama' → tidak, ditulis apa adanya.Gunakan single quote kalau tidak perlu interpolasi — sedikit lebih cepat.
Kondisi & perulangan
Sintaks PHP mirip dengan JavaScript. Kalau kamu sudah belajar JS, di sini hanya tinggal membiasakan $ di depan variabel.
if / else
<?php
$nilai = 78;
if ($nilai >= 90) {
echo "A";
} elseif ($nilai >= 75) {
echo "B";
} elseif ($nilai >= 60) {
echo "C";
} else {
echo "D";
}
// Output: B
?>
for
<?php
for ($i = 1; $i <= 5; $i++) {
echo "Angka: $i <br>";
}
// Output:
// Angka: 1
// Angka: 2
// Angka: 3
// Angka: 4
// Angka: 5
?>
foreach (untuk array)
<?php
$buah = ["apel", "mangga", "jeruk"];
foreach ($buah as $item) {
echo "Saya suka $item <br>";
}
?>
while
<?php
$i = 1;
while ($i <= 5) {
echo $i . " ";
$i++;
}
// Output: 1 2 3 4 5
?>
Array di PHP
PHP punya dua jenis array:
1. Indexed array (akses pakai angka)
<?php
// Cara modern
$buah = ["apel", "mangga", "jeruk"];
// Cara lama (masih jalan)
$buah = array("apel", "mangga", "jeruk");
echo $buah[0]; // apel
echo count($buah); // 3
$buah[] = "pisang"; // tambah di akhir
?>
2. Associative array (akses pakai key)
<?php
$user = [
"nama" => "Ani",
"umur" => 22,
"email" => "ani@contoh.com"
];
echo $user["nama"]; // Ani
echo $user["umur"]; // 22
// Tambah data
$user["kota"] = "Surabaya";
// Loop dengan key & value
foreach ($user as $key => $value) {
echo "$key: $value <br>";
}
?>
umur: 22
email: ani@contoh.com
kota: Surabaya
Fungsi
Fungsi didefinisikan dengan keyword function.
<?php
// Fungsi tanpa parameter
function sapa() {
echo "Halo!";
}
// Fungsi dengan parameter & return
function tambah($a, $b) {
return $a + $b;
}
// Parameter default
function sapaNama($nama = "Teman") {
return "Halo, $nama!";
}
// Pakai
sapa(); // Halo!
echo tambah(3, 5); // 8
echo sapaNama(); // Halo, Teman!
echo sapaNama("Budi"); // Halo, Budi!
?>
Type hinting (opsional tapi disarankan)
<?php
// Tentukan tipe parameter & return
function tambah(int $a, int $b): int {
return $a + $b;
}
echo tambah(3, 5); // 8
// echo tambah("a", 5); // error!
?>
strlen($s) (panjang string), strtoupper($s) (jadi kapital), date("Y-m-d") (tanggal hari ini), count($arr) (jumlah elemen array). Cari di PHP Manual kalau butuh.
Menerima data dari form
Inilah kekuatan utama PHP: memproses data yang dikirim dari form HTML.
Dua cara kirim data
$_POST— data tersembunyi, untuk form kirim (login, registrasi, pesan).$_GET— data di URL, untuk pencarian atau filter.
Contoh lengkap: form kontak
<!DOCTYPE html>
<html>
<body>
<h1>Form Kontak</h1>
<form method="POST" action="kontak.php">
<label>Nama:</label>
<input type="text" name="nama" required>
<label>Email:</label>
<input type="email" name="email" required>
<label>Pesan:</label>
<textarea name="pesan" required></textarea>
<button type="submit">Kirim</button>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// Ambil & bersihkan input
$nama = htmlspecialchars(trim($_POST["nama"]));
$email = htmlspecialchars(trim($_POST["email"]));
$pesan = htmlspecialchars(trim($_POST["pesan"]));
// Validasi
if (empty($nama) || empty($email) || empty($pesan)) {
echo "<p style='color:red'>
Semua field wajib diisi!
</p>";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "<p style='color:red'>
Email tidak valid!
</p>";
} else {
// Data valid — simpan atau kirim email
echo "<h2>Terima kasih, $nama!</h2>";
echo "<p>Pesan kamu sudah diterima.</p>";
}
}
?>
</body>
</html>
Fungsi keamanan penting
| Fungsi | Kegunaan |
|---|---|
htmlspecialchars() | Ubah karakter HTML (<, >, ") jadi aman — mencegah XSS |
trim() | Hapus spasi di awal & akhir |
empty() | Cek apakah kosong |
filter_var(..., FILTER_VALIDATE_EMAIL) | Validasi format email |
$_POST atau $_GET tanpa dibersihkan. Selalu:1.
trim() untuk hilangkan spasi.2.
htmlspecialchars() untuk mencegah XSS.3. Validasi format (email, angka, dsb).
4. Pakai prepared statement saat menyimpan ke database.
$_GET dari URL
<?php
// URL: cari.php?q=laptop&kategori=elektronik
$query = $_GET["q"] ?? "";
$kategori = $_GET["kategori"] ?? "semua";
echo "Kamu cari: $query <br>";
echo "Di kategori: $kategori";
?>
$_GET["q"] ?? "" artinya: "ambil $_GET['q'], kalau tidak ada pakai string kosong". Cegah error kalau parameter tidak dikirim.
Include file — memecah kode
Saat project bertambah besar, memecah kode jadi beberapa file sangat membantu. Pakai include atau require untuk menyisipkan file PHP lain.
| Perintah | Kalau file tidak ditemukan |
|---|---|
include | Warning, tapi program lanjut |
require | Error fatal, program berhenti |
include_once | Sama dengan include, tapi cegah include dua kali |
require_once | Sama dengan require, tapi cegah include dua kali |
Contoh: struktur halaman
Bayangkan sebuah website punya 5 halaman, semuanya punya header dan footer yang sama. Tanpa include, kamu harus copy-paste 5 kali. Dengan include, cukup satu file.
<!DOCTYPE html>
<html>
<head>
<title>Website Saya</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
<a href="index.php">Home</a>
<a href="tentang.php">Tentang</a>
<a href="kontak.php">Kontak</a>
</nav>
<footer>
<p>© 2026 Website Saya</p>
</footer>
</body>
</html>
<?php include "header.php"; ?>
<main>
<h1>Halaman Utama</h1>
<p>Selamat datang!</p>
</main>
<?php include "footer.php"; ?>
header.php sekali — semua halaman yang meng-include-nya otomatis ikut berubah. Ini prinsip DRY (Don't Repeat Yourself).
Database — pengantar MySQL
Untuk menyimpan data permanen (bukan cuma di session satu kali), kita pakai database. MySQL adalah pasangan klasik PHP.
Koneksi ke database
<?php
$host = "localhost";
$user = "root";
$pass = "";
$db = "nama_database";
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$db;charset=utf8mb4",
$user,
$pass
);
$pdo->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
} catch (PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
?>
Ambil data (SELECT)
<?php
require "db.php";
$sql = "SELECT * FROM users ORDER BY id DESC";
$stmt = $pdo->query($sql);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo "<p>{$user['nama']} - {$user['email']}</p>";
}
?>
Simpan data (INSERT) — pakai prepared statement
<?php
require "db.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$nama = trim($_POST["nama"]);
$email = trim($_POST["email"]);
// Prepared statement — aman dari SQL injection
$sql = "INSERT INTO users (nama, email)
VALUES (:nama, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
":nama" => $nama,
":email" => $email
]);
echo "Data berhasil disimpan!";
}
?>
"INSERT ... VALUES ('$nama')". Ini rentan SQL injection — hacker bisa merusak atau mencuri database-mu. Prepared statement (dengan :nama atau ?) otomatis aman.
Variabel di PHP selalu diawali dengan karakter apa?
Form kontak yang aman
Buat form kontak lengkap: terima input, validasi, tampilkan hasil dengan aman, simpan ke file teks.
Ketentuan
- Form dengan 3 field: nama, email, pesan.
- Validasi: semua wajib diisi, email harus valid, nama minimal 3 huruf.
- Jika ada error, tampilkan pesan error di atas form.
- Jika sukses, tampilkan "Terima kasih, [nama]!" dan simpan pesan ke file
pesan.txt. - Setelah submit, form tetap terlihat agar bisa kirim lagi.
Lihat contoh jawaban
<?php
$errors = [];
$sukses = false;
$nama = $email = $pesan = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$nama = trim($_POST["nama"] ?? "");
$email = trim($_POST["email"] ?? "");
$pesan = trim($_POST["pesan"] ?? "");
if (strlen($nama) < 3) {
$errors[] = "Nama minimal 3 huruf.";
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Email tidak valid.";
}
if (empty($pesan)) {
$errors[] = "Pesan wajib diisi.";
}
if (empty($errors)) {
// Simpan ke file
$waktu = date("Y-m-d H:i:s");
$baris = "[$waktu] $nama ($email): $pesan\n";
file_put_contents("pesan.txt", $baris, FILE_APPEND);
$sukses = true;
$nama = $email = $pesan = "";
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Form Kontak</title>
<style>
body { font-family: Arial; max-width: 500px;
margin: 2rem auto; padding: 1rem; }
input, textarea { width: 100%; padding: 8px;
margin: 5px 0 15px; }
button { padding: 10px 20px; background: #e8632d;
color: white; border: none; cursor: pointer; }
.error { background: #fde0e0; color: #c00;
padding: 10px; border-radius: 6px; }
.ok { background: #dcf0d8; color: #080;
padding: 10px; border-radius: 6px; }
</style>
</head>
<body>
<h1>Kontak Kami</h1>
<?php if (!empty($errors)): ?>
<div class="error">
<strong>Ada yang perlu diperbaiki:</strong>
<ul>
<?php foreach ($errors as $e): ?>
<li><?= htmlspecialchars($e) ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<?php if ($sukses): ?>
<div class="ok">
Terima kasih! Pesan kamu sudah tersimpan.
</div>
<?php endif; ?>
<form method="POST">
<label>Nama:</label>
<input type="text" name="nama"
value="<?= htmlspecialchars($nama) ?>">
<label>Email:</label>
<input type="email" name="email"
value="<?= htmlspecialchars($email) ?>">
<label>Pesan:</label>
<textarea name="pesan" rows="5"><?=
htmlspecialchars($pesan)
?></textarea>
<button type="submit">Kirim</button>
</form>
</body>
</html>
<?= ... ?> adalah singkatan dari <?php echo ... ?>.- Input
value="..." diisi nilai sebelumnya agar user tidak perlu mengetik ulang kalau ada error.-
file_put_contents dengan FILE_APPEND menambah baris baru tanpa menghapus data lama.
Ringkasan PHP
| Sintaks | Fungsi |
|---|---|
<?php ... ?> | Tag buka/tutup PHP |
<?= $x ?> | Singkatan echo |
$nama = "Budi"; | Variabel |
echo "Halo"; | Cetak ke halaman |
var_dump($x); | Debug variabel |
if (...) { } elseif { } else { } | Kondisi |
for ($i=0; $i<5; $i++) { } | Loop |
foreach ($arr as $item) { } | Loop array |
foreach ($arr as $k => $v) { } | Loop dengan key |
function nama($p) { return $p; } | Fungsi |
$_POST["nama"] | Data POST |
$_GET["nama"] | Data GET |
htmlspecialchars($x) | Amankan output |
trim($x) | Hapus spasi |
filter_var(..., FILTER_VALIDATE_EMAIL) | Cek email |
include "file.php"; | Sisipkan file |
require "file.php"; | Sisipkan (wajib) |
session_start(); | Mulai session |
$_SESSION["nama"] = ... | Simpan session |
date("Y-m-d") | Tanggal hari ini |
count($arr) | Jumlah elemen array |
strlen($s) | Panjang string |
file_put_contents(...) | Tulis ke file |