📄 database.php
字号:
<?php
/**
* @version $Id: database.php 8575 2007-08-26 20:02:09Z jinx $
* @package Joomla.Framework
* @subpackage Database
* @copyright Copyright (C) 2005 - 2007 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
{
/** @var string The database driver name */
var $name = '';
/** @var string Internal variable to hold the query sql */
var $_sql = '';
/** @var int Internal variable to hold the database error number */
var $_errorNum = 0;
/** @var string Internal variable to hold the database error message */
var $_errorMsg = '';
/** @var string Internal variable to hold the prefix used on all database tables */
var $_table_prefix = '';
/** @var Internal variable to hold the connector resource */
var $_resource = '';
/** @var Internal variable to hold the last query cursor */
var $_cursor = null;
/** @var boolean Debug option */
var $_debug = 0;
/** @var int The limit for the query */
var $_limit = 0;
/** @var int The for offset for the limit */
var $_offset = 0;
/** @var int A counter for the number of queries performed by the object instance */
var $_ticker = 0;
/** @var array A log of queries */
var $_log = null;
/** @var string The null/zero date string */
var $_nullDate = null;
/** @var string Quote for named objects */
var $_nameQuote = null;
/**
* @var boolean UTF-8 support
* @since 1.5
*/
var $_utf = 0;
/**
* @var array The fields that are to be quote
* @since 1.5
*/
var $_quoted = null;
/**
* @var bool Legacy compatibility
* @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.
*
* @param string Database driver
* @param string Database host
* @param string Database user name
* @param string Database user password
* @param string Database name
* @param string Common prefix for all tables
* @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 = JPATH_LIBRARIES.DS.'joomla'.DS.'database'.DS.'database'.DS.$driver.'.php';
if (file_exists($path)) {
$path = "joomla.database.database.$driver";
jimport( $path );
} else {
$error = new JException( E_ERROR, 500, 'Unable to load Database Driver:' .$driver);
return $error;
//die('Unable to load Database Driver:' .$driver);
}
$adapter = 'JDatabase'.$driver;
$instance = new $adapter($options);
if ( $error = $instance->getErrorMsg() )
{
$error = new JException( E_ERROR, 500, 'Unable to connect to the database:' .$error);
return $error;
//die('Unable to connect to the database: '.$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, '.'));
jimport('joomla.database.database.'.$name);
$class = 'JDatabase'.ucfirst($name);
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;
}
/**
* 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
*
* @abstract
* @access public
* @return string
*/
function getEscaped( $text ) {
return;
}
/**
* 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;
}
/**
* 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 common table prefix
*/
function replacePrefix( $sql, $prefix='#__' )
{
$sql = trim( $sql );
$escaped = false;
$quoteChar = '';
$n = strlen( $sql );
$startPos = 0;
$literal = '';
while ($startPos < $n) {
$ip = strpos($sql, $prefix, $startPos);
if ($ip === false) {
break;
}
$j = strpos( $sql, "'", $startPos );
$k = strpos( $sql, '"', $startPos );
if (($k !== FALSE) && (($k < $j) || ($j === FALSE))) {
$quoteChar = '"';
$j = $k;
} else {
$quoteChar = "'";
}
if ($j === false) {
$j = $n;
}
$literal .= str_replace( $prefix, $this->_table_prefix,substr( $sql, $startPos, $j - $startPos ) );
$startPos = $j;
$j = $startPos + 1;
if ($j >= $n) {
break;
}
// quote comes first, find end of quote
while (TRUE) {
$k = strpos( $sql, $quoteChar, $j );
$escaped = false;
if ($k === false) {
break;
}
$l = $k - 1;
while ($l >= 0 && $sql{$l} == '\\') {
$l--;
$escaped = !$escaped;
}
if ($escaped) {
$j = $k+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -