Membuat Website Pengelola Penerimaan Mahasiswa Baru (PMB) ITS dengan PHP Native dan MySQL

Pos ini merupakan dokumentasi pengerjaan tugas 8 pemrograman Web dalam pembuatan Website PMB dengan upload foto dengan PHP Native.

Website ini dibangun menggunakan bahasa pemrograman dasar berupa PHP, kemudian HTML dan library CSS (Tailwind) dengan DBMS MySQL. Website ini memiliki sistem autentikasi untuk masuk ke dalam portal pengelolaan data calon mahasiswa. Kemudian jika sudah masuk akun, maka pengelola bisa mengatur data calon mahasiswa ataupun menambahkannya. Selain itu bisa menambahkan foto untuk calon mahasiswanya Berikut adalah tampilan Website yang dibuat:

Login
Register
Daftar Calon Mahasiswa

Berikut langkah-langkah pembuatan website diatas:

Menyiapkan Aset Website

Aset dari website ini menggunakan background desain PMB yang ada pada salah satu feed instagram @its_campus.Gambar

  • Gambar
  • CSS
  • Javascript

Menuliskan Kode HTML

  • Login
<pre class="wp-block-syntaxhighlighter-code"><!DOCTYPE html>
<html :class="{ 'theme-dark': dark }" x-data="data()" lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>Portal PMB</title>

  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="<?= URL . 'assets/css/app.css' ?>" />

  <a href="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.2.1/dist/alpine.js">https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.2.1/dist/alpine.js</a>
  <a href="?=%20URL%20.%20'assets/js/app.js'%20?">?=%20URL%20.%20'assets/js/app.js'%20?</a>
</head>

<body>
  <div class="font-sans antialiased text-gray-900">
    <div class="flex items-center min-h-screen p-6 bg-gray-50 dark:bg-gray-900">
      <div class="flex-1 h-full max-w-4xl mx-auto overflow-hidden bg-white rounded-lg shadow-xl dark:bg-gray-800">
        <div class="flex flex-col overflow-y-auto md:flex-row">
          <div class="h-32 md:h-auto md:w-1/2">
            <img aria-hidden="true" class="object-cover w-full h-full" src="<?= URL . 'assets/img/bg-card' ?>.jpg" alt="Office" />
          </div>
          <div class="flex items-center justify-center p-6 sm:p-12 md:w-1/2">
            <div class="w-full">
              <h1 class="mb-4 text-xl font-semibold text-gray-700 dark:text-gray-200">
                Selamat Datang pada Portal Penerimaan Mahasiswa Baru ITS
              </h1>
              <form method="POST" action="">
                <label class="block text-sm">
                  <span class="block text-sm font-medium text-gray-700">Email address</span>
                  <div class="mt-1">
                    <input id="email" name="email" type="email" autocomplete="email" required="" class="
                      appearance-none
                      block
                      w-full
                      px-3
                      py-2
                      border border-gray-300
                      rounded-md
                      shadow-sm
                      placeholder-gray-400
                      focus:outline-none
                      focus:ring-sp-primary-400
                      focus:border-sp-primary-400
                      sm:text-sm
                    " />
                  </div>
                </label>
                <label class="block mt-4 text-sm">
                  <span class="block text-sm font-medium text-gray-700">Password</span>
                  <div class="mt-1">
                    <input id="password" name="password" type="password" autocomplete="current-password" required="" class="
                      appearance-none
                      block
                      w-full
                      px-3
                      py-2
                      border border-gray-300
                      rounded-md
                      shadow-sm
                      placeholder-gray-400
                      focus:outline-none
                      focus:ring-sp-primary-400
                      focus:border-sp-primary-400
                      sm:text-sm
                    " />
                  </div>
                </label>
                <div class="flex items-center mt-4">
                  <input id="remember_me" name="remember_me" type="checkbox" class="
                      h-4
                      w-4
                      text-sp-primary-400
                      focus:ring-sp-primary-400
                      border-gray-300
                      rounded
                    " />
                  <label for="remember_me" class="ml-2 block text-sm text-gray-900">
                    Ingat saya
                  </label>
                </div>
                <button type="submit" class="
                    w-full
                    flex
                    justify-center
                    py-2
                    px-4
                    border border-transparent
                    rounded-md
                    shadow-sm
                    text-sm
                    font-medium
                    text-white
                    bg-sp-primary-400
                    hover:bg-sp-primary-300
                    focus:outline-none
                    focus:ring-2
                    focus:ring-offset-2
                    focus:ring-sp-primary-400
                    mt-4
                  " name="login">
                  Masuk
                </button>
              </form>

              <p class="mt-4">
                <div class="text-sm">
                  <a href="/daftar" class="
                      font-medium
                      text-sp-primary-400
                      hover:text-sp-primary-300
                    ">
                    Belum punya Akun? Daftar
                  </a>
                </div>
              </p>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html></pre>
  • Register
