<?php
/**
* ! Medoo 0.8.5 - Copyright 2013, Angel Lai - MIT license - http://medoo.in
*/
class medoo{
protected $database_type = 'mysql'; // For MySQL, MSSQL, Sybase
protected $server = 'localhost'; protected $username = 'username'; protected $password = 'password'; // For SQLite
protected $database_file = ''; // Optional
protected $charset = 'utf8';
protected $database_name = '';
protected $option = array(); public function __construct($options){
try{
$type = strtolower($this -> database_type);
if(is_string($options)){
if($type == 'sqlite'){
$this -> database_file = $options;
}else{
$this -> database_name = $options;
}
}else{
foreach($options as $option => $value){
$this -> $option = $value;
}
}
$type = strtolower($this -> database_type);
switch($type){
case 'mysql':case 'pgsql':$this -> pdo = new PDO($type . ':host=' . $this -> server . ';dbname=' . $this -> database_name, $this -> username, $this -> password, $this -> option);
break;
case 'mssql':case 'sybase':$this -> pdo = new PDO($type . ':host=' . $this -> server . ';dbname=' . $this -> database_name . ',' . $this -> username . ',' . $this -> password, $this -> option);
break;
case 'sqlite':$this -> pdo = new PDO($type . ':' . $this -> database_file, $this -> option);
break;
}
$this -> pdo -> exec('SET NAMES \'' . $this -> charset . '\'');
}
catch(PDOException$e){
echo $e -> getMessage();
}
}
public function query($query){
$this -> queryString = $query;
return $this -> pdo -> query($query);
}
public function exec($query){
$this -> queryString = $query;
return $this -> pdo -> exec($query);
}
public function quote($string){
return $this -> pdo -> quote($string);
}
protected function array_quote($array){
$temp = array();
foreach($array as $value){
$temp[] = is_int($value)?$value:$this -> pdo -> quote($value);
}
return implode($temp, ',');
}
protected function inner_conjunct($data, $conjunctor, $outer_conjunctor){
$haystack = array();
foreach($data as $value){
$haystack[] = '(' . $this -> data_implode($value, $conjunctor) . ')';
}
return implode($outer_conjunctor . ' ', $haystack);
}
protected function data_implode($data, $conjunctor, $outer_conjunctor = null){
$wheres = array();
foreach($data as $key => $value){
if(($key == 'AND' || $key == 'OR') && is_array($value)){
$wheres[] = 0 !== count(array_diff_key($value, array_keys(array_keys($value))))?'(' . $this -> data_implode($value, ' ' . $key) . ')':'(' . $this -> inner_conjunct($value, ' ' . $key, $conjunctor) . ')';
}else{
preg_match('/([\w\.]+)(\[(\>|\>\=|\<|\<\=|\!|\<\>)\])?/i', $key, $match);
if(isset($match[3])){
if($match[3] == '' || $match[3] == '!'){
$wheres[] = $match[1] . ' ' . $match[3] . '= ' . $this -> quote($value);
}else{
if($match[3] == '<>'){
if(is_array($value)){
if(is_numeric($value[0]) && is_numeric($value[1])){
$wheres[] = $match[1] . ' BETWEEN ' . $value[0] . ' AND ' . $value[1];
}else{
$wheres[] = $match[1] . ' BETWEEN ' . $this -> quote($value[0]) . ' AND ' . $this -> quote($value[1]);
}
}
}else{
if(is_numeric($value)){
$wheres[] = $match[1] . ' ' . $match[3] . ' ' . $value;
}
}
}
}else{
if(is_int($key)){
$wheres[] = $this -> quote($value);
}else{
switch(gettype($value)){
case 'NULL':$wheres[] = $match[1] . ' IS null';
break;
case 'array':$wheres[] = $match[1] . ' IN (' . $this -> array_quote($value) . ')';
break;
default:$wheres[] = $match[1] . ' = ' . $this -> quote($value);
break;
}
}
}
}
}
return implode($conjunctor . ' ', $wheres);
}
public function where_clause($where){
$where_clause = '';
if(is_array($where)){
$single_condition = array_diff_key($where, array_flip(explode(' ', 'AND OR GROUP ORDER HAVING LIMIT LIKE MATCH')));
if($single_condition != array()){
$where_clause = ' WHERE ' . $this -> data_implode($single_condition, '');
}
if(isset($where['AND'])){
$where_clause = ' WHERE ' . $this -> data_implode($where['AND'], ' AND ');
}
if(isset($where['OR'])){
$where_clause = ' WHERE ' . $this -> data_implode($where['OR'], ' OR ');
}
if(isset($where['LIKE'])){
$like_query = $where['LIKE'];
if(is_array($like_query)){
$is_OR = isset($like_query['OR']);
if($is_OR || isset($like_query['AND'])){
$connector = $is_OR?'OR':'AND';
$like_query = $is_OR?$like_query['OR']:$like_query['AND'];
}else{
$connector = 'AND';
}
$clause_wrap = array();
foreach($like_query as $column => $keyword){
if(is_array($keyword)){
foreach($keyword as $key){
$clause_wrap[] = $column . ' LIKE ' . $this -> quote('%' . $key . '%');
}
}else{
$clause_wrap[] = $column . ' LIKE ' . $this -> quote('%' . $keyword . '%');
}
}
$where_clause .= ($where_clause != ''?' AND ':' WHERE ') . '(' . implode($clause_wrap, ' ' . $connector . ' ') . ')';
}
}
if(isset($where['MATCH'])){
$match_query = $where['MATCH'];
if(is_array($match_query) && isset($match_query['columns']) && isset($match_query['keyword'])){
$where_clause .= ($where_clause != ''?' AND ':' WHERE ') . ' MATCH (' . implode($match_query['columns'], ', ') . ') AGAINST (' . $this -> quote($match_query['keyword']) . ')';
}
}
if(isset($where['GROUP'])){
$where_clause .= ' GROUP BY ' . $where['GROUP'];
}
if(isset($where['ORDER'])){
$where_clause .= ' ORDER BY ' . $where['ORDER'];
if(isset($where['HAVING'])){
$where_clause .= ' HAVING ' . $this -> data_implode($where['HAVING'], '');
}
}
if(isset($where['LIMIT'])){
if(is_numeric($where['LIMIT'])){
$where_clause .= ' LIMIT ' . $where['LIMIT'];
}
if(is_array($where['LIMIT']) && is_numeric($where['LIMIT'][0]) && is_numeric($where['LIMIT'][1])){
$where_clause .= ' LIMIT ' . $where['LIMIT'][0] . ',' . $where['LIMIT'][1];
}
}
}else{
if($where != null){
$where_clause .= ' ' . $where;
}
}
return $where_clause;
}
public function select($table, $columns, $where = null){
$where_clause = $this -> where_clause($where);
preg_match('/([a-zA-Z0-9_-]*)\s*(\[(\<|\>|\>\<|\<\>)\])?\s*([a-zA-Z0-9_-]*)/i', $table, $match);
if($match[3] != '' && $match[4] != ''){
$join_array = array('>' => 'LEFT', '<' => 'RIGHT', '<>' => 'FULL', '><' => 'INNER');
$table = $match[1] . ' ' . $join_array[$match[3]] . ' JOIN ' . $match[4] . ' ON ';
$where_clause = str_replace(' WHERE ', '', $where_clause);
}
$query = $this -> query('SELECT ' . (is_array($columns)?implode(', ', $columns):$columns) . ' FROM ' . $table . $where_clause);
return $query?$query -> fetchAll((is_string($columns) && $columns != '*')?PDO :: FETCH_COLUMN:PDO :: FETCH_ASSOC):false;
}
public function insert($table, $data){
$keys = implode(',', array_keys($data));
$values = array();
foreach($data as $key => $value){
$values[] = is_array($value)?serialize($value):$value;
}
$this -> exec('INSERT INTO ' . $table . ' (' . $keys . ') VALUES (' . $this -> data_implode(array_values($values), ',') . ')');
return $this -> pdo -> lastInsertId();
}
public function update($table, $data, $where = null){
$fields = array();
foreach($data as $key => $value){
if(is_array($value)){
$fields[] = $key . '=' . $this -> quote(serialize($value));
}else{
preg_match('/([\w]+)(\[(\+|\-)\])?/i', $key, $match);
if(isset($match[3])){
if(is_numeric($value)){
$fields[] = $match[1] . ' = ' . $match[1] . ' ' . $match[3] . ' ' . $value;
}
}else{
$fields[] = $key . ' = ' . $this -> quote($value);
}
}
}
return $this -> exec('UPDATE ' . $table . ' SET ' . implode(',', $fields) . $this -> where_clause($where));
}
public function delete($table, $where){
return $this -> exec('DELETE FROM ' . $table . $this -> where_clause($where));
}
public function replace($table, $columns, $search = null, $replace = null, $where = null){
if(is_array($columns)){
$replace_query = array();
foreach($columns as $column => $replacements){
foreach($replacements as $replace_search => $replace_replacement){
$replace_query[] = $column . ' = REPLACE(' . $column . ', ' . $this -> quote($replace_search) . ', ' . $this -> quote($replace_replacement) . ')';
}
}
$replace_query = implode(', ', $replace_query);
$where = $search;
}else{
if(is_array($search)){
$replace_query = array();
foreach($search as $replace_search => $replace_replacement){
$replace_query[] = $columns . ' = REPLACE(' . $columns . ', ' . $this -> quote($replace_search) . ', ' . $this -> quote($replace_replacement) . ')';
}
$replace_query = implode(', ', $replace_query);
$where = $replace;
}else{
$replace_query = $columns . ' = REPLACE(' . $columns . ', ' . $this -> quote($search) . ', ' . $this -> quote($replace) . ')';
}
}
return $this -> exec('UPDATE ' . $table . ' SET ' . $replace_query . $this -> where_clause($where));
}
public function get($table, $columns, $where = null){
if(is_array($where)){
$where['LIMIT'] = 1;
}
$data = $this -> select($table, $columns, $where);
return isset($data[0])?$data[0]:false;
}
public function has($table, $where){
return $this -> query('SELECT EXISTS(SELECT 1 FROM ' . $table . $this -> where_clause($where) . ')') -> fetchColumn() === '1';
}
public function count($table, $where = null){
return 0 + ($this -> query('SELECT COUNT(*) FROM ' . $table . $this -> where_clause($where)) -> fetchColumn());
}
public function max($table, $column, $where = null){
return 0 + ($this -> query('SELECT MAX(' . $column . ') FROM ' . $table . $this -> where_clause($where)) -> fetchColumn());
}
public function min($table, $column, $where = null){
return 0 + ($this -> query('SELECT MIN(' . $column . ') FROM ' . $table . $this -> where_clause($where)) -> fetchColumn());
}
public function avg($table, $column, $where = null){
return 0 + ($this -> query('SELECT AVG(' . $column . ') FROM ' . $table . $this -> where_clause($where)) -> fetchColumn());
}
public function sum($table, $column, $where = null){
return 0 + ($this -> query('SELECT SUM(' . $column . ') FROM ' . $table . $this -> where_clause($where)) -> fetchColumn());
}
public function error(){
return $this -> pdo -> errorInfo();
}
public function last_query(){
return $this -> queryString;
}
public function info(){
return array('server' => $this -> pdo -> getAttribute(PDO :: ATTR_SERVER_INFO), 'client' => $this -> pdo -> getAttribute(PDO :: ATTR_CLIENT_VERSION), 'driver' => $this -> pdo -> getAttribute(PDO :: ATTR_DRIVER_NAME), 'version' => $this -> pdo -> getAttribute(PDO :: ATTR_SERVER_VERSION), 'connection' => $this -> pdo -> getAttribute(PDO :: ATTR_CONNECTION_STATUS));
}
}
?>

