Documentation (together with my other libs)
Once, at times when there was no better option, I used my own lib to abstract the db data retrieval.
It used inheritancy to make it available for more databases (that was influenced by Java I was turing to from PHP at that time).
It provided methods for quite every aspect of a DB. But since I worked only with MySQL, only that implementation was written :)
$aasAreas = Array(); $sSQL = "SELECT id, x, y, x2 AS r, popis FROM ".$oFW->GetOption('tables.areas') ." WHERE id_ad=".asq((int)$_GET['id']); $oRes = $oFW->GetDB()->Select($sSQL); if(!$oRes || !$oRes->IsOk()){ $sError = $oRes->GetError(); break; } else while( $a = $oRes->FetchRow() ){ $aasAreas[] = $a; }
<? header("Content-Type: text/plain"); $oMySQLConn = new cDBAccess_MySQL('localhost:3350', 'test', 'test'); $oMySQLConn->SetConnectionCharset('cp1250'); // cp1250_general_ci $oMySQLConn->SetSelectMode( CDBA_SELECT_RETURNS_CRESULT_ON_ERROR ); $oMySQLConn->Connect(); $oResult =& $oMySQLConn->Select($sql = "SELECT 1 + 1"); $oResult =& $oMySQLConn->Select($sql = "SHOW DATABASES"); // var_dump($oResult); if( (!$oResult) || !$oResult->IsOK() ) //echo $oMySQLConn->GetError(); echo $oResult->GetError(); else{ //echo "\n".$oResult->GetCell(0,0); while($a = $oResult->FetchRow(MYSQL_NUM)){ echo "\n". $a[0]; } } $oMySQLConn->FreeResults(); echo "\n".$oResult->NumRows(); echo "\nErrors num: ". $oMySQLConn->GetErrorsNum(); foreach($oMySQLConn->GetErrors() as $i => $oError){ echo "\n". $oError->Dump('_TXT_', 1); //echo "<br/>Error: ". var_export($oError, 1); } $oMySQLConn->ClearErrors(); foreach($oMySQLConn->GetErrors() as $i => $oError){ echo "\n". $oError->Dump('_TXT_', 1); } // CheckTable() test echo " ".(int)$bTableOk = $oMySQLConn->CheckTable('i18n', Array( Array('name'=>'idstr', 'null'=>false, 'key'=>'primary', 'types'=>''), Array('name'=>'lang', 'null'=>false, 'key'=>'multiple', 'types'=>''), Array('name'=>'val', 'null'=>false, 'key'=>'none', 'types'=>''), ) ); ?>
<?php /***************************************************************** cDBAccess - Yet another database access wrapper Written by Ondra Zizka @ Dynawest, ondra@dynawest.cz @version 1.0.5 Changes: 1.0.5 - Added: $this->dbflags - flags for database connection. 1.0.4 - Changed: SetConnectionCharset() sets internal variable. 1.0.3 - Added: GetQueriesCount() counts performed queries (those passed to database) 1.0.2 - Introduced CDBA_SELECT_RETURNS_CRESULT_ON_ERROR: and CDBA_SELECT_RETURNS_NULL_ON_ERROR: cDBAccess::Select() has $iFlags param. When passed to with -"-, it returns cDBA_Result object even upon failure. The failure is detectable with cDBA_Result->IsOK(). - function cDBA_Result::IsOK() - functions cDBA_Result::GetError(), cDBA_Result::GetErrno() 1.0.1 - _Query() renamed to _Execute() - var $bConnected; - function GetLastError() - function GetLastErrorString() - function Disconnect() - function GetConnection() - function IsConnected() *****************************************************************/ define('CDBA_SELECT_RETURNS_NULL_ON_ERROR', 0); define('CDBA_SELECT_RETURNS_CRESULT_ON_ERROR', 1); /** class cDBAccess - Yet another database access wrapper */ class cDBAccess{ var $dbspoj; var $dbhost; var $dbuser; var $dbpass; var $dbflags; function SetFlags($iFlags){ $this->dbflags = $iFlags; } function GetFlags(){ return $this->dbflags; } var $sDatabase; var $sDatabaseDefault; var $sConnCharset; var $sConnCharsetDefault; var $bStrict; var $bConnected; var $iSelectMode = CDBA_SELECT_RETURNS_NULL_ON_ERROR; function GetSelectMode() { return $this->iSelectMode; } function SetSelectMode($iMode){ switch( $iMode ){ case CDBA_SELECT_RETURNS_NULL_ON_ERROR: case CDBA_SELECT_RETURNS_CRESULT_ON_ERROR: $this->iSelectMode = $iMode; return true; break; default: user_error('Unknown select mode ['.$iMode.']'); return false; break; } } var $aoErrors = Array(); var $aoSelectResults = Array(); var $iQueries = 0; function GetQueriesCount() { return $this->iQueries; } function _IncQueriesCount(){ $this->iQueries++; } // Constructor function cDBAccess($dbhost="", $dbuser="", $dbpass="", $sDatabaseDefault=null, $sConnCharsetDefault=null){ $this->dbhost = $dbhost; // $this->dbuser = $dbuser; // $this->dbpass = $dbpass; // $this->sDatabase = ''; // $this->sDatabaseDefault = $sDatabaseDefault; // $this->sConnCharset = ''; // $this->sConnCharsetDefault = $sConnCharsetDefault; // $this->bConnected = false; } // Errors // function _AddError($sError, $iErrno, $sSQL){ $this->aoErrors[] = new cDBA_Error($sError, $iErrno, $sSQL); } function _SetError($sError, $iErrno, $sSQL){ $this->ClearErrors(); $this->_AddError($sError, $iErrno, $sSQL); } function GetErrors() { return $this->aoErrors; } function GetErrorsNum(){ return Count($this->aoErrors); } function GetLastError(){ return (!is_array($this->aoErrors) || Count($this->aoErrors) <= 0) ? null : $this->aoErrors[Count($this->aoErrors)-1]; } function GetLastErrorString() { return (is_array($this->aoErrors) && Count($this->aoErrors) > 0) ? $this->aoErrors[Count($this->aoErrors)-1]->GetString() : ""; } function ClearErrors(){ $this->aoErrors = Array(); } /** Connection */ function IsConnected(){ return $this->bConnected && is_resource($this->dbspoj); } function Disconnect(){ if($this->bConnected) $this->_Disconnect(); $this->bConnected = false; $this->dbspoj = null; } /** Abstract - override */ function _Disconnect(){} /** Acquires and returns the real connection. Does not set the memberv value. */ function _Connect(){ $this->Disconnect(); // Verbose intentially to allow copy and paste... $spoj = null; if(!$spoj){ $this->_AddError("cDBAccess is an abstract class. Use some extended class.", 0, "Host: [$this->dbhost], User: [$this->dbuser], Using password: ".($this->dbpass ? 'YES' : 'NO')); return false; } $this->bConnected = true; return $spoj; } /** Connects to the database [and sets the default database]. */ function Connect(){ $spoj = $this->_Connect(); if(!$spoj){ return false; } $this->dbspoj = $spoj; // Default Charset if($this->sConnCharsetDefault){ $this->SetConnectionCharset($this->sConnCharsetDefault); } // Default database if($this->sDatabaseDefault){ $this->UseDatabase($this->sDatabaseDefault); } return true; } function GetConnection(){ return $this->dbspoj; } /** Select the active database. */ function UseDatabase($sDatabase){ return false; } /** Executes a SQL statement */ function _Execute($sSQL){ if(!$this->dbspoj) do{ if(!$this->bStrict){ if($this->Connect()){ break; } } $this->_AddError('Can\'t execute when not connected.', 2006, $sSQL); }while(false); return null; } /** Executes a SQL statement */ function &Execute($sSQL){ $rRes = $this->_Execute($sSQL); $iRows = 0; return $this->CreateResult($rRes, $sSQL, $iRows); } /** Makes a SELECT and returns the result. * Result returned by reference to let the object know when you unset($res); . * @returns Depends on select mode set by SetSelectMode(): * CDBA_SELECT_RETURNS_NULL_ON_ERROR: Returns null on error. * CDBA_SELECT_RETURNS_CRESULT_ON_ERROR: Returns cDBA_Result object with error info. * @see cDBAccess::SetSelectMode() */ function &Select($sSQL){ $oRes = null; $rRes = $this->_Execute($sSQL); // OK if($rRes && 'resource' == gettype($rRes) && $this->IsSelectResult($rRes)){ $iRows = 0;//... set in subclass $oRes =& $this->CreateResult($rRes, $sSQL, $iRows, 0,0); $this->CollectResult($oRes); } // Error else if($this->iSelectMode == CDBA_SELECT_RETURNS_CRESULT_ON_ERROR){ $iRows = 0; $sError = 1;//... set in subclass $iErrno = 1;//... set in subclass // !!! Incompatibility with oldre cDBAccess !!! // ->> CDBA_SELECT_RETURNS_NULL_ON_ERROR $oRes =& $this->CreateResult(null, $sSQL, 0, $sError, $iErrno); } return $oRes; } /** Creates a result object. Needed to let subclass use another result class. */ function &CreateResult($rRes, $sSQL, $iRows, $sError, $iErrno){ return new cDBA_Result($rRes, $sSQL, $iRows, $sError, $iErrno); } /** Returns whether the result contains rows (comes from SELECT or SHOW) */ function IsSelectResult($rRes){ return false; } /** Collects a result handler from SELECT to free it later. */ function CollectResult(&$oRes){ $this->aoSelectResults[] = &$oRes; } /** Releases results in stored handlers. */ function FreeResults(){ foreach($this->aoSelectResults as $i => $oRes){ $this->aoSelectResults[$i]->FreeResult(); //$this->aoSelectResults[$i] = 0; unset($this->aoSelectResults[$i]); } } /** SetConnectionCharset() - sets connection charset. [MySQL > 4.1.1] */ function SetConnectionCharset($sCharset){ $this->sConnCharset = $sCharset; return false; } } /* class cDBAccess */ /***************************************************************** class cDBA_Error - cDBA Error container *****************************************************************/ class cDBA_Error{ var $sError; var $iErrno; var $sSQL; // Constructor function cDBA_Error($sError, $iErrno, $sSQL){ $this->sError = $sError; // $this->iErrno = $iErrno; // $this->sSQL = $sSQL; // } function GetString(){ return $this->sError; } function GetNumber(){ return $this->iErrno; } function GetSql() { return $this->sSQL; } // Dump() // function Dump($f='_DEF_', $bDebug=false){ if(!$bDebug) return '[SQL error]'; $sql = $this->sSQL; if($f=='_DEF_'){ $f = '<div class="sql_error"><b>MySQL error:</b> <i>%s</i>'.($this->sSQL?'<br/><b>SQL:</b> %s':'')."</div>\n"; $sql = htmlspecialchars($this->sSQL); } elseif($f=='_PBB_'){ $f = '[block.sql_error][b]SQL error:[/b] %s'.($this->sSQL?'[br/][b]SQL:[/b] [span.sql]%s[/span]':'')."[/block]\n"; $sql = str_replace('[', '[[', $this->sSQL); } elseif($f=='_TXT_'){ $f = 'SQL error: %s'.($this->sSQL ? ' [SQL: %s]' : '')."\n"; } return sprintf($f, $this->sError, $sql); } } /* class cDBA_Error */ /***************************************************************** class cDBA_Result - a class for SELECT result. *****************************************************************/ class cDBA_Result{ var $rRes; var $sSQL; var $iRows; var $sError; function GetError() { return $this->sError; } //function SetError($sError){ $this->sError = $sError; } var $iErrno; function GetErrno() { return $this->iErrno; } //function SetErrno($iErrno){ $this->iErrno = $iErrno; } // Constructor // function cDBA_Result(&$rRes, $sSQL, $iRows, $sError=null, $iErrno=null){ $this->rRes =& $rRes; // $this->sSQL = $sSQL; // $this->iRows = $iRows; // $this->sError = $sError; // $this->iErrno = $iErrno; // } /** Error during query? */ function IsOK(){ return empty($this->iErrno) && empty($this->sError) && (TRUE == $this->rRes || is_resource($this->rRes) ); } /** Frees a result. */ function FreeResult(){ $this->rRes = null; /*$this->sSQL = '';*/ $this->iRows = 0; return false; } /** Returns a number of rows in a result. */ function NumRows(){ return $this->iRows; } /** Returns content of one cell in a result. */ function GetCell($iRow, $iField){ return false; } function DataSeek($iOffset){ return null; } function FetchField($iOffset=null){ return ($iOffset == null) ? null : null; } function FieldSeek($iOffset){ return null; } function NumFields(){ return null; } function FieldType($iOffset){ return null; } function FieldTable($iOffset){ return null; } /** @returns an array of objects with information about columns of the result. */ function GetColumns(){ return Array(); } } /* class cDBA_Result */ ?>
<?php require_once dirname(__FILE__).'/'.'lib.cDBAccess.php'; if(!function_exists('mysql_pconnect')) user_error('Function mysql_pconnect() not found! Needed in '.__FILE__); define ('MYSQL_ERR_NO_SUCH_TABLE', 1146); define ('MYSQL_ERR_DUPLICATE_KEY', 1022); define ('MYSQL_ERR_DUPLICATE_ENTRY', 1062); if(!defined('MYSQL_CLIENT_MULTI_RESULTS')) define('MYSQL_CLIENT_MULTI_RESULTS', 131072); /***************************************************************** cDBAccess_MySQL - Extension of cDBAccess for MySQL Written by Ondra Zizka @ Dynawest, ondra@dynawest.cz @version 1.0.6 History: 1.0.6: - Added: _Connect() - $this->dbflags - flags for database connection. 1.0.5: - Changed: SetConnectionCharset() calls parent::SetConnectionCharset() 1.0.4: - Added: CheckTable() - Changed: GetCell() - removed mysql_data_seek(0) at the end of call. 1.0.3: - Added: _IncQueriesCount() - Counts queries performed. - Changed: Execute() and Select() now returns cDBA_Result_MySQL object, see IsOK(). - 1.0.2: - Changed function GetCell($iRow, $iField, $xDefault=null): When $xDefault is set, returns it when coordinates are out of data bounds. - Several compatibility changes, documentation improvements. 1.0.1: Upravena cResult_MySQL::FreeResult() (rRes muze byt 1 pro dotazy bez vracenych dat) Upravena cResult_MySQL::NumRows() (pokud rRes == 1, vraci ulozeny pocet z mysql_affected_rows()) *****************************************************************/ class cDBAccess_MySQL extends cDBAccess { function _Connect(){ $spoj = @mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass, $this->dbflags); if(!$spoj){ $this->_AddError(@mysql_error(), @mysql_errno(), "Connect() Host: $this->dbhost, User: $this->dbuser, Using password: ".($this->dbpass ? 'YES' : 'NO').", Flags: $this->dbflags"); $this->bConnected = false; return false; } $this->bConnected = true; return $spoj; } /** Note: mysql_close() will not close persistent links created by mysql_pconnect(). */ function _Disconnect(){ return true; /* @mysql_close($spoj); */ } function _AddError($sError, $iErrno, $sSQL){ $this->aoErrors[] = new cDBA_MySQL_Error($sError, $iErrno, $sSQL); } /** Select the active database. */ function UseDatabase($sDatabase){ $bDbOk = @mysql_select_db($sDatabase); if(!$bDbOk){ $this->_AddError(@mysql_error($this->dbspoj), @mysql_errno($this->dbspoj), "USE ".mysql_escape_string($this->sDatabaseDefault)); return false; } return true; } /** Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query. */ function GetLastInsertId(){ return @mysql_insert_id($this->dbspoj); } /** Executes a SQL statement */ function _Execute($sSQL){ if(!$this->dbspoj) do{ if(!$this->bStrict){ if($this->Connect()){ break; } } $this->_AddError('Can\'t execute when not connected.', 2006, $sSQL); return null; }while(false); $this->_IncQueriesCount(); // For SELECT, SHOW, DESCRIBE, EXPLAIN statements, returns a resource on success or FALSE on error. // For other type of SQL statements, returns TRUE on success or FALSE on error. $rRes = mysql_query($sSQL, $this->dbspoj); if(!$rRes){ $this->_AddError(mysql_error($this->dbspoj), mysql_errno($this->dbspoj), $sSQL); } return $rRes; } /** Executes a SQL statement. * @returns false on failure, * cResult_MySQL object on success (no matter whether rows were returned). If no rows were returned, cResult_MySQL->rRes contains 1. */ function Execute($sSQL){ if( !isset($sSQL) ) return $this->CreateResult(null, null, 0, '$sSQL parameter not passed to '.__METHOD__.'($sSQL).', 0); if( !$this->IsConnected() ) return $oRes =& $this->CreateResult(null, "", 0, "Not connected.", 1001); $rRes = $this->_Execute($sSQL); $oRes = false; // Error if( TRUE == $rRes || is_resource($rRes) ){ $iRows = mysql_affected_rows($this->dbspoj); $oRes = $this->CreateResult($rRes, $sSQL, $iRows, null, null); return $oRes; } // OK //if( false === $rRes || null === $rRes ){ else if($this->iSelectMode == CDBA_SELECT_RETURNS_CRESULT_ON_ERROR){ $sError = mysql_error($this->dbspoj); $iErrno = mysql_errno($this->dbspoj); // !!! Incompatibility with oldre cDBAccess !!! // ->> CDBA_SELECT_RETURNS_NULL_ON_ERROR $oRes = $this->CreateResult(null, $sSQL, 0, $sError, $iErrno); } return $oRes; } /** Makes a SELECT and returns the result. * Result returned by reference to let the object know when you unset($res); . * @returns Depends on select mode set by SetSelectMode(): * CDBA_SELECT_RETURNS_NULL_ON_ERROR: Returns null on error. * CDBA_SELECT_RETURNS_CRESULT_ON_ERROR: Returns cDBA_Result object. * @see cDBAccess::SetSelectMode() */ function &Select($sSQL){ if( !isset($sSQL) ) return $this->CreateResult(null, null, 0, '$sSQL parameter not passed to '.__METHOD__.'($sSQL).', 0); if( !$this->IsConnected() ){ $oRes =& $this->CreateResult(null, "", 0, "Not connected.", 1001); return $oRes; } $rRes = $this->_Execute($sSQL); $oRes = null; // OK if($rRes && 'resource' == gettype($rRes) && $this->IsSelectResult($rRes)){ $iRows = mysql_num_rows($rRes); $oRes =& $this->CreateResult($rRes, $sSQL, $iRows, null, null); $this->CollectResult($oRes); } // Error else if($this->iSelectMode == CDBA_SELECT_RETURNS_CRESULT_ON_ERROR){ $sError = mysql_error($this->dbspoj); $iErrno = mysql_errno($this->dbspoj); // !!! Incompatibility with oldre cDBAccess !!! // ->> CDBA_SELECT_RETURNS_NULL_ON_ERROR $oRes =& $this->CreateResult(null, $sSQL, 0, $sError, $iErrno); } return $oRes; } /** Performs a select and returns value from the specified cell. */ function SelectCell($sSQL, $iRow=0, $iCol=0){ $oRes = $this->Select($sSQL); if(null == $oRes || !$oRes->IsOK()) return null; $xVal = $oRes->GetCell($iRow, $iCol, FALSE); if( FALSE == $xVal ) return null; return $xVal; } /** Returns whether the result contains rows (comes from SELECT or SHOW) */ function IsSelectResult($rRes){ return mysql_num_fields($rRes); } /** Creates a result object. Needed to let subclass use another result class. */ function CreateResult($rRes, $sSQL, $iRows, $sError, $iErrno){ $o = new cDBA_MySQL_Result($rRes, $sSQL, $iRows, $sError, $iErrno); return $o; } /** SetConnectionCharset() - sets connection charset. [MySQL > 4.1.1] */ function SetConnectionCharset($sCharset){ //echo "\n".CallInfo();/// parent::SetConnectionCharset($sCharset); // sets the internal variable $sSQL = "SET CHARACTER SET '".mysql_escape_string($sCharset)."'"; $bSucc = $this->Execute($sSQL); //echo "<br>Succ: ".(int)$bSucc;/// if(!$bSucc){ $this->_AddError("Error when setting CHARSET to [$sCharset].", 0, ''); //echo AdjustedPrintR(debug_print_backtrace());/// return false; } } /** Returns number of rows affected by the last query performed. @deprecated You should use cDBA_Result::NumRows() instead. */ function AffectedRows(){ return mysql_affected_rows($this->dbspoj); } /**<***********************************************************************> * Checks whether a table is in given format. * * @param sTable table name * @param aaCols expected columns. Members: * ['name']: Column's name * ['null']: true = can / false = can't be null / not set or null = whatever * ['key']: pri* = primary / uni* = unique / mul = normal multiple key / not set = whatever * @param bStrict If true, no other columns accepted ***************************************************************************/ function CheckTable($sTable, $aaCols, $bStrict=false){ //echo "\n".CallInfo();/// // Get columns $sql = "SHOW COLUMNS FROM ".$sTable; $oRes = $this->Select($sql); // ERR 1146: Table does not exist. if( null == $oRes || !$oRes->IsOK() ) return false; // Look for columns $iOk = 0; while($asRow = $oRes->FetchRow()){ // Find the column info for this column $aColInfo = null; foreach($aaCols as $aColInfoCur){ if($aColInfoCur['name'] == $asRow['Field']){ $aColInfo = $aColInfoCur; break; } } // Column not listed in check-list if( null == $aColInfo ){ // If in strict mode, refuse any other column. if( $bStrict ){ $iOk = 0; break; } continue; // Else continue to next column. } // Column found in check-list, check properties else{ // Type $sType = substr($asRow['Type'], 0, strcspn($asRow['Type'],'(') ); //echo " ".$asRow['Field']." ".$sType." [".$aColInfo['types']."]"; if(!empty($aColInfo['types']) && !in_array($sType, explode(' ', $aColInfo['types']))) continue; // NULL if( isset($aColInfo['null']) && null !== $aColInfo['null'] ){ if( ( $aColInfo['null'] ? 'YES' : 'NO') != $asRow['Null'] ) continue; } // Index if( isset($aColInfo['key']) ){ $sKeyOpt = strtoupper(substr($aColInfo['key'],0,3)); if($sKeyOpt == 'NON'){ if( $bStrict && '' != $asRow['Key'] ) // none continue; } elseif( $sKeyOpt != $asRow['Key'] ) // PRI, UNI, MUL continue; } } // One more column is ok, count it. $iOk++; }// while($asRow) $oRes->FreeResult(); return Count($aaCols) == $iOk; }// cDBAccess_MySQL::CheckTable() } /* class cDBAccess_MySQL */ /***************************************************************** class cDBA_MySQL_Result - a class for SELECT result. *****************************************************************/ class cDBA_MySQL_Result extends cDBA_Result { var $rRes; var $sSQL; // Constructor // /*function cDBA_MySQL_Result(&$rRes, $sSQL, $iRows){ $this->rRes =& $rRes; // $this->sSQL = $sSQL; // $this->iRows = $iRows; // }*/ /** Frees a result. */ function FreeResult(){ $bSucc = true; if( is_resource($this->rRes) ) $bSucc = mysql_free_result($this->rRes); //unset($this->rRes); $this->rRes = null; /*$this->sSQL = '';*/ $this->iRows = 0; return $bSucc; } /** For a result created by queries returning some rows (SELECT, SHOW, DESCRIBE), returns a number of rows in a result. For other queries (done with Execute()) like UPDATE, INSERT, DELETE, returns a number of rows affected by that query. */ function NumRows(){ return is_resource($this->rRes) ? mysql_num_rows($this->rRes) : $this->iRows; } /** Returns content of one cell in a result. */ function GetCell($iRow, $xField, $xDefault=null){ if($iRow >= $this->NumRows() || $iRow < 0) return (null !== $xDefault) ? $xDefault : Array("Bad row index [$iRow/".$this->NumRows()."]"); if( is_int( $xField ) ) if($xField >= $this->NumFields() || $xField < 0) return (null !== $xDefault) ? $xDefault : Array("Bad field index [$xField/".$this->$this->NumFields()."]"); $ret = mysql_result($this->rRes, $iRow, $xField); //mysql_data_seek($this->rRes, 0); return $ret; } function FetchRow($iType=MYSQL_ASSOC){ $ret = mysql_fetch_array($this->rRes, $iType); //if( !$ret ){ echo "x"; var_dump($ret); } if( $ret === FALSE || is_array($ret) ) return $ret; $aBT = debug_backtrace(); echo "Not a MySQL result in ".$aBT[1]['file']." @ ".$aBT[1]['line']; } function DataSeek($iOffset){ return mysql_data_seek($this->rRes, $iOffset); } // Fields // function FetchField($iOffset=null){ return ($iOffset === null) ? mysql_fetch_field($this->rRes) : mysql_fetch_field($this->rRes, $iOffset); } function FieldSeek($iOffset){ return mysql_field_seek($this->rRes, $iOffset); } function NumFields(){ return mysql_num_fields($this->rRes); } function FieldType($iOffset){ return mysql_field_type($this->rRes, $iOffset); } function FieldTable($iOffset){ return mysql_field_table($this->rRes, $iOffset); } /** @returns an array of objects with information about columns of the result. */ function GetColumns(){ $aoColumns = Array(); $iFieldsCount = $this->NumFields(); for( $i = 0; $i < $iFieldsCount; $i++ ){ $aoColumns[] = $this->FetchField($i); } return $aoColumns; } } /* class cDBA_Result */ /***************************************************************** class cDBA_MySQL_Error - specializes the Dump *****************************************************************/ class cDBA_MySQL_Error extends cDBA_Error{ // Not needed, called default /*function cDBA_MySQL_Error($sError, $iErrno, $sSQL){ parent::cDBA_Error($sError, $iErrno, $sSQL); }*/ function Dump($f='_DEF_', $bDebug=false){ if(!$bDebug) return '[MySQL error]'; $sql = $this->sSQL; if($f=='_DEF_'){ $f = '<div class="mysql_error"><b>MySQL error:</b> <i>%s</i>'.($this->sSQL?'<br/><b>SQL:</b> %s':'')."</div>\n"; $sql = htmlspecialchars($this->sSQL); } elseif($f=='_PBB_'){ $f = '[block.mysql_error][b]MySQL error:[/b] %s'.($this->sSQL?'[br/][b]SQL:[/b] [span.sql]%s[/span]':'')."[/block]\n"; $sql = str_replace('[', '[[', $this->sSQL); } elseif($f=='_TXT_'){ $f = 'MySQL error: %s'.($this->sSQL ? ' [SQL: %s]' : '')."\n"; } return sprintf($f, $this->sError, $sql); //$iErrno } } /* cDBA_MySQL_Error */