<?php
/* Class `Semi-ADOŽ
* This class provides methods for MySQL very similar to those in the ADO class found
* in Microsoft .NET
*
* Written by Laurens Ramandt
*
*
* USAGE:
* - provide the SQL statement as a constructor parameter
*
* - use executeNonQuery for queries which do not return any values such as
* insertion/deletion queries
* - use executeScalar if you need a query to return just one value (e.g.
* password validation)
* - use executeReader if you need to read multiple rows in a query
* The result is returned as a two-dimensional array. The fist dimension
* is the row number, the second one is the field/column number
*
* - You can use parameterized queries (cfr SetParamOfType methods).
*
* CONFIGURATION: - scroll down to lines 78-88
*
* EXAMPLES:
all 3 executing methods can handle parameterized queries
executeScalar example - used for queries which return maximum one result:
<CODE>
$objQry = new dbQuery("SELECT password FROM tblUsers WHERE username=:myusername");
$objQry->setParamOfTypeString(":myusername", "Administrator");
$result = $objQry->executeScalar();
if($result)
{
echo "The password of Administrator is " . $result . "<br>";
}else
{
echo "User was not found.<br>";
}
</CODE>
You can re-use the dbQuery object with different parameter values
executeReader example - used for queries returning multiple rows with multiple fields
Returns a multidimensional array. The first dimension refers to
the row number, the second dimension to the field number.
<CODE>
$objQry = new dbQuery("SELECT name FROM tblPupils");
$result=$objQry->executeReader();
foreach($result as $row){
echo "Name: " . $row[0] . "<br>";
}
</CODE>
executeNonQuery example - needed to perform a query which doesn't return any value
<CODE>
$objQry = new dbQuery("DELETE FROM users WHERE userID=:banneduserid");
$objQry->setParamOfTypeInteger(":banneduserid", 20);
$objQry->executeNonQuery();
</CODE>
*/
class dbQuery
{
// please provide your SQL connection details below
// optionally provide the computer name of the testing machine, in uppercase letters
private $testingMachineName = "TESTINGMACHINENAME";
// set this to true if you want the class always to use the $online connection details
// in other words: when you don't have a testing server
private $alwaysUseOnlineDatabase = false;
// testing/development database server
private $testingdbUser = 'root';
private $testingdbPass = '';
private $testingdbHost = 'localhost';
private $testingdbName = 'testing_database';
// online/public database server
private $onlinedbUser = '';
private $onlinedbPass = '';
private $onlinedbHost = 'localhost';
private $onlinedbName = 'production_database';
// you don't have to change anything below this line
private $dbuser = '';
private $dbpass = '';
private $dbhost = '';
private $dbname = '';
// constructor and destructor
public function __construct($pquery)
{
if($this->alwaysUseOnlineDatabase)
{
$this->dbuser = $this->onlinedbUser;
$this->dbpass = $this->onlinedbPass;
$this->dbhost = $this->onlinedbHost;
$this->dbname = $this->onlinedbName;
}else
{
if(strtoupper(getenv('COMPUTERNAME')) == $this->testingMachineName)
{
$this->dbuser = $this->testingdbUser;
$this->dbpass = $this->testingdbPass;
$this->dbhost = $this->testingdbHost;
$this->dbname = $this->testingdbName;
}else
{
$this->dbuser = $this->onlinedbUser;
$this->dbpass = $this->onlinedbPass;
$this->dbhost = $this->onlinedbHost;
$this->dbname = $this->onlinedbName;
}
}
// set parameter to true for a persistent connection
$this->dbConnection = $this->pdoConnect(FALSE);
// still save the query in plain text
$this->sql = $pquery;
// parse query
if(empty($this->dbConnection)){
die("Class dbQuery could not connect to database. Check config.inc.php and database credentials.");
}else{
$this->stmt = $this->dbConnection->prepare($pquery);
}
}
public function __destruct()
{
unset($this->dbConnection);
}
//contains the handler to the database connection
private $dbConnection;
private $sql; // contains the SQL statement in plain text
private $stmt; // contains the prepared SQL statement
private function pdoConnect($persistent = true)
{
// initializes the database connection and returns a handle
$dbtype = 'mysql';
try
{
if ($persistent)
{
$dbh = new PDO($dbtype.':host='.$this->dbhost.';dbname='.$this->dbname, $this->dbuser,
$this->dbpass, array(PDO::ATTR_PERSISTENT => true));
return $dbh;
}
else
{
$dbh = new PDO($dbtype.':host='.$this->dbhost.';dbname='.$this->dbname, $this->dbuser,
$this->dbpass);
return $dbh;
}
}
catch (PDOException $e)
{
return false;
}
}
//parameters
// usage: e.g. $objDbQry->setParamOfTypeString(":name", "Einstein");
public function setParamOfTypeString($pname, $pvalue)
{
$this->stmt->bindParam($pname, $pvalue, PDO::PARAM_STR);
}
public function setParamOfTypeInteger($pname, $pvalue)
{
if(!is_int($pvalue)){
try{
$pvalue = intval($pvalue, 10);
$this->stmt->bindParam($pname, $pvalue, PDO::PARAM_INT);
} catch(Exception $e){
return false;
}
}else{
$this->stmt->bindParam($pname, $pvalue, PDO::PARAM_INT);
}
}
public function setParamOfCustomType($pname, $pvalue, $ptype)
{
$this->stmt->bindParam($pname, $pvalue, $ptype);
}
public function setParamOfTypeBool($pname, $pvalue)
{
$this->stmt->bindParam($pname, $pvalue, PDO::PARAM_BOOL);
}
public $rowCount;
//executemethods ~scalar / reader / nonquery
// executeScalar returns the first value in the first row of the query result
// returns false when there is no query result
public function executeScalar()
{
$this->stmt->execute();
$this->rowCount = $this->stmt->rowCount();
if($this->rowCount > 0){
return $this->stmt->fetchColumn();
}else{
return false;
}
}
//executeReader returns a multidimensional array containing the query result
//the first dimension refers to the row number, the second dimension refers to the
//column number
public function executeReader()
{
$arrData;
$this->rowCount = 0;
try {
$this->stmt->execute();
while ($row = $this->stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
for($i=0; $i<=count($row)-1; $i++){
$arrData[$this->rowCount][$i] = $row[$i];
}
$this->rowCount++;
}
$stmt = null;
if(isset($arrData))
return $arrData;
}
catch (PDOException $e) {
print $e->getMessage();
return FALSE;
}
}
//executeNonQuery is used for queries which do not need to return any value
//for example deletion queries. Despite this goal, it still returns the number
//of rows affected by the query.
public function executeNonQuery()
{
$this->stmt->execute();
$this->rowCount = $this->stmt->rowCount();
}
// returns the auto_increment id of the last inserted row
public function getLastInsertID(){
return $this->dbConnection->lastInsertId();
}
}
?>
|