[ask] Penjumlahan Tables Pada PHP


Status
Not open for further replies.
wah, sama om... saya juga masih belajar kok :)
kereen. self-taught learner. semangat!

bisa saja dengan 4 field. selebihnya diolah oleh query database + PHP.
database (SQL) juga punya bahasa (syntax) sendiri, lho.
 
bisa saja dengan 4 field. selebihnya diolah oleh query database + PHP.
database (SQL) juga punya bahasa (syntax) sendiri, lho.
wah mantap tuch om,
mungkin bisa dicoba shared om bocoron tahkniknya atau mungkin ada link referensi yg bs saya pelajari
 
ini hanya contoh sederhana (quick & dirty).


step 1 : buat tabel
Code:
CREATE TABLE IF NOT EXISTS `data` (
  `id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `awal` datetime DEFAULT NULL,
  `akhir` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

step 2 : konfigurasi

PHP:
<?php
// file : config.php
//
// menggunakan PDO (atau MySQLi) adalah "best practice"
//
$db_host = 'localhost';
$db_name = 'jadwal'; // sesuaikan
$db_user = 'test';   // sesuaikan
$db_pass = 'test';   // sesuaikan
$dns = "mysql:host=$db_host;dbname=$db_name";

mb_internal_encoding("UTF-8");

if(!extension_loaded('pdo')) die ('Oops!');

try {
  $dbh = new PDO($dns,$db_user,$db_pass,array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    PDO::ATTR_EMULATE_PREPARES, false)
  );
} catch(PDOException $e) {
   die($e->getMessage());
}

step 3 : populasi data (dummy)
PHP:
<?php
// file : dummy.php

require("config.php");

function random_menit(){
  return $rand = (rand(20,80) * 60);
}

$start = strtotime("2014-09-01 08:00:00");
$user = 1;
$total = 100;
$sql = "INSERT INTO `data`(`user_id`, `awal`, `akhir`) VALUES (:user, :awal, :akhir);";
$sth = $dbh->prepare($sql);

for($i = 0; $i < $total; $i++) {
  $durasi = random_menit();
  $end = $start + $durasi;
  $awal = date("Y-m-d G:i:s", $start);
  $akhir = date("Y-m-d G:i:s", $end);
  $sth->bindParam(':user', $user);
  $sth->bindParam(':awal', $awal);
  $sth->bindParam(':akhir', $akhir);
  $sth->execute();
  $start = $start + 86400;
}
echo "Populating dummy data... Done.";

step 4 : data & presentation
PHP:
<?php
// file : index.php

require("config.php");

// hitung durasi
function durasi_login($awal, $akhir){
  $d1 = new DateTime($awal);
  $d2 = new DateTime($akhir);
  $interval = $d2->diff($d1);
  
  return $interval->format('%d hari, %H jam, %I menit, %S detik');
}

// cari data user pada bulan ini
$query = "SELECT * FROM `data` WHERE `user_id` = 1 and date_format(`awal`,'%Y-%m')=date_format(now(), '%Y-%m')";
$sql = $dbh->prepare($query);
$sql->execute();
$data = $sql->fetchAll(PDO::FETCH_ASSOC);

// jumlah hari pada bulan ini
$days = date('t');

// ekstrak data (presentation)
for($i=0; $i < $days; $i++){
  $num = $i+1;
  $awal = $data[$i]["awal"];
  $akhir = $data[$i]["akhir"];
  $durasi = durasi_login($awal,$akhir);
  echo "Tanggal $num : $awal - $akhir - $durasi<br />";
}

untuk referensi, bisa baca/cari Q&A di http://stackoverflow.com. (banyak solusi yang di-"share" oleh para expert)
 
Terimkasih banyak atas masukan dan referensinya om Doel, akan saya coba pahami dan pelajari terlebih dahulu sicript yg om berikan,

oh yach om kira2 ide saya di bawah bisa ga yach :

form input :
Code:
<html>
  <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>::Absen::</title>
  </head>
  <body background="background4.png">
<p></p>

  <form action="simpanabsen.php"  method="post" enctype="multipart/form-data"  name="FMHS">
  <table  width="452" border="0" align="center"  cellpadding="0" cellspacing="1"  bgcolor="#1605c0">
  <tr>
  <table width="50%" align="center" valign="top" border="0">
        </th>
<tr>

<td ><table width="" border="0" align="center" cellpadding="5"  cellspacing="0">
  <tr>
  <tr><td  width=""><b>ID </b></td><td width="11">:</td>
  <td  width="237"><input required="required" name="id" type="text"  id="id" size="30" maxlength="30"></td>
  </tr>
  <tr>
  <tr><td  width=""><b>Nama </b></td><td width="11">:</td>
  <td  width="237"><input required="required" name="nama" type="text"  id="nama" size="30" maxlength="30"></td>
  </tr>
<tr>
        <td><b> Status </b></td>
    <td> : </td>
    <td colspan="7"> <select name="status">
                    <option value="Jam Masuk"> Jam Masuk </option>
                                        <option value="Jam Pulang"> Jam Pulang </option>
                                        <option value="Izin"> Izin </option>
                                        <option value="Sakit"> Sakit </option>
                                        </select></td>
<tr>
  <tr><td  width=""><b>Keterangan </b></td><td width="11">:</td>
  <td  width="237"><input required="required" name="keterangan" type="text"  id="keterangan" size="30" maxlength="30"></td>
  </tr>
  <tr><td  colspan="3" align="center"><input  name="input" type="submit" id="input"  value="Input Absen">

  </tr>
  </table></td>
  </tr>
  </table>
  </form>
  </body>
</html>

kemudian file simpanabsen.php
Code:
<?php
  include "conn.php";
  include "tanggal.php";
  include "jam.php";
  $id=$_POST['id'];
  $nama=$_POST['nama'];
  $status=$_POST['status'];
  $jammasuk=$_POST['jammasuk'];
  $jampulang =  $_POST['jampulang'];
  $tanggal=$_POST['tanggal'];
  $keterangan=$_POST['keterangan'];

  mysql_query("insert  into absen(id,nama,status,jammasuk,jampulang,tanggal,keterangan)  " .
  "values('$id','$nama','$status','$jammasuk','$jampulang','$tanggal','$keterangan')")  or die(mysql_error());
  header("location:index.php");
?>

untuk tables databasenya :

id | nama | status | jammasuk | jampulang | tanggal | keterangan

Keterangan :
1. Untuk nilai jam dan tanggal diambil sesuai jam dan tanggal pada saat diinput jad tdk diinput manual dari field input nya namun sesuai jam dan tanggal yg diambil dari file jam.php dan tanggal.php,
2. Untuk jampulang dan jammasuk akan terisi jamnya sesuai pilihan pada status,
Jadi contoh : jika status yg dipilih 'Jam Pulang' maka saat disubmit maka jam yang terisi adalah jampulang dan jika yg dipilih 'Jam Masuk' maka yang terisi adalah jammasuk
3. status hanya bisa dipilih dan disubmit dalam satu kali oleh satu ID yang sama,
Contoh : jika ID 123456 sdh mensubmit status "Jam Masuk" maka tidak bisa memsubmitnya kembali dan harus submit status "Jam Pulang" baru bisa mensubmit 'Jam Masuk' dan begitu juga untuk status "Jam Pulang" harus mensubmit status 'Jam Masuk' terlebih dahulu baru bisa mensubmit "Jam Pulang"

Nah yang jadi saya bingung yaitu pada point "2" dan point "3" di atas saya ga tahu bagaimana cara memisahkan dan memfilternya.
Kira2 ada saran Om ?
 
2 & 3 : karena ada yang "ketinggalan" (kelupaan) dalam rutinnya.
bagaimana caranya agar aplikasi bisa tahu kalau user sudah tercatat atau belum? buat rutin pengecekan ke database sebelum data di input.

PHP:
function input_absen($user_id){
  global $dbh;

  $now = date("Y-m-d G:i:s", time());

  // cari data user tertanggal "hari ini"
  $query = "SELECT * FROM `data` WHERE `user_id` = :user_id AND DATE_FORMAT(`awal`, '%Y-%m-%d') = CURDATE();";
  $sql   = $dbh->prepare($query);
  $sql->bindParam(':user_id', $user_id);
  $sql->execute();
  $data = $sql->fetchAll(PDO::FETCH_ASSOC);

  if(!empty($data[0]["awal"]) && !empty($data[0]["akhir"])){
    // record user untuk hari ini sudah terisi. skip...
    return;
  }

  if(empty($data[0]["awal"])){
    // record user untuk hari ini belum ada. catat jam masuk.
    $awal = $now;
    $akhir = NULL;
  }else{
    // record user untuk hari ini sudah ada. catat jam keluar.
    $awal = $data[0]["awal"];
    $akhir = $now;
  }


  // rutin berikutnya. masukkan data.
  // ...
  // ...
  // dst
}

fungsi diatas dipanggil pada halaman ketika data di-submit oleh user. misalnya:
PHP:
<?php
$method = $_SERVER["REQUEST_METHOD"];

if($method == "POST"){
  if(isset($_POST['user_id'])){
    $user_id = $_POST['user_id'];
    // panggil fungsi pengecekan data & simpan
    input_absen($user_id);
  }else{
    die('User ID kosong.');
  }
}
 
@om Doel
Terimakasih banyak atas pencerahannya,

Tanya dikit Om dan rekan2 yang lainnya
Pada bagian ini :
Code:
// cari data user tertanggal "hari ini"
  $query = "SELECT * FROM `data` WHERE `user_id` = :user_id AND DATE_FORMAT(`awal`, '%Y-%m-%d') = CURDATE();";
  $sql   = $dbh->prepare($query);

ditempat saya jadi :
Code:
// cari data user tertanggal "hari ini"
  $query = "SELECT * FROM `absen` WHERE `id` = :id AND DATE_FORMAT('jammasuk`, '%Y-%m-%d') = CURDATE();";
  $sql = $dbh->prepare($query);    --------->>Baris 10