<pre class="wp-block-syntaxhighlighter-code"><!DOCTYPE html>
<html :class="{ 'theme-dark': dark }" x-data="data()" lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>Portal PMB</title>

  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="<?= URL . 'assets/css/app.css' ?>" />

  <a href="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.2.1/dist/alpine.js">https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.2.1/dist/alpine.js</a>
  <a href="?=%20URL%20.%20'assets/js/app.js'%20?">?=%20URL%20.%20'assets/js/app.js'%20?</a>
</head>

<body>
  <div class="font-sans antialiased text-gray-900">
    <div class="flex items-center min-h-screen p-6 bg-gray-50 dark:bg-gray-900">
      <div class="flex-1 h-full max-w-4xl mx-auto overflow-hidden bg-white rounded-lg shadow-xl dark:bg-gray-800">
        <div class="flex flex-col overflow-y-auto md:flex-row">
          <div class="h-32 md:h-auto md:w-1/2">
            <img aria-hidden="true" class="object-cover w-full h-full" src="<?= URL . 'assets/img/bg-card' ?>.jpg" alt="Office" />
          </div>
          <div class="flex items-center justify-center p-6 sm:p-12 md:w-1/2">
            <div class="w-full">
              <h1 class="mb-4 text-xl font-semibold text-gray-700 dark:text-gray-200">
                Selamat Datang pada Portal Penerimaan Mahasiswa Baru ITS
              </h1>
              <form method="POST" action="">
                <label class="block text-sm">
                  <span class="block text-sm font-medium text-gray-700">Nama</span>
                  <div class="mt-1">
                    <input id="name" name="name" type="text" required class="
                      appearance-none
                      block
                      w-full
                      px-3
                      py-2
                      border border-gray-300
                      rounded-md
                      shadow-sm
                      placeholder-gray-400
                      focus:outline-none
                      focus:ring-sp-primary-400
                      focus:border-sp-primary-400
                      sm:text-sm
                    " />
                  </div>
                </label>
                <label class="block mt-4 text-sm">
                  <span class="block text-sm font-medium text-gray-700">Email</span>
                  <div class="mt-1">
                    <input id="email" name="email" type="email" autocomplete="email" required class="
                      appearance-none
                      block
                      w-full
                      px-3
                      py-2
                      border border-gray-300
                      rounded-md
                      shadow-sm
                      placeholder-gray-400
                      focus:outline-none
                      focus:ring-sp-primary-400
                      focus:border-sp-primary-400
                      sm:text-sm
                    " />
                  </div>
                </label>
                <label class="block mt-4 text-sm">
                  <span class="block text-sm font-medium text-gray-700">Password</span>
                  <div class="mt-1">
                    <input id="password" name="password" type="password" required class="
                      appearance-none
                      block
                      w-full
                      px-3
                      py-2
                      border border-gray-300
                      rounded-md
                      shadow-sm
                      placeholder-gray-400
                      focus:outline-none
                      focus:ring-sp-primary-400
                      focus:border-sp-primary-400
                      sm:text-sm
                    " />
                  </div>
                </label>
                <label class="block mt-4 text-sm">
                  <span class="block text-sm font-medium text-gray-700">
                    Konfirmasi password
                  </span>
                  <div class="mt-1">
                    <input id="password_confirmation" name="password_confirmation" type="password" required class="
                      appearance-none
                      block
                      w-full
                      px-3
                      py-2
                      border border-gray-300
                      rounded-md
                      shadow-sm
                      placeholder-gray-400
                      focus:outline-none
                      focus:ring-sp-primary-400
                      focus:border-sp-primary-400
                      sm:text-sm
                    " />
                  </div>
                </label>
                <button type="submit" class="
                    mt-6
                    w-full
                    flex
                    justify-center
                    py-2
                    px-4
                    border border-transparent
                    rounded-md
                    shadow-sm
                    text-sm
                    font-medium
                    text-white
                    bg-sp-primary-400
                    hover:bg-sp-primary-300
                    focus:outline-none
                    focus:ring-2
                    focus:ring-offset-2
                    focus:ring-sp-primary-400
                  " name="register">
                  Daftar
                </button>
              </form>

              <p class="mt-4">
                <div class="text-sm">
                  <a href="/masuk" class="
                      font-medium
                      text-sp-primary-400
                      hover:text-sp-primary-300
                    ">
                    Sudah punya Akun? Masuk
                  </a>
                </div>
              </p>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html></pre>
  • Students
<!DOCTYPE html>
<html :class="{ 'theme-dark': dark }" x-data="data()" lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <title>Portal PMB</title>

  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="<?= URL . 'assets/css/tailwind.output.css' ?>" />
  <link rel="stylesheet" href="https://tailwindui.com/css/components-v2.css" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.css" />
  <link rel="stylesheet" href="<?= URL . 'assets/css/app.css' ?>" />

  <script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.min.js" defer></script>
  <script src="<?= URL . 'assets/js/init-alpine.js' ?>"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js" defer></script>
