database.php
来自「国外免费开源的内容管理系统」· PHP 代码 · 共 1,084 行 · 第 1/2 页
PHP
1,084 行
<?php
/**
* @version $Id: database.php 10214 2008-04-19 08:59:04Z eddieajau $
* @package Joomla.Framework
* @subpackage Database
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();
/**
* Database connector class
*
* @abstract
* @package Joomla.Framework
* @subpackage Database
* @since 1.0
*/
class JDatabase extends JObject
{
/**
* The database driver name
*
* @var string
*/
var $name = '';
/**
* The query sql string
*
* @var string
**/
var $_sql = '';
/**
* The database error number
*
* @var int
**/
var $_errorNum = 0;
/**
* The database error message
*
* @var string
*/
var $_errorMsg = '';
/**
* The prefix used on all database tables
*
* @var string
*/
var $_table_prefix = '';
/**
* The connector resource
*
* @var resource
*/
var $_resource = '';
/**
* The last query cursor
*
* @var resource
*/
var $_cursor = null;
/**
* Debug option
*
* @var boolean
*/
var $_debug = 0;
/**
* The limit for the query
*
* @var int
*/
var $_limit = 0;
/**
* The for offset for the limit
*
* @var int
*/
var $_offset = 0;
/**
* The number of queries performed by the object instance
*
* @var int
*/
var $_ticker = 0;
/**
* A log of queries
*
* @var array
*/
var $_log = null;
/**
* The null/zero date string
*
* @var string
*/
var $_nullDate = null;
/**
* Quote for named objects
*
* @var string
*/
var $_nameQuote = null;
/**
* UTF-8 support
*
* @var boolean
* @since 1.5
*/
var $_utf = 0;
/**
* The fields that are to be quote
*
* @var array
* @since 1.5
*/
var $_quoted = null;
/**
* Legacy compatibility
*
* @var bool
* @since 1.5
*/
var $_hasQuoted = null;
/**
* Database object constructor
*
* @access public
* @param array List of options used to configure the connection
* @since 1.5
*/
function __construct( $options )
{
$prefix = array_key_exists('prefix', $options) ? $options['prefix'] : 'jos_';
// Determine utf-8 support
$this->_utf = $this->hasUTF();
//Set charactersets (needed for MySQL 4.1.2+)
if ($this->_utf){
$this->setUTF();
}
$this->_table_prefix = $prefix;
$this->_ticker = 0;
$this->_errorNum = 0;
$this->_log = array();
$this->_quoted = array();
$this->_hasQuoted = false;
// Register faked "destructor" in PHP4 to close all connections we might have made
if (version_compare(PHP_VERSION, '5') == -1) {
register_shutdown_function(array(&$this, '__destruct'));
}
}
/**
* Returns a reference to the global Database object, only creating it
* if it doesn't already exist.
*
* The 'driver' entry in the parameters array specifies the database driver
* to be used (defaults to 'mysql' if omitted). All other parameters are
* database driver dependent.
*
* @param array Parameters to be passed to the database driver
* @return JDatabase A database object
* @since 1.5
*/
function &getInstance( $options = array() )
{
static $instances;
if (!isset( $instances )) {
$instances = array();
}
$signature = serialize( $options );
if (empty($instances[$signature]))
{
$driver = array_key_exists('driver', $options) ? $options['driver'] : 'mysql';
$select = array_key_exists('select', $options) ? $options['select'] : true;
$database = array_key_exists('database', $options) ? $options['database'] : null;
$driver = preg_replace('/[^A-Z0-9_\.-]/i', '', $driver);
$path = dirname(__FILE__).DS.'database'.DS.$driver.'.php';
if (file_exists($path)) {
require_once($path);
} else {
JError::setErrorHandling(E_ERROR, 'die'); //force error type to die
$error = JError::raiseError( 500, JTEXT::_('Unable to load Database Driver:') .$driver);
return $error;
}
$adapter = 'JDatabase'.$driver;
$instance = new $adapter($options);
if ( $error = $instance->getErrorMsg() )
{
JError::setErrorHandling(E_ERROR, 'ignore'); //force error type to die
$error = JError::raiseError( 500, JTEXT::_('Unable to connect to the database:') .$error);
return $error;
}
$instances[$signature] = & $instance;
}
return $instances[$signature];
}
/**
* Database object destructor
*
* @abstract
* @access private
* @return boolean
* @since 1.5
*/
function __destruct()
{
return true;
}
/**
* Get the database connectors
*
* @access public
* @return array An array of available session handlers
*/
function getConnectors()
{
jimport('joomla.filesystem.folder');
$handlers = JFolder::files(dirname(__FILE__).DS.'database', '.php$');
$names = array();
foreach($handlers as $handler)
{
$name = substr($handler, 0, strrpos($handler, '.'));
$class = 'JDatabase'.ucfirst($name);
if(!class_exists($class)) {
require_once(dirname(__FILE__).DS.'database'.DS.$name.'.php');
}
if(call_user_func_array( array( trim($class), 'test' ), null)) {
$names[] = $name;
}
}
return $names;
}
/**
* Test to see if the MySQLi connector is available
*
* @static
* @access public
* @return boolean True on success, false otherwise.
*/
function test()
{
return false;
}
/**
* Determines if the connection to the server is active.
*
* @access public
* @return boolean
* @since 1.5
*/
function connected()
{
return false;
}
/**
* Determines UTF support
*
* @abstract
* @access public
* @return boolean
* @since 1.5
*/
function hasUTF() {
return false;
}
/**
* Custom settings for UTF support
*
* @abstract
* @access public
* @since 1.5
*/
function setUTF() {
}
/**
* Adds a field or array of field names to the list that are to be quoted
*
* @access public
* @param mixed Field name or array of names
* @since 1.5
*/
function addQuoted( $quoted )
{
if (is_string( $quoted )) {
$this->_quoted[] = $quoted;
} else {
$this->_quoted = array_merge( $this->_quoted, (array)$quoted );
}
$this->_hasQuoted = true;
}
/**
* Splits a string of queries into an array of individual queries
*
* @access public
* @param string The queries to split
* @return array queries
*/
function splitSql( $queries )
{
$start = 0;
$open = false;
$open_char = '';
$end = strlen($queries);
$query_split = array();
for($i=0;$i<$end;$i++) {
$current = substr($queries,$i,1);
if(($current == '"' || $current == '\'')) {
$n = 2;
while(substr($queries,$i - $n + 1, 1) == '\\' && $n < $i) {
$n ++;
}
if($n%2==0) {
if ($open) {
if($current == $open_char) {
$open = false;
$open_char = '';
}
} else {
$open = true;
$open_char = $current;
}
}
}
if(($current == ';' && !$open)|| $i == $end - 1) {
$query_split[] = substr($queries, $start, ($i - $start + 1));
$start = $i + 1;
}
}
return $query_split;
}
/**
* Checks if field name needs to be quoted
*
* @access public
* @param string The field name
* @return bool
*/
function isQuoted( $fieldName )
{
if ($this->_hasQuoted) {
return in_array( $fieldName, $this->_quoted );
} else {
return true;
}
}
/**
* Sets the debug level on or off
*
* @access public
* @param int 0 = off, 1 = on
*/
function debug( $level ) {
$this->_debug = intval( $level );
}
/**
* Get the database UTF-8 support
*
* @access public
* @return boolean
* @since 1.5
*/
function getUTFSupport() {
return $this->_utf;
}
/**
* Get the error number
*
* @access public
* @return int The error number for the most recent query
*/
function getErrorNum() {
return $this->_errorNum;
}
/**
* Get the error message
*
* @access public
* @return string The error message for the most recent query
*/
function getErrorMsg($escaped = false)
{
if($escaped) {
return addslashes($this->_errorMsg);
} else {
return $this->_errorMsg;
}
}
/**
* Get a database escaped string
*
* @param string The string to be escaped
* @param boolean Optional parameter to provide extra escaping
* @return string
* @access public
* @abstract
*/
function getEscaped( $text, $extra = false )
{
return;
}
/**
* Get a database error log
*
* @access public
* @return array
*/
function getLog( )
{
return $this->_log;
}
/**
* Get the total number of queries made
*
* @access public
* @return array
*/
function getTicker( )
{
return $this->_ticker;
}
/**
* Quote an identifier name (field, table, etc)
*
* @access public
* @param string The name
* @return string The quoted name
*/
function nameQuote( $s )
{
$q = $this->_nameQuote;
if (strlen( $q ) == 1) {
return $q . $s . $q;
} else {
return $q{0} . $s . $q{1};
}
}
/**
* Get the database table prefix
*
* @access public
* @return string The database prefix
*/
function getPrefix()
{
return $this->_table_prefix;
}
/**
* Get the database null date
*
* @access public
* @return string Quoted null/zero date string
*/
function getNullDate()
{
return $this->_nullDate;
}
/**
* Sets the SQL query string for later execution.
*
* This function replaces a string identifier <var>$prefix</var> with the
* string held is the <var>_table_prefix</var> class variable.
*
* @access public
* @param string The SQL query
* @param string The offset to start selection
* @param string The number of results to return
* @param string The common table prefix
*/
function setQuery( $sql, $offset = 0, $limit = 0, $prefix='#__' )
{
$this->_sql = $this->replacePrefix( $sql, $prefix );
$this->_limit = (int) $limit;
$this->_offset = (int) $offset;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?