<?php
|
|
|
|
/**
|
|
* QuasiMysql - driver class for a MySQL database server.
|
|
* This class inherits QuasiDBI, implementing the actual
|
|
* connection and query methods. Do _not_ use this class
|
|
* directly! Use QuasiDBI::getInstance() to retrieve a dbi object
|
|
* or QuasiDBI::getInstance()->method().
|
|
*
|
|
* Note: We use the newer mysqli functions so this requires PHP5
|
|
* and MySQL 4.1 and above.
|
|
*
|
|
* @author Erik Winn <ewinn@erikwinn.com>
|
|
*
|
|
* $Id: QuasiMysql.class.php 97 2008-08-29 21:36:11Z erikwinn $
|
|
*
|
|
*@version 0.2
|
|
*
|
|
* @copyright Erik Winn 2008
|
|
* @license GPL v.2
|
|
* @class
|
|
*/
|
|
|
|
|
|
class QuasiMysql extends QuasiDBI
|
|
{
|
|
|
|
/** connect()
|
|
* Connects to the db server, setting $objDatabaseHandle to the current link to db
|
|
*@access public
|
|
* @return boolean true on success or false
|
|
*/
|
|
|
|
public function connect()
|
|
{
|
|
// We don't handle persistent connections. Yet, at least.
|
|
// if( defined(USE_PCONNECT) && USE_PCONNECT == true );
|
|
|
|
$this->objDatabaseHandle = mysqli_init();
|
|
|
|
/* If DB_USE_SSL is defined, we attempt to set some parameters. A client key,
|
|
client certificate, and CA certificate matching the one on the server
|
|
must be available on the local filesystem. */
|
|
|
|
if ( defined('DB_USE_SSL') && true === DB_USE_SSL )
|
|
$this->objDatabaseHandle->ssl_set(DB_SSL_KEY, DB_SSL_CERT, DB_SSL_CA_CERT, null, null);
|
|
|
|
$this->objDatabaseHandle->real_connect($this->strDatabaseServer,
|
|
$this->strUsername,
|
|
$this->strPassword,
|
|
$this->strDatabase);
|
|
|
|
/* make sure we are connected */
|
|
if (mysqli_connect_errno())
|
|
{
|
|
$this->strErrors .= "Connection to database failed in QuasiMysql: " . mysqli_connect_error() . "\n";
|
|
$this->blnIsConnected = false;
|
|
return false;
|
|
}
|
|
|
|
$this->blnIsConnected = true;
|
|
return true;
|
|
}
|
|
|
|
/** disconnect()
|
|
* Closes current connection.
|
|
*@access public
|
|
*
|
|
*/
|
|
public function disconnect()
|
|
{
|
|
if($this->objDatabaseHandle)
|
|
$this->objDatabaseHandle->close();
|
|
$this->blnIsConnected = false;
|
|
}
|
|
|
|
/** getInsertId()
|
|
* Returns the insert id of the most recent insert action.
|
|
*@access public
|
|
* @return integer insert id of last query.
|
|
*/
|
|
public function getInsertId()
|
|
{
|
|
if($this->objDatabaseHandle)
|
|
return $this->objDatabaseHandle->insert_id;
|
|
return 0;
|
|
}
|
|
|
|
/** doQuery()
|
|
* Send a preformatted (i.e. complete) query to the server.
|
|
* NOTE:With out the second parameter, this stores the result in
|
|
* $objResultSet which we manage internally -- CAUTION: if you
|
|
* intend to conduct new queries in a loop based on data from rows in the
|
|
* first result set, you MUST accept the result set handle and pass
|
|
* it to nextRow or else the rows from the first query _will_ be overwritten!!
|
|
*
|
|
*@access public
|
|
*@param string strQuery string
|
|
*@param boolean blnReturnResultSet - return a copy of the result set
|
|
*@param boolean blnUnbuffered - use MYSQLI_USE_RESULT, ie. do not buffer results on the server
|
|
* @return mixed mysqli_result on success or false
|
|
*/
|
|
public function doQuery($strQuery, $blnReturnResultSet=false, $blnUnbuffered=true )
|
|
{// todo - optionally use MYSQLI_USE_RESULT, set in config?
|
|
if(! $this->objDatabaseHandle)
|
|
return false;
|
|
|
|
// clean up the string
|
|
if($this->isBad($strQuery))
|
|
return false;
|
|
|
|
$objResultSet = $this->objDatabaseHandle->query($strQuery);
|
|
|
|
if($objResultSet === false)
|
|
{ //query of any kind failed ..
|
|
$this->strDbErrors .= $this->objDatabaseHandle->error;
|
|
return false;
|
|
}
|
|
|
|
if($blnReturnResultSet)
|
|
return $objResultSet;
|
|
else
|
|
$this->objResultSet =& $objResultSet;
|
|
|
|
return $this->objResultSet;
|
|
}
|
|
|
|
/** nextRow()
|
|
* Fetches the next row of most recent result set as an associative array,
|
|
* where $key = column name and $value = column value.
|
|
* Optionally, you may provide the parameter false to return a simple
|
|
* numerically indexed array of column values.
|
|
* Returns 0 after last row.
|
|
*
|
|
* You may optionally provide the result set through which to iterate
|
|
* as the first parameter - by default we use the result set internal
|
|
* to this class.
|
|
*
|
|
*@access public
|
|
*@param object $objResultSet - object of type mysqli_result
|
|
*@param boolean $blnReturnAssocArray=true returns an associative array, or false for numerical index keys
|
|
* @return mixed object|integer
|
|
*/
|
|
public function nextRow($objResultSet=NULL,$blnReturnAssocArray=true)
|
|
{
|
|
if(!$this->getNumRows() && ! $objResultSet)
|
|
return 0;
|
|
if( ! $objResultSet)
|
|
{
|
|
if($blnReturnAssocArray)
|
|
return $this->objResultSet->fetch_assoc();
|
|
else // numerical indices ..
|
|
return $this->objResultSet->fetch_array();
|
|
}
|
|
//use provided result set ..
|
|
if($blnReturnAssocArray)
|
|
return $objResultSet->fetch_assoc();
|
|
else // numerical indices ..
|
|
return $objResultSet->fetch_array();
|
|
}
|
|
|
|
/** getDbError()
|
|
*Returns a string containing the db error from the last query
|
|
* including errorno...
|
|
*@access public
|
|
* @return string errors
|
|
*/
|
|
public function getDbError()
|
|
{
|
|
//erm, this is confused ..todo: work out sensible error reporting ..
|
|
if($this->objDatabaseHandle->errorno)
|
|
$this->strDbErrors = $this->objDatabaseHandle->error . "\n Error No.:" . $this->objDatabaseHandle->errorno ;
|
|
return $this->strDbErrors;
|
|
}
|
|
|
|
/** insertArray
|
|
* Perform a simple insert or update on a specified table with
|
|
* an array - adds a where clause filter when using UPDATE,
|
|
* eg. $where = "name like 'joe' ", or $where = " id = $idno ".
|
|
*
|
|
* $aryValues must be an associative array in the format:
|
|
* 'columname' = 'columnvalue'
|
|
* Examples:
|
|
insertArray($tablename, array('col1'=>'bar', 'col2' = 'baz') )
|
|
insertArray($tablename, array('col1'=>'bar', 'col2' = 'baz'), 'update', $where )
|
|
*
|
|
*
|
|
*@access public
|
|
*@param string $strTable - which table to address
|
|
*@param object $aryValues - assoc array of values to insert|update
|
|
*@param string $strAction - may be either INSERT or UPDATE (case insensitive)
|
|
*@param string $where - optional WHERE [conditions]
|
|
*
|
|
* @return boolean true on success or false
|
|
*/
|
|
public function insertArray( $strTable, $aryValues, $strAction = "INSERT", $where = '')
|
|
{
|
|
if(!is_array($aryValues) || !isset($aryValues))
|
|
{
|
|
$this->strErrors .= "insertArray called with bad array ..";
|
|
return false;
|
|
}
|
|
$strAction = trim(strtoupper($strAction));
|
|
$numcols = count($aryValues);
|
|
$strQuery = '';
|
|
if($strAction == 'INSERT')
|
|
{
|
|
$strQuery = 'INSERT INTO ' . $strTable;
|
|
$cols = ' (';
|
|
$vals = ' VALUES (';
|
|
$i=0;
|
|
foreach($aryValues as $col => $val)
|
|
{
|
|
$i++;
|
|
$end = $i < $numcols ? ", " : ") ";
|
|
//if(empty($val)) continue;
|
|
$cols .= $col . $end;
|
|
if(trim(strtoupper($val)) === "NOW()" || trim(strtoupper($val)) === "NULL")
|
|
$vals .= $val;
|
|
else
|
|
$vals .= " '" . $val . "' ";
|
|
$vals .= $end;
|
|
}
|
|
$strQuery .= $cols . $vals;
|
|
}
|
|
elseif($strAction == 'UPDATE')
|
|
{
|
|
$strQuery = 'UPDATE ' . $strTable . ' SET ';
|
|
$cols = '';
|
|
$i=0;
|
|
foreach($aryValues as $col => $val)
|
|
{
|
|
$i++;
|
|
$end = $i < $numcols ? ", " : " ";
|
|
//if(empty($val)) continue;
|
|
$cols .= $col . ' = ';
|
|
if(trim(strtoupper($val)) === "NOW()" || trim(strtoupper($val)) === "NULL")
|
|
$vals = $val;
|
|
else
|
|
$vals = " '" . $val . "' ";
|
|
$cols .= $vals . $end;
|
|
}
|
|
$strQuery .= $cols;
|
|
}
|
|
if(!empty($where))
|
|
$strQuery .= ' WHERE ' . $where;
|
|
|
|
return $this->doQuery($strQuery);
|
|
|
|
}
|
|
|
|
/** getNumRows()
|
|
* Returns the number of rows in the most recent result set.
|
|
* Note: if you are using a returned objResultSet from doQuery($strQuery,true)
|
|
* you _must_ provide it as a parameter to get an accurate count.
|
|
*
|
|
*@access public
|
|
*
|
|
*@param object $objResultSet - object of type mysqli_result
|
|
* @return integer number of rows
|
|
*/
|
|
public function getNumRows($objResultSet=NULL)
|
|
{
|
|
if($objResultSet)
|
|
return $objResultSet->num_rows;
|
|
|
|
if(!$this->objDatabaseHandle || !$this->objResultSet)
|
|
return 0;
|
|
return $this->objResultSet->num_rows;
|
|
}
|
|
|
|
/** getAffectedRows()
|
|
* Returns the number of rows affected by the most recent query.
|
|
* Note: if you are using a returned objResultSet from doQuery($strQuery,true)
|
|
* you _must_ provide it as a parameter to get an accurate count.
|
|
*
|
|
*@access public
|
|
*
|
|
*@param object $objResultSet - object of type mysqli_result
|
|
* @return integer number of rows
|
|
*/
|
|
public function getAffectedRows($objResultSet=NULL)
|
|
{
|
|
if($objResultSet)
|
|
return $objResultSet->affected_rows;
|
|
|
|
if(!$this->objDatabaseHandle || !$this->objResultSet)
|
|
return 0;
|
|
return $this->objResultSet->affected_rows;
|
|
}
|
|
|
|
|
|
/** prepInput()
|
|
* Returns a string suitable for database input with escaped
|
|
* single quotes, slashes, etc.. Use this to clean up a string or
|
|
* array of strings from the outside world before constructing
|
|
* a query. Note: do not use this on the whole query esp. if you have
|
|
* single quotes in eg. the where clause - that will cause a mysql error.
|
|
* Note also that we trim whitespace from input string.
|
|
* Example:
|
|
* $safe = $dbi->prepInput($_GET[unsafe]);
|
|
* $query = 'SELECT foo FROM table WHERE bar LIKE \'' . $safe . '\' [AND other conditions ] ';
|
|
* Wrong: $dbi->prepare($query);
|
|
* Characters escaped are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.
|
|
*
|
|
* !! RUDENESS ALERT !! If input has MySQL injection attempts like LOAD DATA
|
|
* ( see QuasiDBI::BADNESS ) this will return an empty string!!!
|
|
*
|
|
*@access public
|
|
*@param string | array $input string or array to process
|
|
* @return mixed string|array query safe string or array
|
|
*/
|
|
public function prepInput($input)
|
|
{
|
|
if(!$this->objDatabaseHandle ) //shouldn't happen but momma's don't need objDatabaseHandle so ..
|
|
return parent::prepInput($input);
|
|
if(is_string($input))
|
|
{
|
|
// remove magic quotes and let mysqli escape the string below
|
|
if(get_magic_quotes_gpc())
|
|
$t_input = trim(stripslashes($input));
|
|
else
|
|
$t_input = trim($input);
|
|
|
|
// check for prohibited SQL ..
|
|
if($this->isBad($t_input))
|
|
{//TODO: - error msg ..
|
|
$t_input = "";
|
|
return $t_input;
|
|
}
|
|
return $this->objDatabaseHandle->escape_string( $t_input);
|
|
}
|
|
elseif (is_array($input))
|
|
{
|
|
foreach($input as $key => &$value)
|
|
$input[$key] = $this->prepInput($value);
|
|
return $input;
|
|
} else
|
|
return $input;
|
|
}
|
|
|
|
/**changeDatabase
|
|
*Resets the default database for queries and ensures that there
|
|
* is a valid connection. returns false if this fails or if there
|
|
* is not a valid objDatabaseHandle, or if connect fails ..
|
|
*@access public
|
|
*@param string $strNewDatabase - new database name
|
|
* @return boolean true on success or false
|
|
*/
|
|
public function changeDatabase($strNewDatabase)
|
|
{
|
|
if(!$this->objDatabaseHandle )
|
|
{
|
|
$this->strDbErrors .= "Change database called with no objDatabaseHandle!!";
|
|
return false;
|
|
}
|
|
|
|
$this->setDbName($strNewDatabase);
|
|
if(!$this->isConnected())
|
|
return $this->connect();
|
|
else
|
|
return $this->objDatabaseHandle->select_db($strNewDatabase);
|
|
}
|
|
|
|
/**
|
|
*just a comment template - ignore at will ..
|
|
*@access public
|
|
*@param string foo
|
|
* @return boolean true on success or false
|
|
*/
|
|
|
|
}
|
|
|
|
?>
|