151 lines
4.5 KiB
PHP
151 lines
4.5 KiB
PHP
<?php
|
|
class DatabaseConnection
|
|
{
|
|
private $strEngine;
|
|
private $strHost;
|
|
private $strDatabaseName;
|
|
private $strUsername;
|
|
private $strPassword;
|
|
private $pdo;
|
|
|
|
public function __construct(
|
|
$strEngine = null,
|
|
$strHost = null,
|
|
$strDatabaseName = null,
|
|
$strUsername = null,
|
|
$strPassword = null)
|
|
{
|
|
$this->strEngine = $strEngine;
|
|
|
|
switch ($strEngine)
|
|
{
|
|
case "sqlsrv":
|
|
$this->pdo = new PDO(
|
|
"sqlsrv:Server={$strHost};Database={$strDatabaseName}",
|
|
$strUsername,
|
|
$strPassword);
|
|
break;
|
|
|
|
case "mysql":
|
|
$this->pdo = new PDO(
|
|
"mysql:host={$strHost};dbname={$strDatabaseName}",
|
|
$strUsername,
|
|
$strPassword);
|
|
break;
|
|
|
|
case "sqlite":
|
|
$strFileName = $strHost;
|
|
if ($strFileName == null || strlen($strFileName) < 1)
|
|
$strFileName = ":memory:";
|
|
|
|
$this->pdo = new PDO("sqlite:{$strFileName}");
|
|
break;
|
|
|
|
default:
|
|
throw new Exception("Unknown database engine {$strEngine}.");
|
|
}
|
|
|
|
$this->pdo->setAttribute(
|
|
PDO::ATTR_ERRMODE,
|
|
PDO::ERRMODE_EXCEPTION);
|
|
}
|
|
|
|
public function query($input)
|
|
{
|
|
$varArgs = self::flatten(func_get_args());
|
|
|
|
if (count($varArgs) < 1)
|
|
throw new Exception("query takes at least one argument, the query!");
|
|
|
|
$strQuery = array_shift($varArgs);
|
|
$strQuery = file_exists("db/{$strQuery}")?
|
|
file_get_contents("db/{$strQuery}") :
|
|
$strQuery;
|
|
|
|
if ($this->strEngine == "sqlsrv")
|
|
$strQuery = "set nocount on; {$strQuery}";
|
|
|
|
$varStatement = $this->pdo->prepare($strQuery);
|
|
|
|
if (count($varArgs) > 0)
|
|
$varStatement->execute($varArgs);
|
|
else $varStatement->execute();
|
|
|
|
$varTemp = array();
|
|
$varOutput = array();
|
|
|
|
// Engines that do not support multiple rowsets:
|
|
if (in_array($this->strEngine, array("sqlite")))
|
|
{
|
|
while ($varRow = $varStatement->fetch())
|
|
{
|
|
$varNewRow = array();
|
|
|
|
foreach ($varRow as $k => $v)
|
|
if (!is_numeric($k))
|
|
$varNewRow[$k] = $v;
|
|
|
|
$varOutput[] = $varNewRow;
|
|
}
|
|
|
|
return $varOutput;
|
|
}
|
|
|
|
do
|
|
{
|
|
try { $varTemp[] = $varStatement->fetchAll(); }
|
|
catch (Exception $x) {}
|
|
}
|
|
while ($varStatement->nextRowset());
|
|
|
|
foreach ($varTemp as $i => $varSet)
|
|
foreach ($varSet as $j => $varRow)
|
|
{
|
|
$varNewRow = array();
|
|
|
|
foreach ($varRow as $k => $v)
|
|
if (!is_numeric($k))
|
|
$varNewRow[$k] = $v;
|
|
|
|
$varOutput[] = $varNewRow;
|
|
}
|
|
|
|
return $varOutput;
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
|
|
// Used to combine a mixture of values and arrays of values as one flat array of values in the order they arrive in. For example: self::flatten("a", ["b", "c", ["d", "e", "f"], "g"], "h") should return an array of ["a", "b", "c", "d", "e", "f", "g", "h"].
|
|
private static function flatten(...$args)
|
|
{
|
|
if (is_null($args))
|
|
return array();
|
|
|
|
if (count($args) > 0)
|
|
{
|
|
$varOutput = array();
|
|
$varFirst = array_shift($args);
|
|
|
|
if (is_array($varFirst))
|
|
foreach ($varFirst as $varItem)
|
|
$varOutput = array_merge($varOutput, self::flatten($varItem));
|
|
else
|
|
array_push($varOutput, $varFirst);
|
|
|
|
if (count($args) > 0)
|
|
$varOutput = array_merge($varOutput, self::flatten($args));
|
|
|
|
return $varOutput;
|
|
}
|
|
else
|
|
return array();
|
|
}
|
|
}
|
|
?>
|