load(); class db { protected $connection; protected $stmt; public $insertid; public $num_rows; public $result_metadata; public $result_fetch; public $fetch_field; public $query_count = 0; public $debugging = FALSE; public $error; public function __construct($dbhost = '', $dbuser = '', $dbpass = '', $dbname = '', $charset = 'utf8') { if($dbhost == '' || $dbuser == '' || $dbpass == '' || $dbname == '') { $dbhost = 'p:'.$_ENV['DATABASE_HOST']; $dbuser = $_ENV['DATABASE_USER']; $dbpass = $_ENV['DATABASE_PASS']; $dbname = $_ENV['DATABASE_NAME']; } $this->connection = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($this->connection->connect_error) { $this->debug('Failed to connect to MySQL - ' . $this->connection->connect_error); } $this->connection->set_charset($charset); } private function makeDir($new_path, $mode) { return is_dir($new_path) || mkdir($new_path, $mode, true); } public function debug($args,$type = 'debug') { global $logdir; // create a log channel $logger = new Logger('query'); $daily_log = date('d-m-Y').'.log'; $year_dir = self::makeDir($logdir.'activity/'.date('Y'),0777); $month_dir = self::makeDir($logdir.'activity/'.date('Y').'/'.date('m'),0777); $dir_log = $logdir.'activity/'.date('Y').'/'.date('m').'/'.$daily_log; $logger->pushHandler(new StreamHandler($dir_log, Logger::DEBUG)); $uri = $_SERVER['REQUEST_URI']; $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $query = $_SERVER['QUERY_STRING']; if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SERVER['HTTP_CLIENT_IP']; // share internet } elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; // pass from proxy } else { $ip=$_SERVER['REMOTE_ADDR']; } if($type == 'debug'){ $logger->addDebug($args,[$_SESSION['NAMA_PEGAWAI'],$url,$query,$ip]); } elseif($type == 'info'){ $logger->addInfo($args,[$_SESSION['NAMA_PEGAWAI'],$url,$query,$ip]); } } public function query($query) { if ($this->stmt = $this->connection->prepare($query)) { if (func_num_args() > 1) { $x = func_get_args(); $args = array_slice($x, 1); $types = ''; $args_ref = array(); foreach ($args as $k => &$arg) { if (is_array($args[$k])) { foreach ($args[$k] as $j => &$a) { $types .= $this->_gettype($args[$k][$j]); $args_ref[] = &$a; } } else { $types .= $this->_gettype($args[$k]); $args_ref[] = &$arg; } } array_unshift($args_ref, $types); call_user_func_array(array($this->stmt, 'bind_param'), $args_ref); } if($this->debugging == TRUE) { $this->debug($query,'info'); } $this->stmt->execute(); $this->insertid = $this->stmt->insert_id; if($this->stmt->result_metadata()){ $this->stmt->store_result(); $this->num_rows = $this->stmt->num_rows; $this->result_metadata = $this->stmt->result_metadata(); $params = array(); $meta = $this->result_metadata; $this->fetch_field = []; while ($field = $meta->fetch_field()) { $params[] = &$row[$field->name]; $this->fetch_field[] = (array) $field; } call_user_func_array(array($this->stmt, 'bind_result'), $params); $result = []; while ($this->stmt->fetch()) { $r = []; foreach ($row as $key => $val) { $r[$key] = $val; } array_push($result, $r); } $this->result_fetch = $result; } $this->stmt->close(); if ($this->connection->errno) { $this->debug('Unable to process MySQL query (check your params) - ' . $this->connection->error); $this->error = $this->connection->error; } $this->query_count++; } else { $this->debug('Unable to prepare statement (check your syntax) - ' . $query); $this->error = 'Unable to prepare statement'; } return $this; } public function fetchAll() { return $this->result_fetch; } public function fetchFirst() { $result = $this->result_fetch[0]; return $result; } public function fetchLast() { $jml_data = count($this->result_fetch); $result = $this->result_fetch[$jml_data-1]; return $result; } public function fetchArray() { $params = array(); $meta = $this->result_metadata; while ($field = $meta->fetch_field()) { $params[] = &$row[$field->name]; } call_user_func_array(array($this->stmt, 'bind_result'), $params); $result = array(); while ($this->stmt->fetch()) { foreach ($row as $key => $val) { $result[$key] = $val; } } $this->stmt->close(); return $result; } public function fetchField() { return $meta->fetch_field(); } public function numRows() { return $this->num_rows; } public function close() { return $this->connection->close(); } public function affectedRows() { return $this->stmt->affected_rows; } private function _gettype($var) { if(is_string($var)) return 's'; if(is_float($var)) return 'd'; if(is_int($var)) return 'i'; return 'b'; } public function escape($string) { return $this->connection->escape_string($string); } public function getError() { return $this->error; } } ?>