yang ingin saya tanyakan itu maksud pakai tanda titik dua ( : ) sebelum id dan juga dibagian akhir ada dua kali penggunaan titik koma ( ; ) tujuannya untuk apa yach om?karena di tempat saya memunculkan error katanya memanggil fungsi member yg tidak ada objectnya
tapi sdh saya coba hilangkan sama saja sich

Fatal error: Call to a member function prepare() on a non-object in /var/www/html/pelajaran5/fungsi.php on line 10 (baris 10 ini yaitu bagian $sql di atas)
 
Last edited:
oooh baru tahu ternyata tanda baca yg saya tanyakan di atas merupakan bagian dari perintahnya yach karena penggunaan PDO
ok untuk pertanyaan saya tanda di atas sdh terjawab, ilmu baru ini
skrg saya lg coba cari tahu perihal penyebab errornya (karena dicek di dreamweaver no syntac error dan juga sepertinya ga ada yg duplicate)
atau saya salah letak posisinya yach
 
nah skrg errornya sdh tak ada tp data yg diinput tak masuk ke databsenya :
berikut datanya kira2 bagian mana yg salah dan kurang yach? :

Code:
<html>
  <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>::Absen::</title>
  </head>
  <body background="background4.png">
<p></p>
  <form name='absen' action="simpanabsen.php"  method="post">
  <table  width="452" border="0" align="center"  cellpadding="0" cellspacing="1"  bgcolor="#1605c0">
  <tr>
  <table width="50%" align="center" valign="top" border="0">
        </th>
