* * $Id: QuasiDBI.class.php 97 2008-08-29 21:36:11Z erikwinn $ *@version 0.1 * *@copyright (C) 2008 by Erik Winn *@license GPL v.2 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA * *@package Quasi * @subpackage Classes */ abstract class QuasiDBI { const BADNESS = 'LOAD_FILE|OUTFILE|DUMPFILE|ESCAPED|TERMINATED|CASCADE|INFILE|X509|TRIGGER|REVOKE'; protected $strDatabase; protected $strUsername; protected $strPassword; protected $strDatabaseServer; protected $strDatabaseType; protected static $objDatabaseHandle; protected static $blnIsConnected = false; protected $objResultSet; protected $strDbErrors; protected $strErrors; private static $_instance = null; protected function __construct($strDb=DB_DATABASE, $strUser=DB_SERVER_USERNAME, $strPass=DB_SERVER_PASSWORD, $strServer=DB_SERVER) { $this->strDatabase = $strDb; $this->strUsername = $strUser; $this->strPassword = $strPass; $this->strDatabaseServer = $strServer; if( !$this->connect()) $strErrors .= "QuasiDBI::__construct Failed to connect to database!\n"; } /** getInstance() * Returns an appropriate DBI object - you may provide the * parameter $type to obtain a driver for a different kind * of server - currently the default is MySQL * * Note: see class description for supported $type parameters .. * *@access public *@param string db server type *@return object QuasiDBI of appropriate type */ public static function getInstance($type="MySQL") { if(!isset(self::$_instance)) { switch($type) { case "MySQL": self::$_instance = new QuasiMysql(); break; default: // for now do nothing - maybe set instance to null for unsupported types and die(errormsg) .. } } // ensure a current connection .. if(! self::$_instance->blnIsConnected) self::$_instance->connect(); return self::$_instance; } public function isConnected(){ return $this->blnIsConnected;} // Accessors .. public function getServerType() {return $this->strDatabaseType;} public function setServerType($t) {$this->strDatabaseType = $t;} public function getServerName() {return $this->strDatabaseServer;} public function setServerName($n) {$this->strDatabaseType = $n;} public function getDbUser() {return $this->strUsername;} public function setDbUser($u) {$this->strUsername = $u;} public function setDbPassword($p) {$this->strPassword = $p;} public function getDbPassword() {return $this->strPassword;} public function getDbName() {return $this->strDatabase;} public function setDbName($n) {$this->strDatabase = $n;} public function getErrors() {return $this->strErrors . "\n" . $this->getDbError();} public function reconnect($strNewHost = DB_SERVER, $strNewDatabase = DB_DATABASE, $strNewUsername = DB_SERVER_USERNAME, $strNewPassword = DB_SERVER_PASSWORD) { $this->disconnect(); $this->blnIsConnected = false; $this->setServerName($strNewHost); $this->setDbName($strNewDatabase); $this->setDbUser($strNewUsername); $this->setDbPassword($strNewPassword); if( ! $this->connect()) return false; $this->blnIsConnected = true; return true; } // Utilities .. /** prepInput() * Returns string(s) suitable for database input with escaped * single quotes, slashes, etc.. Note: this is only accessable via * child classes - and used only if there is no valid objDatabaseHandle .. * which is unlikely and this may dissappear in future.. * *@access protected *@param mixed mixInput string or array to process * @return string the prepared string */ protected function prepInput($mixInput) { if(is_string($mixInput)) { if( get_magic_quotes_gpc() ) return $mixInput; return addslashes($mixInput); } elseif (is_array($mixInput)) { foreach($mixInput as $key => &$value) $mixInput[$key] = $this->prepInput($value); return $mixInput; } else return $mixInput; } public function isBad($strQuery) { if(eregi(self::BADNESS, $strQuery)) return true; return false; } /** fetchRow() * Returns the first row of results for a given query. * *@access public *@param string $strQuery query to process. * @return array results */ public function fetchRow ($strQuery) { $resultset = $this->doQuery($strQuery, true); return $this->nextRow($resultset); } /** getResultSet() * Returns a new result set for a given query, or the current * resultset internal to this class if not called with a query * string. * * This is essentially equivalent to doQuery($string, true). * *@access public *@param string strQuery query to process. * @return mixed mysqli_result or false */ public function getResultSet ($strQuery) { // Did we get a strQuery? If so, get new results and pass them on... if ($strQuery) return $this->doQuery($strQuery, true); } // Abstract public functions .. see child class for more complete documentation. // connect to server abstract public function connect(); // close connection abstract public function disconnect(); // return last insert id abstract public function getInsertId(); //send a query, return resultset handle or false on failure. abstract public function doQuery($strQuery, $blnReturnResultSet=false, $blnUnbuffered=true); // fetch the next row as an associative array, optionally supply result set to use, return 0 after last row. abstract public function nextRow($objResultSet=null, $blnReturnAssocArray = true); // return a string containing the error from the last query. abstract public function getDbError(); // perform a simple insert or update using an array of values with optional where clause abstract public function insertArray($strTable, $aryValues, $strAction = "INSERT", $strWhereClause = ""); // return number of rows in last result set, passing the result set is optional, // but _must_ be used in the case that you are using doQuery($q,true) abstract public function getNumRows($objResultSet=NULL); abstract public function changeDatabase($strNewDatabase); } ?>