</head>

<body>
  <div class="flex h-screen bg-gray-50 dark:bg-gray-900" :class="{ 'overflow-hidden': isSideMenuOpen }">
    <div class="flex flex-col flex-1 w-full">

      <header class="flex z-10 py-4 bg-white shadow-md dark:bg-gray-800">
        <div
          class="container flex items-center justify-between h-full px-3 mx-auto text-sp-primary-400 dark:text-sp-primary-400">
          <button class="p-1 mr-5 -ml-1 rounded-md md:hidden focus:outline-none focus:shadow-outline-sp-primary"
            @click="toggleSideMenu" aria-label="Menu">
            <svg class="w-6 h-6" aria-hidden="true" fill="#A4D961" viewBox="0 0 20 20">
              <path fill-rule="evenodd"
                d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
                clip-rule="evenodd"></path>
            </svg>
          </button>
          <div class="flex justify-center flex-1 lg:mr-32">
            <div class="relative w-full max-w-xl mr-6 focus-within:text-sp-primary-400">
              <div class="absolute inset-y-0 flex items-center pl-2">
                <svg class="w-4 h-4" aria-hidden="true" fill="#6aaff1" viewBox="0 0 20 20">
                  <path fill-rule="evenodd"
                    d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
                    clip-rule="evenodd"></path>
                </svg>
              </div>
              <input
                class="w-full pl-8 pr-2 text-sm text-gray-700 placeholder-gray-600 bg-gray-100 border-0 rounded-md dark:placeholder-gray-500 dark:focus:shadow-outline-gray dark:focus:placeholder-gray-600 dark:bg-gray-700 dark:text-gray-200 focus:placeholder-gray-500 focus:bg-white focus:border-sp-primary-400 focus:outline-none focus:shadow-outline-sp-primary form-input"
                type="text" placeholder="Cari mahasiswa" aria-label="Search" />
            </div>
          </div>
          <ul class="flex items-center flex-shrink-0 space-x-6">
            <li class="relative z-10">
              <button class="align-middle rounded-full focus:shadow-outline-sp-primary focus:outline-none"
                @click="toggleProfileMenu" @keydown.escape="closeProfileMenu" aria-label="Account" aria-haspopup="true">
                <img class="object-cover w-8 h-8 rounded-full"
                  src="https://cdn1-production-images-kly.akamaized.net/NpSkxEAUZsogHK1-HG4KlurfdSM=/0x248:2423x1613/640x360/filters:quality(75):strip_icc():format(jpeg)/kly-media-production/medias/3412481/original/055674500_1616773504-115383249_m.jpeg"
                  alt="" aria-hidden="true" />
              </button>

              <template x-if="isProfileMenuOpen">
                <ul x-transition:leave="z-10 transition ease-in duration-150" x-transition:leave-start="opacity-100"
                  x-transition:leave-end="opacity-0" @click.away="closeProfileMenu" @keydown.escape="closeProfileMenu"
                  class="absolute right-0 w-56 p-2 mt-2 space-y-2 text-gray-600 bg-white border border-gray-100 rounded-md shadow-md dark:border-gray-700 dark:text-gray-400 dark:bg-gray-700"
                  aria-label="submenu">
                  <li class="flex mt-2">
                    <form method="POST" action="" class="inline-flex items-center w-full">
                      <input name="logout" type="hidden">

                      <a class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
                        href="#" onclick="event.preventDefault(); this.closest('form').submit();">
                        <svg class="w-4 h-4 mr-3" aria-hidden="true" fill="none" stroke-linecap="round"
                          stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="#6aaff1">
                          <path
                            d="M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1">
                          </path>
                        </svg>
                        <span>Keluar</span>
                      </a>
                    </form>
                  </li>
                </ul>
              </template>

            </li>
          </ul>
        </div>
      </header>

      <main class="h-full overflow-y-auto">
        <div class="container px-6 mx-auto grid">
          <h2 class="mt-6 text-3xl font-bold text-gray-900">
            Data Calon Mahasiswa
          </h2>
          <!-- CTA -->
          <a class="mt-6 flex items-center justify-between p-4 mb-8 text-sm font-semibold text-white bg-sp-primary-400 rounded-lg shadow-md focus:outline-none focus:shadow-outline-purple"
            href="#" id="add-student">
            <div class="flex items-center gap-2">
              <span><?php count($students); ?> Mahasiswa</span>
            </div>
            <span class="flex items-center gap-2">
              <p>Tambah Calon Mahasiswa</p>
              <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24"
                stroke="currentColor">
                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6" />
              </svg>
            </span>
          </a>

          <div class="w-full overflow-hidden rounded-lg shadow-xs">
            <div class="w-full overflow-x-auto">
              <table class="w-full whitespace-no-wrap">
                <thead>
                  <tr
                    class="text-xs font-semibold tracking-wide text-left text-gray-500 uppercase border-b dark:border-gray-700 bg-gray-50 dark:text-gray-400 dark:bg-gray-800">
                    <th class="px-4 py-3 w-2/12">Nama</th>
                    <th class="px-4 py-3 w-3/12">Alamat</th>
                    <th class="px-4 py-3 w-2/12">Agama</th>
                    <th class="px-4 py-3 w-2/12">Asal</th>
                    <th class="px-4 py-3 w-2/12">Departemen</th>
                    <th class="px-4 py-3 w-1/12">Aksi</th>
                  </tr>
                </thead>
                <tbody class="bg-white divide-y dark:divide-gray-700 dark:bg-gray-800">

                  <?php foreach ($students as $student) { ?>
                  <tr class="text-gray-700 dark:text-gray-400">
                    <td class="px-4 py-3">
                      <div class="flex items-center text-sm cursor-pointer">
                        <?php if ($student['photo'] != "") { ?>
                        <div class="relative hidden w-8 h-8 mr-3 rounded-full md:block text-center">
                          <img class="object-cover w-full h-full rounded-full" src="<?= $student['photo'] ?>" alt=""
                            loading="lazy" />
                          <div class="absolute inset-0 rounded-full shadow-inner" aria-hidden="true"></div>
                        </div>
                        <?php } else { ?>
                        <div class="flex items-center justify-center w-8 h-8 mr-3"><svg
                            xmlns="http://www.w3.org/2000/svg" class="w-8 h-8" fill="none" viewBox="0 0 24 24"
                            stroke="currentColor">
                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
                              d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
                          </svg>
                        </div>
                        <?php } ?>
                        <div>
                          <p class="font-semibold"><?= $student['name'] ?></p>
                          <p class="text-xs text-gray-600 dark:text-gray-400">
                            <?php if ($student['gender'] == 'L') { ?>
                            Laki-laki
                            <?php } else if ($student['gender'] == 'P') { ?>
                            Perempuan
                            <?php } ?>
                          </p>
                        </div>
                      </div>
                    </td>
                    <td class="px-4 py-3 text-sm">
                      <?= $student['address'] ?>
                    </td>
                    <td class="px-4 py-3 text-sm">
                      <?= $student['religion'] ?>
                    </td>
                    <td class="px-4 py-3 text-sm">
                      <?= $student['school'] ?>
                    </td>
                    <td class="px-4 py-3 text-sm">
                      <?= $student['department'] ?>
                    </td>
                    <td class="px-4 py-3 text-sm flex gap-3">
                      <button
                        class="bg-sp-primary-400 px-2 py-1 text-xs font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
                        type="button" id="update-student" data-id="<?= $student['student_id'] ?>">
                        <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24"
                          stroke="currentColor">
                          <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
                            d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
                        </svg>
                        </a>
                      </button>
                      <button
                        class="px-2 py-1 text-xs font-medium leading-5 text-white transition-colors duration-150 bg-red-600 border border-transparent rounded-lg active:bg-red-600 hover:bg-red-700 focus:outline-none focus:shadow-outline-red"
                        id="delete-student" data-id="<?= $student['student_id'] ?>">
                        <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24"
                          stroke="currentColor">
                          <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
                            d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
                        </svg>
                      </button>
                    </td>
                  </tr>

                  <div
                    class="fixed inset-0 z-30 hidden items-end bg-black bg-opacity-50 sm:items-center sm:justify-center"
                    id="modal-delete-student-<?= $student['student_id'] ?>">
                    <div
                      class="w-full px-6 py-4 overflow-hidden bg-white rounded-t-lg dark:bg-gray-800 sm:rounded-lg sm:m-4 sm:max-w-xl"
                      role="dialog" id="modal">
                      <header class="flex justify-end">
                        <button
                          class="inline-flex items-center justify-center w-6 h-6 text-gray-400 transition-colors duration-150 rounded dark:hover:text-gray-200 hover: hover:text-gray-700"
                          aria-label="close" id="modal-close-button" data-id="<?= $student['student_id'] ?>">
                          <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" role="img" aria-hidden="true">
                            <path
                              d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
                              clip-rule="evenodd" fill-rule="evenodd"></path>
                          </svg>
                        </button>
                      </header>

                      <div class="mt-4 mb-6">
                        <p class="mb-2 text-lg font-semibold text-gray-700 dark:text-gray-400">
                          Hapus data Calon Mahasiswa
                        </p>
                        <p class="text-sm text-gray-700 dark:text-gray-400">
                          Apakah Anda ingin menghapus data <?= $student['name'] ?>?
                        </p>
                      </div>

                      <footer
                        class="flex flex-col items-center justify-end gap-2 sm:flex-row bg-gray-50 dark:bg-gray-800">
                        <button id="modal-close-button" data-id="<?= $student['student_id'] ?>"
                          class="w-full px-5 py-3 text-sm font-medium leading-5 text-gray-700 transition-colors duration-150 border border-gray-400 rounded-lg dark:text-gray-400 sm:px-4 sm:py-2 sm:w-auto active:bg-transparent hover:border-gray-500 focus:border-gray-500 active:text-gray-500 focus:outline-none focus:shadow-outline-gray">
                          Batal
                        </button>

                        <form method="POST" action="">
                          <input type="hidden" name="student_id" value="<?= $student['student_id'] ?>">

                          <button name="delete_student"
                            class="w-full px-5 py-3 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-red-600 border border-transparent rounded-lg sm:w-auto sm:px-4 sm:py-2 active:bg-red-600 hover:bg-red-700 focus:outline-none focus:shadow-outline-red m-0">
                            Iya
                          </button>
                        </form>
                      </footer>
                    </div>
                  </div>

                  <div
                    class="fixed inset-0 z-30 hidden items-end bg-black bg-opacity-50 sm:items-center sm:justify-center"
                    id="modal-update-student-<?= $student['student_id'] ?>">
                    <div
                      class="w-full px-6 py-4 overflow-hidden bg-white rounded-t-lg dark:bg-gray-800 sm:rounded-lg sm:m-4 sm:max-w-xl"
                      role="dialog" id="modal">

                      <header class="flex justify-end">
                        <button
                          class="inline-flex items-center justify-center w-6 h-6 text-gray-400 transition-colors duration-150 rounded dark:hover:text-gray-200 hover: hover:text-gray-700"
                          aria-label="close" id="update-student-close" data-id="<?= $student['student_id'] ?>">
                          <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" role="img" aria-hidden="true">
                            <path
                              d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
                              clip-rule="evenodd" fill-rule="evenodd"></path>
                          </svg>
                        </button>
                      </header>

                      <div class="mt-4">

                        <p class="mb-2 text-lg font-semibold text-gray-700 dark:text-gray-400">
                          Edit Data Calon Mahasiswa
                        </p>

                        <form method="POST" action="" enctype="multipart/form-data">
                          <input type="hidden" name="student_id" value="<?= $student['student_id'] ?>">

                          <input type="hidden" name="photo_ori" value="<?= $student['photo'] ?>">

                          <label class="block mt-4 text-sm w-1/2" id="image-item">
                            <span class="text-gray-700 dark:text-gray-400" id="image-name">
                              Foto
                            </span>

                            <input id="image-place" type="file" name="photo" class="form-control hidden">
                            <img class="mt-1 mb-2" style="height: 75px; width: 50%; object-fit: cover;" id="image-preview" src="<?= $student['photo'] ?>">

                            <button
                              class="px-2 py-1 text-xs font-medium leading-5 text-white transition-colors duration-150 bg-sp-primary-400 border border-transparent rounded active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
                              id="insert-image" type="button">
                              Ubah Gambar
                            </button>
                          </label>

                          <label class="block mt-4 text-sm">
                            <span class="text-gray-700 dark:text-gray-400">
                              Nama
                            </span>
                            <input
                              class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                              name="name" value="<?= $student['name'] ?>" placeholder="Nama" required />
                          </label>

                          <label class="block mt-4 text-sm">
                            <span class="text-gray-700 dark:text-gray-400">
                              Alamat
                            </span>
                            <textarea
                              class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                              name="address" value="<?= $student['address'] ?>" rows="2" placeholder="Alamat"
                              required><?= $student['address'] ?></textarea>
                          </label>

                          <label class="block mt-4 text-sm">
                            <span class="text-gray-700 dark:text-gray-400">
                              Jenis Kelamin
                            </span>
                            <select
                              class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                              name="gender" placeholder="Jenis Kelamin" required value="<?= $student['gender'] ?>">
                              <?php if ($student['gender'] == 'L') { ?>
                              <option value="L" selected>Laki-laki</option>
                              <option value="P">Perempuan</option>
                              <?php } else if ($student['gender'] == 'P') { ?>
                              <option value="L">Laki-laki</option>
                              <option value="P" selected>Perempuan</option>
                              <?php } ?>
                            </select>
                          </label>

                          <label class="block mt-4 text-sm">
                            <span class="text-gray-700 dark:text-gray-400">
                              Agama
                            </span>
                            <input
                              class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                              name="religion" value="<?= $student['religion'] ?>" placeholder="Agama" required />
                          </label>

                          <label class="block mt-4 text-sm">
                            <span class="text-gray-700 dark:text-gray-400">
                              Asal Sekolah
                            </span>
                            <input
                              class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                              name="school" value="<?= $student['school'] ?>" placeholder="Asal Sekolah" required />
                          </label>

                          <label class="block mt-4 text-sm">
                            <span class="text-gray-700 dark:text-gray-400">
                              Departemen
                            </span>
                            <input
                              class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                              name="department" value="<?= $student['department'] ?>" placeholder="Departemen"
                              required />
                          </label>

                          <footer
                            class="flex flex-col items-center justify-end gap-2 sm:flex-row bg-white dark:bg-gray-800 mt-6">
                            <button id="update-student-close" data-id="<?= $student['student_id'] ?>" type="button"
                              class="w-full px-5 py-3 text-sm font-medium leading-5 text-gray-700 transition-colors duration-150 border border-gray-400 rounded-lg dark:text-gray-400 sm:px-4 sm:py-2 sm:w-auto active:bg-transparent hover:border-gray-500 focus:border-gray-500 active:text-gray-500 focus:outline-none focus:shadow-outline-gray">
                              Batal
                            </button>

                            <button type="submit" name="update_student"
                              class="w-full px-5 py-3 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-sp-primary-400 border border-transparent rounded-lg sm:w-auto sm:px-4 sm:py-2 active:bg-sp-primary-400 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple m-0">
                              Simpan
                            </button>
                          </footer>
                        </form>
                      </div>
                    </div>
                  </div>
                  <?php } ?>

                </tbody>
              </table>
            </div>

          </div>
        </div>

        <div class="fixed inset-0 z-30 hidden items-end bg-black bg-opacity-50 sm:items-center sm:justify-center"
          id="modal-add-student">
          <div
            class="w-full px-6 py-4 overflow-hidden bg-white rounded-t-lg dark:bg-gray-800 sm:rounded-lg sm:m-4 sm:max-w-xl"
            role="dialog" id="modal">

            <header class="flex justify-end">
              <button
                class="inline-flex items-center justify-center w-6 h-6 text-gray-400 transition-colors duration-150 rounded dark:hover:text-gray-200 hover: hover:text-gray-700"
                aria-label="close" id="add-student-close">
                <svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20" role="img" aria-hidden="true">
                  <path
                    d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
                    clip-rule="evenodd" fill-rule="evenodd"></path>
                </svg>
              </button>
            </header>

            <div class="mt-4">

              <p class="mb-2 text-lg font-semibold text-gray-700 dark:text-gray-400">
                Tambah Daftar Calon Mahasiswa
              </p>

              <form method="POST" action="" enctype="multipart/form-data">

                <label class="block mt-4 text-sm w-1/2" id="image-item">
                  <span class="text-gray-700 dark:text-gray-400" id="image-name">
                    Foto
                  </span>

                  <input id="image-place" type="file" name="photo" class="form-control hidden">
                  <img class="mt-1 mb-2" id="image-preview" src="">

                  <button
                    class="px-2 py-1 text-xs font-medium leading-5 text-white transition-colors duration-150 bg-sp-primary-400 border border-transparent rounded active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
                    id="insert-image" type="button">
                    Upload Gambar
                  </button>
                </label>

                <label class="block mt-4 text-sm">
                  <span class="text-gray-700 dark:text-gray-400">
                    Nama
                  </span>
                  <input
                    class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                    name="name" placeholder="Nama" required />
                </label>

                <label class="block mt-4 text-sm">
                  <span class="text-gray-700 dark:text-gray-400">
                    Alamat
                  </span>
                  <textarea
                    class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                    name="address" rows="2" placeholder="Alamat" required></textarea>
                </label>

                <label class="block mt-4 text-sm">
                  <span class="text-gray-700 dark:text-gray-400">
                    Jenis Kelamin
                  </span>
                  <select
                    class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                    name="gender" placeholder="Jenis Kelamin" required>
                    <option value="L">Laki-laki</option>
                    <option value="P">Perempuan</option>
                  </select>
                </label>

                <label class="block mt-4 text-sm">
                  <span class="text-gray-700 dark:text-gray-400">
                    Agama
                  </span>
                  <input
                    class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                    name="religion" placeholder="Agama" required />
                </label>

                <label class="block mt-4 text-sm">
                  <span class="text-gray-700 dark:text-gray-400">
                    Asal Sekolah
                  </span>
                  <input
                    class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                    name="school" placeholder="Asal Sekolah" required />
                </label>

                <label class="block mt-4 text-sm">
                  <span class="text-gray-700 dark:text-gray-400">
                    Departemen
                  </span>
                  <input
                    class="block w-full mt-1 text-sm dark:text-gray-400 dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray form-input"
                    name="department" placeholder="Departemen" required />
                </label>

                <footer class="flex flex-col items-center justify-end gap-2 sm:flex-row bg-white dark:bg-gray-800 mt-6">
                  <button id="add-student-close" type="button"
                    class="w-full px-5 py-3 text-sm font-medium leading-5 text-gray-700 transition-colors duration-150 border border-gray-400 rounded-lg dark:text-gray-400 sm:px-4 sm:py-2 sm:w-auto active:bg-transparent hover:border-gray-500 focus:border-gray-500 active:text-gray-500 focus:outline-none focus:shadow-outline-gray">
                    Batal
                  </button>

                  <button type="submit" name="add_student"
                    class="w-full px-5 py-3 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-sp-primary-400 border border-transparent rounded-lg sm:w-auto sm:px-4 sm:py-2 active:bg-sp-primary-400 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple m-0">
                    Tambah
                  </button>
                </footer>
              </form>
            </div>
          </div>
        </div>

      </main>
    </div>
  </div>

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>

  <script type="text/javascript">
    $(document).ready(function () {
      $("body").on('click', "#delete-student", function (e) {
        var studentId = $(this).data(("id"));
        $(`#modal-delete-student-${studentId}`).removeClass('hidden').addClass('flex');
      });

      $("body").on('click', "#modal-close-button", function (e) {
        var studentId = $(this).data(("id"));
        $(`#modal-delete-student-${studentId}`).removeClass('flex').addClass('hidden');
      });

      $("body").on('click', "#add-student", function (e) {
        $(`#modal-add-student`).removeClass('hidden').addClass('flex');
      });

      $("body").on('click', "#add-student-close", function (e) {
        $(`#modal-add-student`).removeClass('flex').addClass('hidden');
      });

      $("body").on('click', "#update-student", function (e) {
        var studentId = $(this).data(("id"));
        $(`#modal-update-student-${studentId}`).removeClass('hidden').addClass('flex');
      });

      $("body").on('click', "#update-student-close", function (e) {
        var studentId = $(this).data(("id"));
        $(`#modal-update-student-${studentId}`).removeClass('flex').addClass('hidden');
      });

      function readURL(target, input) {
        if (input.files && input.files[0]) {
          var reader = new FileReader();

          reader.onload = function (e) {
            target.attr('src', e.target.result);
          }

          reader.readAsDataURL(input.files[0]);
        }
      }

      $("body").on('change', "input[id*='image-place']", function (e) {
        readURL($("#image-item").children("img"), this);

        $("#image-item").children("#insert-image").html("Ubah Gambar");

        $("#image-item").children("img").css({
          "height": "75px",
          "width": "50%",
          "object-fit": "cover"
        });
      });

      $("body").on("click", "#insert-image", function () {
        var num = $(this).data("id");
        $("#image-place").click();
      });
    });
  </script>