超轻量级PHP SQL数据库框架的更多相关文章

  1. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  2. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  3. 腾讯正式开源高性能超轻量级 PHP 框架 Biny

    概况 Biny是一款高性能的超轻量级PHP框架 遵循 MVC 模式,用于快速开发现代 Web 应用程序 Biny代码简洁优雅,对应用层,数据层,模板渲染层的封装简单易懂,能够快速上手使用 高性能,框架 ...

  4. 推荐一款轻量级PHP数据库框架–Medoo

    引用官网的简介: 可以加快开发速度的最轻量级的PHP数据库框架 为什么选择Medoo及其主要功能: 轻量级–单个文件,只有20KB 易用–非常容易学习和使用 功能强大–支持各种常见和复杂的SQL查询 ...

  5. ORM数据库框架 greenDAO SQLite MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. iOS---SQLite数据库框架之FMDB -Swift

    SQLite数据库框架之FMDB 什么是FMDB? FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API.对比苹果自带的Core Data框架,更加轻量级 ...

  7. Android 数据库框架ormlite

    Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...

  8. ORM数据库框架 SQLite 常用数据库框架比较 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. SQLite数据库框架--FMDB简单介绍

    1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比 ...

随机推荐

  1. java获取当前路径的几种方法

    1.利用System.getProperty()函数获取当前路径: System.out.println(System.getProperty("user.dir"));//use ...

  2. 我的学习笔记之API-Guides翻译------AppComponent_Activites

    10.26第一天开始:贵在坚持,边看遍整理 一个应用程序通常由多个Activity组成,它们之间是松耦合的关系.特别的,有一个Activity作为app的主Activity,当app首次启动时呈现给用 ...

  3. .cs文件与aspx.cs文件之间的区别是什么???他们的作用是什么???ASPX文件的作用是什么?

    一般在vs里面新建一个页面会产生两种文件:一种是后缀名为.cs的,一种是.aspx. 简单的说,.cs文件一般是在里面实现功能的,而.aspx就是实现界面效果的. 区别:.cs文件里面写的是.net的 ...

  4. 读书笔记 - 设计模式(Head First)

    设计模式让你和其他开发人员之间有共享的词汇,设计模式可以把你的思考架构的层次提高到模式层面,而不是停留在琐碎的对象上. 设计原则: 封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需 ...

  5. java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?

    java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类 ...

  6. R与数据分析旧笔记(⑨)广义线性回归模型

    广义线性回归模型 广义线性回归模型 例题1 R.Norell实验 为研究高压电线对牲畜的影响,R.Norell研究小的电流对农场动物的影响.他在实验中,选择了7头,6种电击强度, 0,1,2,3,4, ...

  7. Python 错误和异常

    1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...

  8. nyist 220 推桌子

    题目链接:推桌子 题目意思:给你一些操作,将S出的桌子推到L出,但是这个过道有时会被占用,推一次是10min,不影响的操作可以同时开始,并且只记一次. 思路:贪心,首先按照S从小到大排序,决策:从第一 ...

  9. .Net时间计算函数,统计某一天是一年的第几周,这一周从哪天开始到哪天结束

    /// <summary> /// 计算某年第一周的天数         /// </summary>         /// <param name="dt& ...

  10. [置顶] 【GBT28181开发:SIP协议实践】之设备远程启动

    下面学习的是设备远程控制的流程,和设备信息.设备目录.设备状态的流程差不多,主要是描述的协议字段不同,模拟SPVMN系统向源设备发送远程启动控制指令,记录下交互的消息,详细研究了下: 转载请注明出处: ...