Materi 01

Apa itu PHP?

PHP (PHP: Hypertext Preprocessor) adalah bahasa pemrograman yang berjalan di server. Hasilnya dikirim ke browser pengunjung sebagai HTML biasa.

Alur kerja

  1. Pengunjung buka halaman.php di browser.
  2. Request dikirim ke server.
  3. Server menjalankan code PHP di file tersebut.
  4. Hasilnya (biasanya HTML) dikirim balik ke browser.
  5. 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.
Siapa yang pakai PHP? Facebook (sebagian besar), WordPress, Wikipedia, Mailchimp, Slack (sebagian). PHP adalah salah satu bahasa paling banyak dipakai di web.
Materi 02

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)

  1. Download XAMPP dari apachefriends.org.
  2. Install dengan klik Next-Next-Finish.
  3. Buka XAMPP Control Panel, klik "Start" pada Apache (dan MySQL kalau butuh database).
  4. File PHP disimpan di folder C:\xampp\htdocs\ (Windows) atau /Applications/XAMPP/htdocs/ (Mac).
  5. 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:

test.php
<?php
phpinfo();
?>

Buka http://localhost/test.php. Kalau muncul halaman info PHP warna ungu, berarti berhasil!

Jangan double-click file PHP! Kalau kamu cuma double-click file .php seperti HTML, dia akan terbuka sebagai teks — bukan dijalankan. PHP wajib diakses lewat http://localhost/... agar server bisa memprosesnya.
Materi 03

Sintaks dasar PHP

Code PHP diapit tag <?php ... ?>. Semua yang di luar tag itu dianggap HTML biasa.

halo.php
<!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>
Hasil di browser

Halo dari PHP!

Selamat datang, Budi

Aturan penting

  • Setiap perintah diakhiri titik koma (;).
  • Variabel diawali dengan $.
  • PHP case-sensitive untuk variabel ($nama dan $Nama beda).
  • Tapi PHP tidak case-sensitive untuk keyword (echo dan ECHO sama).

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.
Materi 04

Variabel & tipe data

Variabel di PHP selalu diawali $. Tipe data tidak perlu dideklarasikan — PHP otomatis menentukan.

variabel.php
<?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 (+).

gabung-string.php
<?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}";
?>
Double vs single quote "Halo $nama" → variabel diganti nilainya.
'Halo $nama' → tidak, ditulis apa adanya.
Gunakan single quote kalau tidak perlu interpolasi — sedikit lebih cepat.
Materi 05

Kondisi & perulangan

Sintaks PHP mirip dengan JavaScript. Kalau kamu sudah belajar JS, di sini hanya tinggal membiasakan $ di depan variabel.

if / else

kondisi.php
<?php
$nilai = 78;

if ($nilai >= 90) {
    echo "A";
} elseif ($nilai >= 75) {
    echo "B";
} elseif ($nilai >= 60) {
    echo "C";
} else {
    echo "D";
}
// Output: B
?>

for

for.php
<?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)

foreach.php
<?php
$buah = ["apel", "mangga", "jeruk"];

foreach ($buah as $item) {
    echo "Saya suka $item <br>";
}
?>

while

while.php
<?php
$i = 1;
while ($i <= 5) {
    echo $i . " ";
    $i++;
}
// Output: 1 2 3 4 5
?>
Materi 06

Array di PHP

PHP punya dua jenis array:

1. Indexed array (akses pakai angka)

indexed.php
<?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)

associative.php
<?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>";
}
?>
Output contoh 2
nama: Ani
umur: 22
email: ani@contoh.com
kota: Surabaya
Materi 07

Fungsi

Fungsi didefinisikan dengan keyword function.

fungsi.php
<?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)

type-hint.php
<?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!
?>
Built-in function PHP PHP punya ratusan fungsi bawaan. Contoh: 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.
Materi 08

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

kontak.php
<!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

FungsiKegunaan
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
Keamanan adalah kunci Jangan pernah langsung pakai $_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

cari.php
<?php
// URL: cari.php?q=laptop&kategori=elektronik
$query = $_GET["q"] ?? "";
$kategori = $_GET["kategori"] ?? "semua";

echo "Kamu cari: $query <br>";
echo "Di kategori: $kategori";
?>
Operator ?? (null coalescing) $_GET["q"] ?? "" artinya: "ambil $_GET['q'], kalau tidak ada pakai string kosong". Cegah error kalau parameter tidak dikirim.
Materi 09

Include file — memecah kode

Saat project bertambah besar, memecah kode jadi beberapa file sangat membantu. Pakai include atau require untuk menyisipkan file PHP lain.

PerintahKalau file tidak ditemukan
includeWarning, tapi program lanjut
requireError fatal, program berhenti
include_onceSama dengan include, tapi cegah include dua kali
require_onceSama 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.

header.php
<!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.php
  <footer>
    <p>&copy; 2026 Website Saya</p>
  </footer>
</body>
</html>
index.php
<?php include "header.php"; ?>

<main>
  <h1>Halaman Utama</h1>
  <p>Selamat datang!</p>
</main>

<?php include "footer.php"; ?>
Keuntungan include Kalau suatu saat mau ubah menu navigasi, cukup edit header.php sekali — semua halaman yang meng-include-nya otomatis ikut berubah. Ini prinsip DRY (Don't Repeat Yourself).
Materi 10

Database — pengantar MySQL

Untuk menyimpan data permanen (bukan cuma di session satu kali), kita pakai database. MySQL adalah pasangan klasik PHP.

Koneksi ke database

db.php
<?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)

tampil-data.php
<?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

simpan.php
<?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!";
}
?>
Selalu pakai prepared statement! Jangan pernah langsung menyisipkan variabel ke query SQL seperti: "INSERT ... VALUES ('$nama')". Ini rentan SQL injection — hacker bisa merusak atau mencuri database-mu. Prepared statement (dengan :nama atau ?) otomatis aman.
Belajar database lebih dalam Bagian ini baru pengantar. Topik database (MySQL, SQL) sangat luas — ada SELECT, INSERT, UPDATE, DELETE, JOIN, INDEX, dll. Setelah paham PHP dasar, pelajari MySQL dan SQL — ini kombinasi yang sangat powerful.
Kuis Cepat

Variabel di PHP selalu diawali dengan karakter apa?

Latihan Akhir

Form kontak yang aman

Buat form kontak lengkap: terima input, validasi, tampilkan hasil dengan aman, simpan ke file teks.

Tugas

Ketentuan

  1. Form dengan 3 field: nama, email, pesan.
  2. Validasi: semua wajib diisi, email harus valid, nama minimal 3 huruf.
  3. Jika ada error, tampilkan pesan error di atas form.
  4. Jika sukses, tampilkan "Terima kasih, [nama]!" dan simpan pesan ke file pesan.txt.
  5. Setelah submit, form tetap terlihat agar bisa kirim lagi.
Lihat contoh jawaban
kontak.php
<?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>
Perhatikan - <?= ... ?> 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.
Cheatsheet

Ringkasan PHP

SintaksFungsi
<?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