</body>

</html>

Menuliskan Kode PHP

  • auth
<?php

function login()
{
  $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
  $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);

  if ($email && $password) {
    $db = new PDO(DB_CONNECTION, DB_USER, DB_PASS);

    $sql = "SELECT * FROM users WHERE email=:email";
    $stmt = $db->prepare($sql);

    $params = array(":email" => $email);

    $stmt->execute($params);

    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user) {
      if (password_verify($password, $user["password"])) {
        session_start();
        $_SESSION["user"] = $user;

        header("Location: /");
      }
    } else {
      header("Location: /daftar");
    }
  }
}

function register()
{
  $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
  $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
  $password = password_hash($_POST["password"], PASSWORD_DEFAULT);

  if ($_POST["password"] != $_POST["password_confirmation"]) {
    echo "Password konfirmasi tidak sama!";
  } else {
    if ($email && $password && $name) {
      $db = new PDO(DB_CONNECTION, DB_USER, DB_PASS);

      $sql = "INSERT INTO users (name, email, password) 
              VALUES (:name, :email, :password)";
      $stmt = $db->prepare($sql);

      $params = array(
        ":name" => $name,
        ":password" => $password,
        ":email" => $email
      );

      $saved = $stmt->execute($params);

      if ($saved) {
        header("Location: /masuk");
      };
    }
  }
}

