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(); } } ?>