$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_*);
* Das selbe Verhalten soll auch diese Klasse wiedergeben. Da diese Klasse
* meistens Methoden von PDO verwendet, ist der Exception mode kein Problem:
* Exceptions werden hier nicht gefangen sondern gehen einfach weiter zum
* Aufrufer. Im Silent mode muss explizit nach Fehlern gefragt werden
* (Rückgabewert FALSE), und das müssen auch diese Methoden hier tun!
*
* @author Jakob Schöttl
*
*/
class DBAccess extends PDO {
function __construct() {
parent::__construct(PDO_DSN, DB_USERNAME, DB_PASSWORD);
// Error mode auf Exception -> try-catch
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// character_set_client + character_set_result auf utf8!
parent::exec("SET CHARACTER SET utf8");
}
/**
* Das SQL-Statement kann Platzhalter (?) enthalten; die Werte aus dem
* Array $params werden dort eingesetzt. $params darf auch leer, NULL oder
* FALSE sein.
* @param string $statement
* @param array $params
* @return PDOStatement
*/
private function parameterized_query($statement, $params) {
if ($params) {
$pdostmt = $this->prepare($statement);
if (!$pdostmt) {
return false;
}
$i = 0;
foreach ($params as &$v) {
$pdostmt->bindValue(++$i, $v);
}
// PDOStatement::execute: returns boolean
if (!$pdostmt->execute()) {
return false;
}
return $pdostmt;
} else {
return $this->query($statement);
}
}
/**
* Return the number of resulting rows of a query, optional under a
* condition. The query looks like this: SELECT COUNT(*) FROM
* $tblspec WHERE $cond
.
* So $tblspec
can be a single table name or more than one,
* joined tables e.g. kunde JOIN rechnung USING (idKunde)
.
*
* @param string $tblspec The table specification
* @param string $cond The WHERE
condition without the
* WHERE
keyword
* @return int
*/
function count($tblspec, $cond = null) {
return $this->pcount($tblspec, $cond);
}
/**
* Wie self::count, aber: Table specicification und Condition können
* Platzhalter für Parameter (?) enthalten, weitere Funktionsparameter
* werden für diese Platzhalter sicher als Strings eingesetzt.
* p für prepared/parameterized
*
* Example:
* $c = $dbh->pcount('mitarbeiter',
* "WHERE msmail LIKE ?", $mail);
*
* @param type $tblspec
* @param type $cond
* @return int
*/
function pcount($tblspec, $cond = null) {
$statement = "SELECT COUNT(*) FROM $tblspec";
if ($cond) {
$statement .= " WHERE $cond";
}
$args = func_get_args();
array_shift($args); // $tablespec weg
array_shift($args); // $cond weg
$result = $this->parameterized_query($statement, $args);
if (!$result) {
return false;
}
return $result->fetchColumn();
}
/**
* Wie PDO::query, aber: Statement kann Platzhalter für Parameter (?)
* enthalten, weitere Funktionsparameter werden für diese Platzhalter
* sicher als Strings eingesetzt.
* p für prepared/parameterized
*
* Example:
* $result = $dbh->pquery("SELECT * FROM mitarbeiter
* WHERE msmail LIKE ?", $mail);
*
* @param string $statement
* @return int
*/
function pquery($statement) {
$args = func_get_args();
array_shift($args);
return $this->parameterized_query($statement, $args);
}
/**
* Wie PDO::exec, aber: Statement kann Platzhalter für Parameter (?)
* enthalten, weitere Funktionsparameter werden für diese Platzhalter
* sicher als Strings eingesetzt.
* p für prepared/parameterized
*
* Example:
* $result = $dbh->pexec("INSERT mitarbeiter (id, msmail) VALUES
* (NULL, ?)", $mail);
*
* @param string $statement
* @return int
*/
function pexec($statement) {
$args = func_get_args();
array_shift($args); // $statement weg
$result = $this->parameterized_query($statement, $args);
// PDO::query: returns a PDOStatement object, or FALSE on failure.
// PDO::exec: returns FALSE on failure (auch wenn's nicht in
// Specification steht)!
if (!$result)
return false;
return $result->rowCount(); // Selbes Ergebnis wie PDO::exec
}
}