function logout()
{
  session_start();
  unset($_SESSION['user']);
  header("Location: /masuk");
}

  • student
<?php

function studentAll()
{
  $db = new PDO(DB_CONNECTION, DB_USER, DB_PASS);

  $sql = "SELECT * FROM students";
  $stmt = $db->prepare($sql);

  $stmt->execute();

  return $stmt->fetchAll();
}

function studentInsert()
{
  $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
  $address = filter_input(INPUT_POST, 'address', FILTER_SANITIZE_STRING);
  $gender = filter_input(INPUT_POST, 'gender', FILTER_SANITIZE_STRING);
  $religion = filter_input(INPUT_POST, 'religion', FILTER_SANITIZE_STRING);
  $school = filter_input(INPUT_POST, 'school', FILTER_SANITIZE_STRING);
  $department = filter_input(INPUT_POST, 'department', FILTER_SANITIZE_STRING);
  $photo = "";

  if ($name && $address && $gender && $religion && $school && $department) {
    $db = new PDO(DB_CONNECTION, DB_USER, DB_PASS);

    $pass_image = true;
    $photo_check = getimagesize($_FILES['photo']['tmp_name']);
    if ($photo_check) {
      $photo_name = 'assets/img/' . time() . '_' . basename($_FILES['photo']['name']);
      $photo_dir = ROOT . $photo_name;

      if ($_FILES['photo']['size'] > 2000000) {
        echo "File terlalu besar (max 2MB).";

        $pass_image = false;
      } else {
        if (move_uploaded_file($_FILES['photo']['tmp_name'], $photo_dir)) {
          $photo = URL . $photo_name;
        } else {
          echo "Terjadi kesalahan dalam upload file, coba ulangi!";

          $pass_image = false;
        }
      }
    }

    $sql = "INSERT INTO students (name, address, gender, religion, school, department, photo) 
            VALUES (:name, :address, :gender, :religion, :school, :department, :photo)";
    $stmt = $db->prepare($sql);

    $params = array(
      ":name" => $name,
      ":address" => $address,
      ":gender" => $gender,
      ":religion" => $religion,
      ":school" => $school,
      ":department" => $department,
      ":photo" => $photo,
    );

    if ($pass_image) {
      $saved = $stmt->execute($params);

      if ($saved) {
        header("Location: /");
      };
    }
  }
}

