~~~
<?php
define('PDO_DEBUG', true);
class MySqlPDO {
protected $pdo;
protected $cfg;
protected $tablepre;
protected $errors = array();
public function __construct($config) {
$this->cfg = $config;
$this->connect($name);
}
/**
* @param string $name
*/
public function connect(){
$this->tablepre = $cfg['tablepre'];
if(empty($cfg)) {
exit("The master database is not found, Please checking 'data/config.php'");
}
$dsn = "mysql:dbname={$cfg['database']};host={$cfg['host']};port={$cfg['port']};charset={$cfg['charset']}";
$options = array();
$this->pdo = new PDO($dsn, $cfg['username'], $cfg['password'], $options);
$sql = "SET NAMES '{$cfg['charset']}';";
$this->pdo->exec($sql);
$this->pdo->exec("SET sql_mode='';");
if(is_string($name)) {
$this->link[$name] = $this->pdo;
}
self::sqllog($sql);
}
/**
* @param $sql
*/
public function run($sql){
if(!isset($sql) || empty($sql)) return;
$sql = str_replace("\r", "\n", str_replace(' ' . $this->tablepre, ' ' . $this->tablepre, $sql));
$sql = str_replace("\r", "\n", str_replace(' `' . $this->tablepre, ' `' . $this->tablepre, $sql));
$ret = array();
$num = 0;
$sql = preg_replace("/\;[ \f\t\v]+/", ';', $sql);
foreach(explode(";\n", trim($sql)) as $query) {
$ret[$num] = '';
$queries = explode("\n", trim($query));
foreach($queries as $query) {
$ret[$num] .= (isset($query[0]) && $query[0] == '#') || (isset($query[1]) && isset($query[1]) && $query[0].$query[1] == '--') ? '' : $query;
}
$num++;
}
unset($sql);
foreach($ret as $query) {
$query = trim($query);
if($query) {
$this->query($query, array());
}
}
}
/**
* @param $tablename
* @param $fieldname
* @return bool
*/
public function fieldexists($tablename, $fieldname) {
$isexists = $this->fetch("DESCRIBE " . $this->tablename($tablename) . " `{$fieldname}`", array());
return !empty($isexists) ? true : false;
}
/**
* @param $tablename
* @param $fieldname
* @param string $datatype
* @param string $length
* @return bool|int
*/
public function fieldmatch($tablename, $fieldname, $datatype = '', $length = '') {
$datatype = strtolower($datatype);
$field_info = $this->fetch("DESCRIBE " . $this->tablename($tablename) . " `{$fieldname}`", array());
if (empty($field_info)) {
return false;
}
if (!empty($datatype)) {
$find = strexists($field_info['Type'], '(');
if (empty($find)) {
$length = '';
}
if (!empty($length)) {
$datatype .= ("({$length})");
}
return strpos($field_info['Type'], $datatype) === 0 ? true : -1;
}
return true;
}
/**
* @param $tablename
* @param $indexname
* @return array|bool
*/
public function indexexists($tablename, $indexname) {
if (!empty($indexname)) {
$indexs = $this->fetchall("SHOW INDEX FROM " . $this->tablename($tablename), array(), '');
if (!empty($indexs) && is_array($indexs)) {
foreach ($indexs as $row) {
if ($row['Key_name'] == $indexname) {
return true;
}
}
}
}
return $indexs;
}
/**
* @param $table
* @return bool
*/
public function tableexists($table) {
if(!empty($table)) {
$data = $this->fetch("SHOW TABLES LIKE '{$this->tablepre}{$table}'", array());
if(!empty($data)) {
$data = array_values($data);
$tablename = $this->tablepre . $table;
if(in_array($tablename, $data)) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
/**
* @param $tablename
* @param array $params
* @param int $cachetime
* @return int
*/
public function count($tablename, $params = array(), $cachetime = 30) {
$total = pdo_getcolumn($tablename, $params, 'count(*)');
return intval($total);
}
/**
* @param $tablename
* @param array $params
* @param string $field
* @return bool|mixed
*/
public function getcolumn($tablename, $params = array(), $field = '') {
$result = $this->get($tablename, $params, $field);
if (!empty($result)) {
if (strexists($field, '(')) {
return array_shift($result);
} else {
return $result[$field];
}
} else {
return false;
}
}
/**
* @param $tablename
* @param array $params
* @return bool
*/
public function exists($tablename, $params = array()) {
$row = $this->get($tablename, $params);
if (empty($row) || !is_array($row) || count($row) == 0) {
return false;
} else {
return true;
}
}
/**
* @param $tablename
* @param array $params
* @param array $limit
* @param null $total
* @param array $fields
* @param string $keyfield
* @param array $orderby
* @return array
*/
public function getslice($tablename, $params = array(), $limit = array(), &$total = null, $fields = array(), $keyfield = '', $orderby = array()) {
$select = SqlPaser::parseSelect($fields);
$condition = SqlPaser::parseParameter($params, 'AND');
$limitsql = SqlPaser::parseLimit($limit);
if (!empty($orderby)) {
if (is_array($orderby)) {
$orderbysql = implode(',', $orderby);
} else {
$orderbysql = $orderby;
}
}
$sql = "{$select} FROM " . $this->tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : '') . (!empty($orderbysql) ? " ORDER BY $orderbysql " : '') . $limitsql;
$total = pdo_fetchcolumn("SELECT COUNT(*) FROM " . tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : ''), $condition['params']);
return $this->fetchall($sql, $condition['params'], $keyfield);
}
/**
* @param $tablename
* @param array $params
* @param array $fields
* @param array $orderby
* @return bool
*/
public function get($tablename, $params = array(), $fields = array(), $orderby = array()) {
$select = SqlPaser::parseSelect($fields);
$condition = SqlPaser::parseParameter($params, 'AND');
$orderbysql = SqlPaser::parseOrderby($orderby);
$sql = "{$select} FROM " . $this->tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : '') . " $orderbysql LIMIT 1";
return $this->fetch($sql, $condition['params']);
}
/**
* @param $tablename
* @param array $params
* @param array $fields
* @param string $keyfield
* @param array $orderby
* @param array $limit
* @return array
*/
public function getall($tablename, $params = array(), $fields = array(), $keyfield = '', $orderby = array(), $limit = array()) {
$select = SqlPaser::parseSelect($fields);
$condition = SqlPaser::parseParameter($params, 'AND');
$limitsql = SqlPaser::parseLimit($limit);
$orderbysql = SqlPaser::parseOrderby($orderby);
$sql = "{$select} FROM " .$this->tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : '') . $orderbysql . $limitsql;
return $this->fetchall($sql, $condition['params'], $keyfield);
}
/**
* @param $sql
* @param array $params
* @return bool
*/
public function fetch($sql, $params = array()) {
$statement = $this->prepare($sql);
$result = $statement->execute($params);
self::sqllog($sql, $params, $statement->errorInfo());
if (!$result) {
return false;
} else {
$data = $statement->fetch(PDO::FETCH_ASSOC);
return $data;
}
}
/**
* @param $sql
* @param array $params
* @param string $keyfield
* @return array|bool
*/
public function fetchall($sql, $params = array(), $keyfield = '') {
$statement = $this->prepare($sql);
$result = $statement->execute($params);
self::sqllog($sql, $params, $statement->errorInfo());
if(!$result){
return false;
}else{
if (empty($keyfield)) {
$result = $statement->fetchAll(pdo::FETCH_ASSOC);
}else{
$temp = $statement->fetchAll(pdo::FETCH_ASSOC);
$result = array();
if (!empty($temp)) {
foreach ($temp as $key => &$row) {
if (isset($row[$keyfield])) {
$result[$row[$keyfield]] = $row;
} else {
$result[] = $row;
}
}
}
}
return $result;
}
}
/**
* @param $sql
* @param array $params
* @param int $column
* @return bool
*/
public function fetchcolumn($sql, $params = array(), $column = 0) {
$statement = $this->prepare($sql);
$result = $statement->execute($params);
self::sqllog($sql, $params, $statement->errorInfo());
if (!$result) {
return false;
} else {
$data = $statement->fetchColumn($column);
return $data;
}
}
/**
* @param $table
* @param array $data
* @param array $params
* @param string $glue
* @return bool
*/
public function update($table, $data = array(), $params = array(), $glue = 'AND'){
$fields = SqlPaser::parseParameter($data, ',');
$condition = SqlPaser::parseParameter($params, $glue);
$params = array_merge($fields['params'], $condition['params']);
$sql = "UPDATE " . $this->tablename($table) . " SET {$fields['fields']}";
$sql .= $condition['fields'] ? ' WHERE '.$condition['fields'] : '';
return $this->query($sql, $params);
}
/**
* @param $table
* @param array $params
* @param string $glue
* @return bool
*/
public function delete($table, $params = array(), $glue = 'AND') {
$this->tablename($table);
$condition = SqlPaser::parseParameter($params, $glue);
$sql = "DELETE FROM " . $this->tablename($table);
$sql .= $condition['fields'] ? ' WHERE '.$condition['fields'] : '';
return $this->query($sql, $condition['params']);
}
/**
* @param $table
* @param array $data
* @param bool $replace
* @return bool
*/
public function insert($table, $data = array(), $replace = FALSE){
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
$condition = SqlPaser::parseParameter($data, ',');
return $this->query("$cmd " . $this->tablename($table) . " SET {$condition['fields']}", $condition['params']);
}
/**
* @param $sql
* @param array $params
* @return bool
*/
public function query($sql, $params = array()){
$sqlsafe = SqlPaser::checkquery($sql);
if($sqlsafe){
$starttime = microtime(true);
if(empty($params)){
$result = $this->pdo->exec($sql);
self::sqllog($sql, array(), $this->pdo->errorInfo());
return $result;
}
$statement = $this->prepare($sql);
$result = $statement->execute($params);
self::sqllog($sql, $params, $statement->errorInfo());
if (!$result) {
return false;
} else {
return $statement->rowCount();
}
}
}
/**
* @param $sql
* @return mixed
*/
public function prepare($sql){
$sqlsafe = SqlPaser::checkquery($sql);
if($sqlsafe){
$statement = $this->pdo->prepare($sql);
return $statement;
}
}
/**
* @return mixed
*/
public function insertid() {
return $this->pdo->lastInsertId();
}
/**
* 事務開始
*/
public function begin() {
$this->pdo->beginTransaction();
}
/**
* 提交事務
*/
public function commit() {
$this->pdo->commit();
}
/**
* 回滾事務
*/
public function rollback() {
$this->pdo->rollBack();
}
/**
* @param $table
* @return string
*/
public function tablename($table) {
return (strpos($table, $this->tablepre) === 0 || strpos($table, 'ims_') === 0) ? $table : "`{$this->tablepre}{$table}`";
}
/**
* @param bool $output
* @param array $append
* @return array
*/
public function debug($output = true, $append = array()){
if(!empty($append)) {
$output = false;
array_push($this->errors, $append);
}
if($output) {
print_r($this->errors);
}else{
if (!empty($append['error'][1])) {
$traces = debug_backtrace();
$ts = '';
foreach($traces as $trace) {
$trace['file'] = str_replace('\\', '/', $trace['file']);
$trace['file'] = str_replace(IA_ROOT, '', $trace['file']);
$ts .= "file: {$trace['file']}; line: {$trace['line']}; <br />";
}
$params = var_export($append['params'], true);
trigger_error("SQL: <br/>{$append['sql']}<hr/>Params: <br/>{$params}<hr/>SQL Error: <br/>{$append['error'][2]}<hr/>Traces: <br/>{$ts}", E_USER_WARNING);
}
}
return $this->errors;
}
/**
* @param $sql
* @param array $params
* @param string $message
* @return bool
*/
private function sqllog($sql, $params = array(), $message = '') {
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['params'] = $params;
$info['error'] = empty($message) ? $this->pdo->errorInfo() : $message;
self::debug(false, $info);
}
return true;
}
}
class SqlPaser {
private static $checkcmd = array(
'SELECT', 'UPDATE', 'INSERT','REPLAC','DELETE','ALTER'
);
private static $disable = array(
'function' => array('load_file', 'floor', 'hex', 'substring', 'if', 'ord', 'char', 'benchmark', 'reverse', 'strcmp', 'datadir', 'updatexml', 'extractvalue', 'name_const', 'multipoint', 'database', 'user'),
'action' => array('@', 'intooutfile', 'intodumpfile', 'unionselect', 'uniondistinct', 'information_schema', 'current_user', 'current_date'),
'note' => array('/*','*/','#','--'),
);
public static function parseOrderby($orderby, $alias = '') {
$orderbysql = '';
if (empty($orderby)) {
return $orderbysql;
}
if (!is_array($orderby)) {
$orderby = explode(',', $orderby);
}
foreach ($orderby as $i => &$row) {
$row = strtolower($row);
list($field, $orderbyrule) = explode(' ', $row);
if ($orderbyrule != 'asc' && $orderbyrule != 'desc') {
unset($orderby[$i]);
}
$field = self::parseFieldAlias($field, $alias);
$row = "{$field} {$orderbyrule}";
}
$orderbysql = implode(',', $orderby);
return !empty($orderbysql) ? " ORDER BY $orderbysql " : '';
}
public static function parseLimit($limit, $inpage = true) {
$limitsql = '';
if (empty($limit)) {
return $limitsql;
}
if (is_array($limit)) {
if (empty($limit[0]) && !empty($limit[1])) {
$limitsql = " LIMIT 0, " . $limit[1];
} else {
$limit[0] = max(intval($limit[0]), 1);
!empty($limit[1]) && $limit[1] = max(intval($limit[1]), 1);
if (empty($limit[0]) && empty($limit[1])) {
$limitsql = '';
} elseif (!empty($limit[0]) && empty($limit[1])) {
$limitsql = " LIMIT " . $limit[0];
} else {
$limitsql = " LIMIT " . ($inpage ? ($limit[0] - 1) * $limit[1] : $limit[0]) . ', ' . $limit[1];
}
}
} else {
$limit = trim($limit);
if (preg_match('/^(?:limit)?[\s,0-9]+$/i', $limit)) {
$limitsql = strexists(strtoupper($limit), 'LIMIT') ? " $limit " : " LIMIT $limit";
}
}
return $limitsql;
}
public static function parseSelect($field = array(), $alias = '') {
if (empty($field) || $field == '*') {
return ' SELECT *';
}
if (!is_array($field)) {
$field = array($field);
}
$select = array();
$index = 0;
foreach ($field as $field_row) {
if (strexists($field_row, '*')) {
if (!strexists(strtolower($field_row), 'as')) {
}
} elseif (strexists(strtolower($field_row), 'select')) {
if ($field_row[0] != '(') {
$field_row = "($field_row) AS '{$index}'";
}
} elseif (strexists($field_row, '(')) {
$field_row = str_replace(array('(', ')'), array('(' . (!empty($alias) ? "`{$alias}`." : '') . '`', '`)'), $field_row);
if (!strexists(strtolower($field_row), 'as')) {
$field_row .= " AS '{$index}'";
}
} else {
$field_row = self::parseFieldAlias($field_row, $alias);
}
$select[] = $field_row;
$index++;
}
return " SELECT " . implode(',', $select);
}
public static function parseParameter($params, $glue = ',', $alias = '') {
$result = array('fields' => ' 1 ', 'params' => array());
$split = '';
$suffix = '';
$allow_operator = array('>', '<', '<>', '!=', '>=', '<=', '+=', '-=', 'LIKE', 'like');
if (in_array(strtolower($glue), array('and', 'or'))) {
$suffix = '__';
}
if (!is_array($params)) {
$result['fields'] = $params;
return $result;
}
if (is_array($params)) {
$result['fields'] = '';
foreach ($params as $fields => $value) {
if ($glue == ',') {
$value = $value === null ? '' : $value;
}
$operator = '';
if (strpos($fields, ' ') !== FALSE) {
list($fields, $operator) = explode(' ', $fields, 2);
if (!in_array($operator, $allow_operator)) {
$operator = '';
}
}
if (empty($operator)) {
$fields = trim($fields);
if (is_array($value) && !empty($value)) {
$operator = 'IN';
} elseif ($value === 'NULL') {
$operator = 'IS';
} else {
$operator = '=';
}
} elseif ($operator == '+=') {
$operator = " = `$fields` + ";
} elseif ($operator == '-=') {
$operator = " = `$fields` - ";
} elseif ($operator == '!=' || $operator == '<>') {
if (is_array($value) && !empty($value)) {
$operator = 'NOT IN';
} elseif ($value === 'NULL') {
$operator = 'IS NOT';
}
}
$select_fields = self::parseFieldAlias($fields, $alias);
if (is_array($value) && !empty($value)) {
$insql = array();
$value = array_values($value);
foreach ($value as $v) {
$placeholder = self::parsePlaceholder($fields, $suffix);
$insql[] = $placeholder;
$result['params'][$placeholder] = is_null($v) ? '' : $v;
}
$result['fields'] .= $split . "$select_fields {$operator} (".implode(",", $insql).")";
$split = ' ' . $glue . ' ';
} else {
$placeholder = self::parsePlaceholder($fields, $suffix);
$result['fields'] .= $split . "$select_fields {$operator} " . ($value === 'NULL' ? 'NULL' : $placeholder);
$split = ' ' . $glue . ' ';
if ($value !== 'NULL') {
$result['params'][$placeholder] = is_array($value) ? '' : $value;
}
}
}
}
return $result;
}
public static function checkquery($sql) {
$cmd = strtoupper(substr(trim($sql), 0, 6));
if(in_array($cmd,self::$checkcmd)){
$mark = $clean = '';
$sql = str_replace(array('\\\\', '\\\'', '\\"', '\'\''), '', $sql);
if (strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false && strpos($sql, '@') === false && strpos($sql, '`') === false) {
$cleansql = preg_replace("/'(.+?)'/s", '', $sql);
} else {
$cleansql = self::stripSafeChar($sql);
}
$cleansql = preg_replace("/[^a-z0-9_\-\(\)#\*\/\"]+/is", "", strtolower($cleansql));
if (is_array(self::$disable['function'])) {
foreach (self::$disable['function'] as $fun) {
if (strpos($cleansql, $fun . '(') !== false) {
trigger_error("SQL中包含禁用函數-{$fun}",E_USER_ERROR);
return false;
}
}
}
if (is_array(self::$disable['action'])) {
foreach (self::$disable['action'] as $action) {
if (strpos($cleansql, $action) !== false) {
trigger_error("SQL中包含禁用操作符-{$action}",E_USER_ERROR);
return false;
}
}
}
if (is_array(self::$disable['note'])) {
foreach (self::$disable['note'] as $note) {
if (strpos($cleansql, $note) !== false) {
trigger_error("SQL中包含注釋信息",E_USER_ERROR);
return false;
}
}
}
}else if(substr($cmd, 0, 2) === '/*'){
trigger_error("SQL中包含注釋信息");
return false;
}
return true;
}
private static function stripSafeChar($sql) {
$len = strlen($sql);
$mark = $clean = '';
for ($i = 0; $i < $len; $i++) {
$str = $sql[$i];
switch ($str) {
case '\'':
if (!$mark) {
$mark = '\'';
$clean .= $str;
} elseif ($mark == '\'') {
$mark = '';
}
break;
case '/':
if (empty($mark) && $sql[$i + 1] == '*') {
$mark = '/*';
$clean .= $mark;
$i++;
} elseif ($mark == '/*' && $sql[$i - 1] == '*') {
$mark = '';
$clean .= '*';
}
break;
case '#':
if (empty($mark)) {
$mark = $str;
$clean .= $str;
}
break;
case "\n":
if ($mark == '#' || $mark == '--') {
$mark = '';
}
break;
case '-':
if (empty($mark) && substr($sql, $i, 3) == '-- ') {
$mark = '-- ';
$clean .= $mark;
}
break;
default:
break;
}
$clean .= $mark ? '' : $str;
}
return $clean;
}
private static function parsePlaceholder($field, $suffix = '') {
static $params_index = 0;
$params_index++;
$illegal_str = array('(', ')', '.', '*');
$placeholder = ":{$suffix}" . str_replace($illegal_str, '_', $field) . "_{$params_index}";
return $placeholder;
}
private static function parseFieldAlias($field, $alias = '') {
if (strexists($field, '.') || strexists($field, '*')) {
return $field;
}
if (strexists($field, '(')) {
$select_fields = str_replace(array('(', ')'), array('(' . (!empty($alias) ? "`{$alias}`." : '') .'`', '`)'), $field);
} else {
$select_fields = (!empty($alias) ? "`{$alias}`." : '') . "`$field`";
}
return $select_fields;
}
}
~~~
助手函數
~~~
<?php
function pdo(){
global $_W;
static $db;
if(empty($db)){
load()->classs('Mysql');
$db = new MySqlPDO('master');
}
return $db;
}
/**
* @param $tablename
* @param string $fieldname
* @return bool
*/
function pdo_fieldexists($tablename, $fieldname = '') {
return pdo()->fieldexists($tablename, $fieldname);
}
/**
* @param $tablename
* @param $fieldname
* @param string $datatype
* @param string $length
* @return bool|int
*/
function pdo_fieldmatch($tablename, $fieldname, $datatype = '', $length = '') {
return pdo()->fieldmatch($tablename, $fieldname, $datatype, $length);
}
/**
* @param $tablename
* @param string $indexname
* @return array|bool
*/
function pdo_indexexists($tablename, $indexname = '') {
return pdo()->indexexists($tablename, $indexname);
}
/**
* @param $tablename
* @return array
*/
function pdo_fetchallfields($tablename){
$fields = pdo_fetchall("DESCRIBE {$tablename}", array(), 'Field');
$fields = array_keys($fields);
return $fields;
}
/**
* @param $tablename
* @return bool
*/
function pdo_tableexists($tablename){
return pdo()->tableexists($tablename);
}
/**
* @param $sql
*/
function pdo_run($sql) {
return pdo()->run($sql);
}
/**
* @param $tablename
* @param array $condition
* @param int $cachetime
* @return int
*/
function pdo_count($tablename, $condition = array(), $cachetime = 15) {
return pdo()->count($tablename, $condition, $cachetime);
}
/**
* @param $tablename
* @param array $condition
* @return bool
*/
function pdo_exists($tablename, $condition = array()) {
return pdo()->exists($tablename, $condition);
}
/**
* @param $tablename
* @param array $condition
* @param $field
* @return bool|mixed
*/
function pdo_getcolumn($tablename, $condition = array(), $field) {
return pdo()->getcolumn($tablename, $condition, $field);
}
/**
* @param $tablename
* @param array $condition
* @param array $limit
* @param null $total
* @param array $fields
* @param string $keyfield
* @param array $orderby
* @return array
*/
function pdo_getslice($tablename, $condition = array(), $limit = array(), &$total = null, $fields = array(), $keyfield = '', $orderby = array()) {
return pdo()->getslice($tablename, $condition, $limit, $total, $fields, $keyfield, $orderby);
}
/**
* @param $sql
* @param array $params
* @param int $column
* @return bool
*/
function pdo_fetchcolumn($sql, $params = array(), $column = 0) {
return pdo()->fetchcolumn($sql, $params, $column);
}
/**
* @param $tablename
* @param array $condition
* @param array $fields
* @param string $keyfield
* @param array $orderby
* @param array $limit
* @return array
*/
function pdo_getall($tablename, $condition = array(), $fields = array(), $keyfield = '', $orderby = array(), $limit = array()) {
return pdo()->getall($tablename, $condition, $fields, $keyfield, $orderby, $limit);
}
/**
* @param $tablename
* @param array $condition
* @param array $fields
* @return bool
*/
function pdo_get($tablename, $condition = array(), $fields = array()) {
return pdo()->get($tablename, $condition, $fields);
}
/**
* @param $sql
* @param array $params
* @param string $keyfield
* @return array
*/
function pdo_fetchall($sql, $params = array(), $keyfield = '') {
return pdo()->fetchall($sql, $params, $keyfield);
}
/**
* @param $sql
* @param array $params
* @return bool
*/
function pdo_fetch($sql, $params = array()) {
return pdo()->fetch($sql, $params);
}
/**
* @param $table
* @param array $data
* @param array $params
* @param string $glue
* @return bool
*/
function pdo_update($table, $data = array(), $params = array(), $glue = 'AND') {
return pdo()->update($table, $data, $params, $glue);
}
/**
* @param $table
* @param array $data
* @param bool $replace
* @return bool
*/
function pdo_insert($table, $data = array(), $replace = FALSE) {
return pdo()->insert($table, $data, $replace);
}
/**
* @return mixed
*/
function pdo_insertid() {
return pdo()->insertid();
}
/**
* @param bool $output
* @param array $append
* @return array
*/
function pdo_debug($output = true, $append = array()) {
return pdo()->debug($output, $append);
}
/**
* 啟動一個事務
*/
function pdo_begin() {
pdo()->begin();
}
/**
* 提交一個事務
*/
function pdo_commit() {
pdo()->commit();
}
/**
* 回滾一個事務
*/
function pdo_rollback() {
pdo()->rollBack();
}
/**
* @param $table
* @param array $params
* @param string $glue
* @return bool
*/
function pdo_delete($table, $params = array(), $glue = 'AND') {
return pdo()->delete($table, $params, $glue);
}
/**
* @param $sql
* @param array $params
* @return bool
*/
function pdo_query($sql, $params = array()) {
return pdo()->query($sql, $params);
}
~~~
- 序言
- 基礎知識
- thinkphp基礎知識
- Thinkphp5CURD
- 數據庫創建
- 數據庫刪除
- 數據庫更新
- 數據庫查詢
- thinkphp5控制器
- 空操作空控制器
- 控制器基類
- 請求信息
- 行為和鉤子
- thinkphp5路由設置
- 變量路由
- 常用方法清單
- 環境搭建
- lnmp
- 升級php
- window環境
- Thinkphp小案例
- 分類管理
- 數據庫設計
- 模型
- 控制器
- 視圖
- 文件上傳
- 上傳接口
- 視圖
- 表單提交
- 視圖設計
- 控制器
- 權限控制
- 案例解釋說明
- 登錄驗證
- Laravel5.3登錄模式
- redis使用
- 一鍵安裝
- 程序設計與實現
- 頁面設計
- 功能設計
- 安裝功能實際
- 函數庫
- 配置文件
- 清除緩存
- 狀態值修改
- 數據庫備份還原
- controller.php
- common.php
- index.html
- importlist.html
- 完整的增刪查改
- 查詢語句
- 多語言支持
- JpGraph圖表類庫
- 微信支付
- payBase.php
- Order.php
- Oauth.php
- Jspay.php
- 下載遠程地址中的圖片
- URL重寫隱藏入口文件
- 圖片水印
- 整合百度編輯器
- Ueditor
- ueditor完整配置項
- 配置信息常見的方式
- HTTP 斷點續傳(PHP實現)
- layui.upload上傳文件或圖片
- QQ微信域名防封 預防域名封禁 強制跳轉至瀏覽器
- 蜘蛛篇
- 超簡單實現php谷歌驗證
- 采集金山詞霸每日一句
- think-swoole
- 原生PHP小案例
- 查詢修改數據庫
- mysql支付回調源碼
- pdo連接微信退款
- 前端小案例
- html快捷查詢
- layui經驗總結
- layui 表單增強插件
- Vue列表Ajax實戰教程
- PHP基礎
- 類的自動載入
- php基礎函數- 字符串函數
- php基礎函數-數學函數
- php基礎函數-數組函數
- PHP常見排序算法學習
- 請求第三方
- 從網絡下載文件
- 檢查網站是否宕機
- file_get_contents
- 算法
- php 抽獎算法(適合九宮格和大轉盤)
- 自己動手豐衣足食
- 入口文件
- start.php
- app.php
- load.php
- route.php
- JqHttp
- Jqfile
- Jqutil
- pdo連接數據庫類
- 常見的php類
- php數據接口類
- 生成多層樹狀下拉選框的工具模型
- 上傳下載類
- 微信用戶相關類
- Zip壓縮類
- 列表樹生成工具類
- 日期時間操作類
- 文件及文件夾處理類
- 字符串處理類
- php守護進程類
- RSA算法類
- php支持中英文的加密解密類
- CURL多線程請求
- 通用數據庫操作類
- 緩存類
- cookie類
- 常見的驗證方法
- 隨機密鑰
- 日志Log
- php-redis 操作類 封裝
- OpensslRsa 加密、解密、簽名、驗簽類
- 模板輸出類
- 發送郵件
- 封裝的mysqli類
- PHP時間段分割類庫
- PHP apk解包識版本號信息和ipa包信息
- 訪問客戶端信息
- http請求
- PHP 無數據庫讀寫配置文件
- 自己動手寫一個jwt類
- php實現對圖片對稱加解密(適用身份證加密等場景)
- 常見php函數
- 無限分類
- 獲取文章圖片
- 加密解密
- JSON數據輸出(適合在tp中)
- 刪除目錄和文件
- 判斷是否為手機訪問
- 獲取客戶端真實IP
- 隨機生成ip地址
- 字符串與二進制進行轉換
- 對數組進行排序
- 格式化字節大小
- 時間戳格式化
- 獲取數據的所有子孫數據的id值
- 取得視頻文件的縮略圖
- 圖片裁剪函數
- 按照每過0:00算一天
- 下載文件
- PHP隨機密碼生成
- 判斷數字大小
- 報文組成
- 通過ip定位城市
- PDO方式連接MySQL數據庫
- 數組與xml
- php字符串處理函數
- 判斷是否ajax提交
- 生成概率,用于抽獎
- 斷點續傳
- PHP使用星號替代用戶名手機和郵箱
- 獲取毫秒級別的時間戳
- php日志函數
- 隨機顏色生成器
- 時間差異計算函數
- 黑名單過濾
- 常見PHP 正則表達式
- php獲取瀏覽器類型
- 郵件發送
- 獲取qq昵稱
- 正則獲取手機號歸屬地
- 判斷是否是移動客戶端 移動設備
- gbk和utf8編碼自動識別方法
- 人性化時間顯示
- 請求API接口
- 數據庫備份
- PHP并發下安全讀寫文件函數
- PHP讀取exe軟件版本號
- PHP為任意頁面設置訪問密碼
- PHP利用百度當圖床
- 秒/分鐘/小時前
- 常見的js函數
- 短信驗證函數
- 上下收縮菜單
- jQuery 樹插件zTree
- 頁面刷新跳轉
- jquery導出報表
- js實現定時效果
- 獲取當前經緯度
- JQuery實現圖片大小自適應
- 網站運行時間
- 判斷瀏覽器類型
- 百度推送
- js對指定數據進行排序
- 常見工具方法
- JSPinyin
- 技術相關文章
- 高級PHP工程師所應該具備哪些技能
- 最簡潔的PHP程序員學習路線及建議
- 優化PHP代碼的一些建議
- TP5性能優化建議
- 程序猿專用代碼注釋:佛祖保佑,永無BUG
- 一組匹配中國大陸手機號碼的正則表達式
- Apache/Nginx/PHP服務器反爬蟲代碼大全
- 番外
- 配置shadowsocks服務端
- python
- go
- 如何在1分鐘內黑掉任何網站!
- 百度貼吧敏感詞
- 貼吧手工養號發帖教程
- 搞笑的注釋代碼
- Heroku