<tr>

<td ><table width="" border="0" align="center" cellpadding="5"  cellspacing="0">
  <tr>
  <tr><td  width=""><b>User ID </b></td><td width="11">:</td>
  <td  width="237"><input required="required" name="userid" type="text"  id="userid" size="30" maxlength="30"></td>
  </tr>
  <tr>
  <tr><td  width=""><b>Nama </b></td><td width="11">:</td>
  <td  width="237"><input required="required" name="nama" type="text"  id="nama" size="30" maxlength="30"></td>
  </tr>
<tr>
        <td><b> Status </b></td>
    <td> : </td>
    <td colspan="7"> <select name="status">
                    <option value="Jam Masuk"> Jam Masuk </option>
                                        <option value="Jam Pulang"> Jam Pulang </option>
                                        <option value="Izin"> Izin </option>
                                        <option value="Sakit"> Sakit </option>
                                        </select></td>
<tr>
  <tr><td  width=""><b>Keterangan </b></td><td width="11">:</td>
  <td  width="237"><input required="required" name="keterangan" type="text"  id="keterangan" size="30" maxlength="30"></td>
  </tr>

  <tr><td  colspan="3" align="center"><input  name="submit" type="submit" id="submit"  value="Input Absen">
  </tr>
  </table></td>
  </tr>
  </table>
  </form>
  </body>
