📄 dbal.php
字号:
<?php/** ** @package dbal* @version $Id: dbal.php,v 1.53 2007/01/26 16:07:43 acydburn Exp $* @copyright (c) 2005 phpBB Group * @license http://opensource.org/licenses/gpl-license.php GNU Public License **//*** Database Abstraction Layer* @package dbal*/class dbal{ var $db_connect_id; var $query_result; var $return_on_error = false; var $transaction = false; var $sql_time = 0; var $num_queries = array(); var $open_queries = array(); var $curtime = 0; var $query_hold = ''; var $html_hold = ''; var $sql_report = ''; var $persistency = false; var $user = ''; var $server = ''; var $dbname = ''; // Set to true if error triggered var $sql_error_triggered = false; // Holding the last sql query on sql error var $sql_error_sql = ''; /** * Current sql layer */ var $sql_layer = ''; /** * Constructor */ function dbal() { $this->num_queries = array( 'cached' => 0, 'normal' => 0, 'total' => 0, ); // Fill default sql layer based on the class being called. // This can be changed by the specified layer itself later if needed. $this->sql_layer = substr(get_class($this), 5); } /** * return on error or display error message */ function sql_return_on_error($fail = false) { $this->sql_error_triggered = false; $this->sql_error_sql = ''; $this->return_on_error = $fail; } /** * Return number of sql queries and cached sql queries used */ function sql_num_queries($cached = false) { return ($cached) ? $this->num_queries['cached'] : $this->num_queries['normal']; } /** * Add to query count */ function sql_add_num_queries($cached = false) { $this->num_queries['cached'] += ($cached) ? 1 : 0; $this->num_queries['normal'] += ($cached) ? 0 : 1; $this->num_queries['total'] += 1; } /** * DBAL garbage collection, close sql connection */ function sql_close() { if (!$this->db_connect_id) { return false; } if ($this->transaction) { $this->sql_transaction('commit'); } if (sizeof($this->open_queries)) { foreach ($this->open_queries as $i_query_id => $query_id) { $this->sql_freeresult($query_id); } } return $this->_sql_close(); } /** * Build LIMIT query * Doing some validation here. */ function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0) { if (empty($query)) { return false; } // Never use a negative total or offset $total = ($total < 0) ? 0 : $total; $offset = ($offset < 0) ? 0 : $offset; return $this->_sql_query_limit($query, $total, $offset, $cache_ttl); } /** * Fetch all rows */ function sql_fetchrowset($query_id = false) { if ($query_id === false) { $query_id = $this->query_result; } if ($query_id !== false) { $result = array(); while ($row = $this->sql_fetchrow($query_id)) { $result[] = $row; } return $result; } return false; } /** * Fetch field * if rownum is false, the current row is used, else it is pointing to the row (zero-based) */ function sql_fetchfield($field, $rownum = false, $query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($query_id !== false) { if ($rownum !== false) { $this->sql_rowseek($rownum, $query_id); } if (!is_object($query_id) && isset($cache->sql_rowset[$query_id])) { return $cache->sql_fetchfield($query_id, $field); } $row = $this->sql_fetchrow($query_id); return (isset($row[$field])) ? $row[$field] : false; } return false; } /** * SQL Transaction * @access private */ function sql_transaction($status = 'begin') { switch ($status) { case 'begin': // Commit previously opened transaction before opening another transaction if ($this->transaction) { $this->_sql_transaction('commit'); } $result = $this->_sql_transaction('begin'); $this->transaction = true; break; case 'commit': $result = $this->_sql_transaction('commit'); $this->transaction = false; if (!$result) { $this->_sql_transaction('rollback'); } break; case 'rollback': $result = $this->_sql_transaction('rollback'); $this->transaction = false; break; default: $result = $this->_sql_transaction($status); break; } return $result; } /** * Build sql statement from array for insert/update/select statements * * Idea for this from Ikonboard * Possible query values: INSERT, INSERT_SELECT, MULTI_INSERT, UPDATE, SELECT * */ function sql_build_array($query, $assoc_ary = false) { if (!is_array($assoc_ary)) { return false; } $fields = $values = array(); if ($query == 'INSERT' || $query == 'INSERT_SELECT') { foreach ($assoc_ary as $key => $var) { $fields[] = $key; if (is_array($var) && is_string($var[0])) { // This is used for INSERT_SELECT(s) $values[] = $var[0]; } else { $values[] = $this->_sql_validate_value($var); } } $query = ($query == 'INSERT') ? ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')' : ' (' . implode(', ', $fields) . ') SELECT ' . implode(', ', $values) . ' '; } else if ($query == 'MULTI_INSERT') { $ary = array(); foreach ($assoc_ary as $id => $sql_ary) { // If by accident the sql array is only one-dimensional we build a normal insert statement if (!is_array($sql_ary)) { return $this->sql_build_array('INSERT', $assoc_ary); } $values = array(); foreach ($sql_ary as $key => $var) { $values[] = $this->_sql_validate_value($var); } $ary[] = '(' . implode(', ', $values) . ')'; } $query = ' (' . implode(', ', array_keys($assoc_ary[0])) . ') VALUES ' . implode(', ', $ary); } else if ($query == 'UPDATE' || $query == 'SELECT') { $values = array(); foreach ($assoc_ary as $key => $var) { $values[] = "$key = " . $this->_sql_validate_value($var); } $query = implode(($query == 'UPDATE') ? ', ' : ' AND ', $values); } return $query; } /** * Build IN or NOT IN sql comparison string, uses <> or = on single element * arrays to improve comparison speed * @access public * @param string $field name of the sql column that shall be compared * @param array $array array of values that are allowed (IN) or not allowed (NOT IN) * @param bool $negate true for IN (), false for NOT IN () * @param bool $allow_empty_set Allow $array to be empty, this function will return 1=1 or 1=0 then */ function sql_in_set($field, $array, $negate = false, $allow_empty_set = false) { if (!sizeof($array)) { if (!$allow_empty_set) { // Print the backtrace to help identifying the location of the problematic code $this->sql_error('No values specified for SQL IN comparison'); } else { // NOT IN () actually means everything so use a tautology if ($negate) { return '1=1'; } // IN () actually means nothing so use a contradiction else { return '1=0'; } } } if (!is_array($array)) { $array = array($array); } if (sizeof($array) == 1) { @reset($array); $var = current($array); return $field . ($negate ? ' <> ' : ' = ') . $this->_sql_validate_value($var); } else { return $field . ($negate ? ' NOT IN ' : ' IN ') . '(' . implode(', ', array_map(array($this, '_sql_validate_value'), $array)) . ')'; } } /** * Run more than one insert statement. * * @param string $table table name to run the statements on * @param array &$sql_ary multi-dimensional array holding the statement data. * * @return bool false if no statements were executed. * @access public */ function sql_multi_insert($table, &$sql_ary) { if (!sizeof($sql_ary)) { return false; } switch ($this->sql_layer) { case 'mysql': case 'mysql4':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -