$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 } }