</html>

database :
Code:
,CREATE TABLE IF NOT EXISTS `absen` (
  `id` int(10) unsigned NOT NULL
  `userid` int(10) unsigned NOT NULL,
  `nama` varchar(25) NOT NULL,
  `status` varchar(25) NOT NULL,
  `jammasuk` datetime DEFAULT NULL,
  `jampulang` datetime DEFAULT NULL,
  `tanggal` date NOT NULL,
  `keterangan` varchar(55) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

config.php
Code:
<?php
$db_host = 'localhost';
$db_name = 'dbabsen';
$db_user = 'root';
$db_pass = 'pelajaran';
$dns = "mysql:host=$db_host;dbname=$db_name";

mb_internal_encoding("UTF-8");

if(!extension_loaded('pdo')) die ('Oops!');

try {
  $dbh = new PDO($dns,$db_user,$db_pass,array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    PDO::ATTR_EMULATE_PREPARES, false)
  );
} catch(PDOException $e) {
   die($e->getMessage());
}

simpanabsen.php
<?php
require("configpdo.php");

$method = $_SERVER["REQUEST_METHOD"];

if($method == "POST"){
if(isset($_POST['userid'])){
$userid = $_POST['userid'];
$nama = $_POST['nama'];
$status = $_POST['status'];
$keterangan = $_POST['keterangan'];
input_absen($userid);
}else{
die('Data kosong.');
}
}

function input_absen($userid){
global $dbh;

$now = date("Y-m-d G:i:s", time());
$tanggal = date("Y-m-d");

// cari data user tertanggal "hari ini"
$query = "SELECT * FROM `absen` WHERE `userid` = :userid AND DATE_FORMAT(`jammasuk`, '%Y-%m-%d') = CURDATE();";
$sql = $dbh->prepare($query);
$sql->bindParam(':userid', $userid);
$sql->execute();
$data = $sql->fetchAll(PDO::FETCH_ASSOC);

if(!empty($data[0]["jammasuk"]) && !empty($data[0]["jampulang"])){
// record user untuk hari ini sudah terisi. skip...
return;
}

if(empty($data[0]["jammasuk"])){
// record user untuk hari ini belum ada. catat jam masuk.
$jammasuk = $now;
$jampulang = NULL;
}else{
// record user untuk hari ini sudah ada. catat jam keluar.
$jammasuk = $data[0]["jammasuk"];
$jampulang = $now;
}
}
$sql = "INSERT INTO `absen`(`userid`, `nama`, `status`, 'jammasuk', 'jampulang', 'tanggal', 'keterangan') VALUES (:userid, :nama, :status, :jammasuk, :jampulang, :tanggal, :keterangan);";
$sth = $dbh->prepare($sql);

echo "Input data... Selesai.";
 
Status
Not open for further replies.
Back
Top