function studentDelete()
{
  $db = new PDO(DB_CONNECTION, DB_USER, DB_PASS);

  $id = filter_input(INPUT_POST, 'student_id', FILTER_VALIDATE_INT);

  $sql = "DELETE FROM students WHERE student_id=:student_id";
  $stmt = $db->prepare($sql);

  $params = array(
    ":student_id" => $id,
  );

  $deleted = $stmt->execute($params);

  if ($deleted) {
    header("Location: /");
  };
}

function studentUpdate()
{
  $id = filter_input(INPUT_POST, 'student_id', FILTER_VALIDATE_INT);
  $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
  $address = filter_input(INPUT_POST, 'address', FILTER_SANITIZE_STRING);
  $gender = filter_input(INPUT_POST, 'gender', FILTER_SANITIZE_STRING);
  $religion = filter_input(INPUT_POST, 'religion', FILTER_SANITIZE_STRING);
  $school = filter_input(INPUT_POST, 'school', FILTER_SANITIZE_STRING);
  $department = filter_input(INPUT_POST, 'department', FILTER_SANITIZE_STRING);
  $photo_ori = filter_input(INPUT_POST, 'photo_ori', FILTER_SANITIZE_STRING);
  $photo = "";

  if ($name && $address && $gender && $religion && $school && $department) {
    $db = new PDO(DB_CONNECTION, DB_USER, DB_PASS);

    $pass_image = true;
    $photo_check = getimagesize($_FILES['photo']['tmp_name']);
    if ($photo_check) {
      $photo_name = 'assets/img/' . time() . '_' . basename($_FILES['photo']['name']);
      $photo_dir = ROOT . $photo_name;

      if ($_FILES['photo']['size'] > 2000000) {
        echo "File terlalu besar (max 2MB).";

        $pass_image = false;
      } else {
        if (move_uploaded_file($_FILES['photo']['tmp_name'], $photo_dir)) {
          $photo = URL . $photo_name;
        } else {
          echo "Terjadi kesalahan dalam upload file, coba ulangi!";

          $pass_image = false;
        }
      }
    } else {
      $photo = $photo_ori;
    }

    $sql = "UPDATE students
          SET name=:name,
          address=:address,
          gender=:gender,
          religion=:religion,
          school=:school,
          department=:department,
          photo=:photo
          WHERE student_id=:student_id";
    $stmt = $db->prepare($sql);

    $params = array(
      ":student_id" => $id,
      ":name" => $name,
      ":address" => $address,
      ":gender" => $gender,
      ":religion" => $religion,
      ":school" => $school,
      ":department" => $department,
      ":photo" => $photo,
    );

    if ($pass_image) {
      $stmt->execute($params);

      if ($stmt->rowCount() > 0) {
        header("Location: /");
      };
    }
  }
}

Deploy Website ke Server (Heroku)

  • Masuk pada server melalui SSH (Saya menggunakan Visual Studio Code)
  • Membuat virtual host dengan nama sesuai domain maroqi.online
  • Menambahkan table pada phpmyadmin server
  • Menyesuaikan knfigurasi database aplikasi.
  • Mengunggah source code dan asset website pada folder sesuai yang tertulis di virtual host (/var/www/maroqi.online/public)
  • Melakukan aktivasi situs menggunakan perintah pada apache2 kemudian melakukan restart apache2
  • Sudah terunggah (maroqi.online)

Tinggalkan komentar

Rancang situs seperti ini dengan WordPress.com
Ayo mulai