2016-02-02 23:53:08 +08:00
< ? php
/**
* @ Author : printempw
* @ Date : 2016 - 02 - 02 21 : 59 : 06
2016-03-06 14:12:12 +08:00
* @ Last Modified by : printempw
2016-04-03 15:42:17 +08:00
* @ Last Modified time : 2016 - 04 - 03 15 : 41 : 40
2016-02-02 23:53:08 +08:00
*/
2016-03-18 17:49:52 +08:00
namespace Database ;
use Utils ;
2016-03-27 11:38:27 +08:00
use E ;
2016-03-18 17:49:52 +08:00
2016-04-03 15:39:22 +08:00
class Database implements PasswordInterface , SyncInterface
2016-02-02 23:53:08 +08:00
{
private $connection = null ;
2016-04-02 22:53:55 +08:00
private $table_name = " " ;
2016-02-02 23:53:08 +08:00
2016-04-02 22:53:55 +08:00
function __construct ( $table_name = '' ) {
$this -> connection = self :: checkConfig ();
$this -> table_name = DB_PREFIX . $table_name ;
2016-03-26 19:05:09 +08:00
}
2016-03-18 17:54:19 +08:00
2016-03-26 19:05:09 +08:00
public static function checkConfig () {
// use error control to hide shitty connect warnings
2016-04-02 22:53:55 +08:00
@ $conn = new \mysqli ( DB_HOST , DB_USER , DB_PASSWD , DB_NAME , DB_PORT );
2016-03-18 17:54:19 +08:00
if ( $conn -> connect_error )
2016-03-27 11:38:27 +08:00
throw new E ( " 无法连接至 MySQL 服务器。请确认 config.php 中的配置是否正确: " . $conn -> connect_error , $conn -> connect_errno , true );
2016-04-02 22:53:55 +08:00
$sql = " SELECT table_name FROM `INFORMATION_SCHEMA`.`TABLES` WHERE (table_name =' " . DB_PREFIX . " users'OR table_name =' " . DB_PREFIX . " options') AND TABLE_SCHEMA=' " . DB_NAME . " ' " ;
if ( $conn -> query ( $sql ) -> num_rows != 2 )
2016-03-27 15:02:16 +08:00
throw new E ( " 数据库中不存在 " . DB_PREFIX . " users 或 " . DB_PREFIX . " options 表。请先访问 <a href='./setup'>/setup</a> 进行安装。 " , - 1 , true );
2016-04-02 22:53:55 +08:00
2016-03-18 17:54:19 +08:00
if ( ! is_dir ( BASE_DIR . " /textures/ " ))
2016-03-27 15:02:16 +08:00
throw new E ( " textures 文件夹不存在。请先访问 <a href='./setup'>/setup</a> 进行安装,或者手动放置一个。 " , - 1 , true );
2016-03-26 19:05:09 +08:00
2016-03-19 11:31:44 +08:00
$conn -> query ( " SET names 'utf8' " );
2016-02-02 23:53:08 +08:00
return $conn ;
}
public function query ( $sql ) {
$result = $this -> connection -> query ( $sql );
2016-04-02 22:53:55 +08:00
if ( $this -> connection -> error )
throw new E ( " Database query error: " . $this -> connection -> error . " , Statement: " . $sql , - 1 );
return $result ;
2016-02-02 23:53:08 +08:00
}
public function fetchArray ( $sql ) {
return $this -> query ( $sql ) -> fetch_array ();
}
2016-04-02 22:53:55 +08:00
/**
* Select records from table
*
* @ param string $key
* @ param string $value
* @ param array $condition , see function `where`
* @ param string $table , which table to operate
* @ param boolean $dont_fetch_array , return resources if true
* @ return array | resources
*/
public function select ( $key , $value , $condition = null , $table = null , $dont_fetch_array = false ) {
$table = is_null ( $table ) ? $this -> table_name : $table ;
if ( isset ( $condition [ 'where' ])) {
$sql = " SELECT * FROM $table " . $this -> where ( $condition );
} else {
$sql = " SELECT * FROM $table WHERE $key =' $value ' " ;
}
if ( $dont_fetch_array ) {
return $this -> query ( $sql );
} else {
return $this -> fetchArray ( $sql );
}
2016-02-02 23:53:08 +08:00
}
2016-04-02 22:53:55 +08:00
public function has ( $key , $value , $table = null ) {
return ( $this -> getNumRows ( $key , $value , $table ) != 0 ) ? true : false ;
2016-02-02 23:53:08 +08:00
}
2016-04-02 22:53:55 +08:00
public function insert ( $data , $table = null ) {
$keys = " " ;
$values = " " ;
$table = is_null ( $table ) ? $this -> table_name : $table ;
foreach ( $data as $key => $value ) {
if ( $value == end ( $data )) {
$keys .= '`' . $key . '`' ;
$values .= '"' . $value . '"' ;
} else {
$keys .= '`' . $key . '`,' ;
$values .= '"' . $value . '", ' ;
}
}
$sql = " INSERT INTO $table ( { $keys } ) VALUES ( $values ) " ;
return $this -> query ( $sql );
2016-03-06 14:12:12 +08:00
}
2016-04-02 22:53:55 +08:00
public function update ( $key , $value , $condition = null , $table = null ) {
$table = is_null ( $table ) ? $this -> table_name : $table ;
return $this -> query ( " UPDATE $table SET ` $key `=' $value ' " . $this -> where ( $condition ));
2016-02-02 23:53:08 +08:00
}
2016-04-02 22:53:55 +08:00
public function delete ( $condition = null , $table = null ) {
$table = is_null ( $table ) ? $this -> table_name : $table ;
return $this -> query ( " DELETE FROM $table " . $this -> where ( $condition ));
2016-02-02 23:53:08 +08:00
}
2016-04-02 22:53:55 +08:00
public function getNumRows ( $key , $value , $table = null ) {
$table = is_null ( $table ) ? $this -> table_name : $table ;
$sql = " SELECT * FROM $table WHERE $key =' $value ' " ;
return $this -> query ( $sql ) -> num_rows ;
2016-02-02 23:53:08 +08:00
}
2016-04-02 22:53:55 +08:00
public function getRecordNum ( $table = null ) {
$table = is_null ( $table ) ? $this -> table_name : $table ;
$sql = " SELECT * FROM $table WHERE 1 " ;
return $this -> query ( $sql ) -> num_rows ;
2016-02-02 23:53:08 +08:00
}
2016-04-02 22:53:55 +08:00
public function encryptPassword ( $raw_passwd , $username = " " ) {
2016-04-03 15:42:17 +08:00
$class_name = " Cipher \\ " . \Option :: get ( 'encryption' );
2016-04-03 15:39:22 +08:00
return $class_name :: encrypt ( $raw_passwd );
2016-03-13 15:38:34 +08:00
}
2016-04-02 22:53:55 +08:00
public function sync ( $username , $reverse = false ) {
return ( $this -> has ( 'username' , $username )) ? true : false ;
}
/**
* Generate where statement
*
* @ param array $condition , e . g . array ( 'where' => 'username="shit"' , 'limit' => 10 , 'order' => 'uid' )
* @ return string
*/
private function where ( $condition ) {
$statement = " " ;
if ( isset ( $condition [ 'where' ]) && $condition [ 'where' ] != " " ) {
$statement .= ' WHERE ' . $condition [ 'where' ];
}
if ( isset ( $condition [ 'order' ])) {
$statement .= ' ORDER BY `' . $condition [ 'order' ] . '`' ;
}
if ( isset ( $condition [ 'limit' ])) {
$statement .= ' LIMIT ' . $condition [ 'limit' ];
}
return $statement ;
}
function __destruct () {
$this -> connection -> close ();
2016-03-13 15:38:34 +08:00
}
2016-02-02 23:53:08 +08:00
}