212 lines
5.8 KiB
PHP
212 lines
5.8 KiB
PHP
<?php
|
|
|
|
namespace Vor\core;
|
|
|
|
use PDO;
|
|
use Exception;
|
|
use Vor\core\Sys;
|
|
|
|
class Main{
|
|
/**
|
|
* Static query functions
|
|
*/
|
|
|
|
public static function insert($table, $data, $whitelist = []){
|
|
if(!self::assertIdent($table)){
|
|
throw new \InvalidArgumentException('Invalid table name');
|
|
}
|
|
|
|
$db = Sys::getConnection();
|
|
|
|
if(!empty($whitelist)){
|
|
$data = array_intersect_key($data, array_flip($whitelist));
|
|
}
|
|
|
|
if(empty($data)){
|
|
return false;
|
|
}
|
|
|
|
$fields = array_keys($data);
|
|
$cols = implode(', ', $fields);
|
|
$placeholders = ':' . implode(', :' , $fields);
|
|
|
|
$query = "INSERT INTO $table ($cols) VALUES ($placeholders)";
|
|
|
|
try{
|
|
$stmt = $db->prepare($query);
|
|
foreach($data as $key => $val){
|
|
$stmt->bindValue(':' . $key, $val);
|
|
}
|
|
|
|
if($stmt->execute()){
|
|
return $db->lastInsertId();
|
|
}
|
|
}catch(Exception $e) {
|
|
error_log($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function update($table, $data, $where, $whitelist = []){
|
|
if(!self::assertIdent($table)){
|
|
throw new \InvalidArgumentException('Invalid table name');
|
|
}
|
|
|
|
$db = Sys::getConnection();
|
|
if(!empty($whitelist)){
|
|
$data = array_intersect_key($data, array_flip($whitelist));
|
|
}
|
|
|
|
if(empty($data)){
|
|
return false;
|
|
}
|
|
|
|
$setParts = [];
|
|
$whereParts = [];
|
|
|
|
// Set
|
|
foreach($data as $key => $val){
|
|
$setParts[] = "$key = :$key";
|
|
}
|
|
$setSql = implode(', ', $setParts);
|
|
|
|
// Where
|
|
foreach($where as $key => $val){
|
|
$whereParts[] = "$key = :w_$key";
|
|
}
|
|
|
|
$whereSql = implode(' AND ', $whereParts);
|
|
$query = "UPDATE $table SET $setSql WHERE $whereSql";
|
|
|
|
try{
|
|
$stmt = $db->prepare($query);
|
|
foreach($data as $key => $val){
|
|
$stmt->bindValue(':' . $key, $val);
|
|
}
|
|
|
|
foreach($where as $key => $val){
|
|
$stmt->bindValue(':w_' . $key, $val);
|
|
}
|
|
|
|
return $stmt->execute();
|
|
}catch(Exception $e){
|
|
error_log($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function select($table, $list = [], $where = [], $multiple = false, $assoc = true){
|
|
if(!self::assertIdent($table)){
|
|
throw new \InvalidArgumentException('Invalid table name');
|
|
}
|
|
|
|
foreach($list as $col){
|
|
if(!self::assertIdent($col)){
|
|
throw new \InvalidArgumentException('Invalid where name');
|
|
}
|
|
}
|
|
|
|
foreach($where as $k => $_){
|
|
if(!self::assertIdent($k)){
|
|
throw new \InvalidArgumentException('Invalid where key');
|
|
}
|
|
}
|
|
|
|
$db = Sys::getConnection();
|
|
|
|
if(empty($list)){
|
|
$query = "SELECT * FROM $table";
|
|
}else{
|
|
$querySelect = implode(', ', $list);
|
|
$query = "SELECT $querySelect FROM $table";
|
|
}
|
|
|
|
if(!empty($where)){
|
|
$whereParts = [];
|
|
foreach($where as $key => $val){
|
|
$whereParts[] = "$key = :w_$key";
|
|
}
|
|
|
|
$whereSql = implode(' AND ', $whereParts);
|
|
$query .= " WHERE $whereSql";
|
|
}
|
|
|
|
try{
|
|
$stmt = $db->prepare($query);
|
|
foreach($where as $key => $val){
|
|
$stmt->bindValue(':w_' . $key, $val);
|
|
}
|
|
|
|
if($stmt->execute()){
|
|
$mode = $assoc ? PDO::FETCH_ASSOC : PDO::FETCH_COLUMN;
|
|
return $multiple ? $stmt->fetchAll($mode) : $stmt->fetch($mode);
|
|
}
|
|
return false;
|
|
}catch(Exception $e){
|
|
error_log($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function query($sql, $params = [], $multiple = true, $assoc = true){
|
|
$db = Sys::getConnection();
|
|
try{
|
|
$stmt = $db->prepare($sql);
|
|
if(!empty($params)){
|
|
foreach($params as $key => $val){
|
|
$stmt->bindValue(':' . $key, $val);
|
|
}
|
|
}
|
|
if($stmt->execute()){
|
|
$mode = $assoc ? PDO::FETCH_ASSOC : PDO::FETCH_COLUMN;
|
|
return $multiple ? $stmt->fetchAll($mode) : $stmt->fetch($mode);
|
|
}
|
|
return false;
|
|
}catch(Exception $e){
|
|
error_log($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function curl($url, $data = [], $headers = []){
|
|
$ch = curl_init();
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
|
|
|
if(!empty($data)){
|
|
curl_setopt($ch, CURLOPT_POST, true);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
$headers[] = 'Content-Type: application/json';
|
|
}
|
|
|
|
if(!empty($headers)){
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
}
|
|
|
|
try{
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
$error = curl_error($ch);
|
|
|
|
if($error){
|
|
error_log('Curl erro: ' . $error);
|
|
return false;
|
|
}
|
|
|
|
return [
|
|
'status' => $httpCode,
|
|
'body' => json_decode($response, true) ?? $response
|
|
];
|
|
}catch(Exception $e){
|
|
error_log($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function assertIdent($s){
|
|
return is_string($s) && preg_match('/^[a-zA-Z0-9_]+$/', $s);
|
|
}
|
|
} |