<?php /** * Class: ThinBuilder * @author Eugene Sukhodolskiy <eugene.sukhodolskiy@gmail.com> * @version 0.1 * Date: 22.01.2020 * Update At: 18.08.2022 */ namespace Fury\Modules\ThinBuilder; class ThinBuilder implements ThinBuilderInterface{ use ThinBuilderProcessing; public function query(String $sql, String $fetch_func = '', Int $fetch_func_param = NULL){ if($this -> driver){ $this -> driver -> event_ready_sql($sql); } if($this -> gen_sql_only) { $this -> gen_sql_only = false; return $sql; } // TODO: if result of query() == false - we have error about trying call fetch func $response = $this -> pdo -> query($sql); if(!$response) { $result = null; } else { $result = $fetch_func ? $response -> $fetch_func($fetch_func_param) : $response; } if($this -> history_enabled){ $this -> history -> add($sql, $result); } if($this -> driver){ $this -> driver -> event_query($sql, $result); } return $result; } // $where = [ [], 'AND', [], 'OR', [] ] public function select(String $tablename, $fields = [], $where = [], $order_fields = [], String $order_sort = 'DESC', $limit = []){ list($fields, $where, $order_fields, $limit) = $this -> select_data_preprocessing($fields, $where, $order_fields, $limit); if($order_fields != ''){ $order_fields .= " {$order_sort}"; } $sql = "SELECT {$fields} FROM `{$tablename}` {$where} {$order_fields} {$limit}"; return $this -> query($sql, 'fetchAll', \PDO::FETCH_ASSOC); } public function insert(String $tablename, Array $data){ $tablename = addslashes($tablename); $data = $this -> escape_string_in_arr($data); $fields = '`' . implode('`,`', array_keys($data)) . '`'; $values = "'" . implode("','", array_values($data)) . "'"; $sql = "INSERT INTO `{$tablename}` ({$fields}) VALUES ($values)"; if($this -> query($sql)){ $id = $this -> pdo -> lastInsertId(); $this -> history -> add($sql, $id); return $id; } return false; } public function update(String $tablename, Array $data, $where = []){ $where = $this -> where_processing($where); $data = $this -> escape_string_in_arr($data); $tablename = addslashes($tablename); $pdata = []; foreach ($data as $field => $value) { $pdata[] = "`{$field}`='{$value}'"; } $sql = "UPDATE `{$tablename}` SET " . implode(',', $pdata) . " {$where}"; return $this -> query($sql); } public function delete(String $tablename, $where = []){ $tablename = addslashes($tablename); $where = $this -> where_processing($where); $sql = "DELETE FROM `{$tablename}` {$where}"; return $this -> query($sql); } public function drop(String $tablename){ $tablename = addslashes($tablename); $sql = "DROP TABLE `{$tablename}`"; return $this -> query($sql); } public function truncate(String $tablename){ $tablename = addslashes($tablename); $sql = "TRUNCATE TABLE `{$tablename}`"; return $this -> query($sql); } public function create_table(String $tablename, Array $fields, String $primary_key, $engine = 'InnoDB'){ /* $fields = [ 'id' => [ 'type' => 'INT', 'length' => 11, 'default' => 'NOT NULL', 'auto_increment' => true, 'can_be_null' => true ], 'option_key' => [ 'type' => 'VARCHAR', 'length' => 255, 'default' => 'NOT NULL' 'auto_increment' => false, 'can_be_null' => false ], ] */ $tablename = addslashes($tablename); $fields = $this -> escape_string_in_arr($fields); $primary_key = addslashes($primary_key); $engine = addslashes($engine); $fields_str_arr = []; foreach ($fields as $name => $options) { $length = (isset($options['length']) and !is_null($options['length'])) ? "({$options['length']})" : ''; if(isset($options['default'])){ $default = ($options['default'] == 'NULL' or $options['default'] == 'CURRENT_TIMESTAMP') ? "DEFAULT {$options['default']}" : "DEFAULT '{$options['default']}'"; }else{ $default = ''; } $auto_increment = (isset($options['auto_increment']) and $options['auto_increment']) ? 'AUTO_INCREMENT' : ''; $can_be_null = (isset($options['can_be_null']) and $options['can_be_null']) ? 'NULL' : 'NOT NULL'; $fields_str_arr[] = "`{$name}` {$options['type']}{$length} {$can_be_null} {$default} {$auto_increment}"; } $fields_string = implode(', ', $fields_str_arr); $sql = "CREATE TABLE IF NOT EXISTS `{$tablename}` ({$fields_string}, PRIMARY KEY (`{$primary_key}`)) ENGINE = {$engine}"; return $this -> query($sql); } public function table_fields(String $tablename){ $tablename = addslashes($tablename); $sql = "SHOW COLUMNS FROM `{$tablename}`"; $result = $this -> query($sql, 'fetchAll', \PDO::FETCH_NUM); $fields = []; foreach ($result as $raw_field) { list($type, $length) = explode('(', $raw_field[1]); $fields[$raw_field[0]] = ['type' => $type]; $length = intval($length); if($length){ $fields[$raw_field[0]]['length'] = $length; } } return $fields; } public function tables(){ $sql = 'SHOW TABLES'; $result = $this -> query($sql, 'fetchAll', \PDO::FETCH_ASSOC); return array_map(function($val){ $k = array_keys($val); return $val[$k[0]]; }, $result); } public function count(String $tablename, $where = []){ $tablename = addslashes($tablename); $where = $this -> where_processing($where); $sql = "SELECT COUNT(*) FROM `{$tablename}` {$where}"; $result = $this -> query($sql, 'fetch', \PDO::FETCH_NUM); return $result ? intval($result[0]) : 0; } public function history(){ return $this -> history; } public function sql_for() { $this -> gen_sql_only = true; return $this; } }