Source for file MDB2.php
Documentation is available at MDB2.php
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Lorenzo Alberton <l.alberton@quipo.it> |
// +----------------------------------------------------------------------+
// $Id: MDB2.php,v 1.2 2004/04/26 19:50:31 toby Exp $
require_once 'Auth/Container.php';
* Storage driver for fetching login data from a database
* This storage driver can use all databases which are supported
* by the PEAR MDB2 abstraction layer to fetch login data.
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @version $Revision: 1.2 $
* Additional options for the storage container
* User that is currently selected from the DB.
* Constructor of the container class
* Initate connection to the database via PEAR::MDB2
* @param string Connection data or MDB2 object
* @return object Returns an error object if something went wrong
$this->_parseOptions ($dsn);
if (empty ($this->options['dsn'])) {
PEAR ::raiseError ('No connection parameters specified!');
* Connect to database by using the given DSN string
* @param mixed DSN string | array | mdb object
* @return mixed Object on error, otherwise bool
$this->db = & MDB2 ::connect ($dsn);
} elseif (is_a($dsn, 'MDB2_Driver_Common')) {
} elseif (is_object($dsn) && MDB2 ::isError ($dsn)) {
return PEAR ::raiseError ($dsn->getMessage (), $dsn->code );
return PEAR ::raiseError ('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__ ,
if (MDB2 ::isError ($this->db) || PEAR ::isError ($this->db)) {
return PEAR ::raiseError ($this->db->getMessage (), $this->db->code );
* Prepare database connection
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
* @return mixed True or a MDB error object.
return $this->_connect ($this->options['dsn']);
* Prepare query to the database
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
* After that the query is passed to the database.
* @param string Query string
* @return mixed a MDB_result object or MDB_OK on success, a MDB
* or PEAR error on failure
$err = $this->_prepare ();
return $this->db->query ($query);
* Set some default options
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['cryptType'] = 'md5';
* Parse options passed to the container class
function _parseOptions ($array)
foreach ($array as $key => $value) {
// Include additional fields if they exist
if (!empty ($this->options['db_fields'])) {
* Get user information from database
* This function uses the given username to fetch
* the corresponding login data from the database
* table. If an account that matches the passed username
* and password is found, the function returns true.
* Otherwise it returns false.
* @return mixed Error object or boolean
// Prepare for a database query
$err = $this->_prepare ();
return PEAR ::raiseError ($err->getMessage (), $err->getCode ());
// Find if db_fileds contains a *, i so assume all col are selected
$sql_from = $this->options['usernamecol'] . ', '. $this->options['passwordcol'] . $this->options['db_fields'];
$query = sprintf("SELECT %s FROM %s WHERE %s = %s",
$this->db->quote ($username, 'text')
$res = $this->db->queryRow ($query, null , MDB2_FETCHMODE_ASSOC );
if (MDB2 ::isError ($res) || PEAR ::isError ($res)) {
return PEAR ::raiseError ($res->getMessage (), $res->getCode ());
// Store additional field values in the session
foreach ($res as $key => $value) {
if ($key == $this->options['passwordcol'] ||
$key == $this->options['usernamecol']) {
// Use reference to the auth object if exists
// This is because the auth session variable can change so a static call to setAuthData does not make sense
if (isset ($this->_auth_obj) && is_object($this->_auth_obj)) {
$this->_auth_obj->setAuthData ($key, $value);
$err = $this->_prepare ();
return PEAR ::raiseError ($err->getMessage (), $err->getCode ());
// Find if db_fileds contains a *, i so assume all col are selected
$sql_from = $this->options['db_fields'];
$query = sprintf('SELECT %s FROM %s',
$res = $this->db->queryAll ($query, null , MDB2_FETCHMODE_ASSOC );
if (MDB2 ::isError ($res)) {
return PEAR ::raiseError ($res->getMessage (), $res->getCode ());
foreach ($res as $user) {
$user['username'] = $user[$this->options['usernamecol']];
* Add user to the storage container
* @param mixed Additional information that are stored in the DB
* @return mixed True on success, otherwise error object
function addUser($username, $password, $additional = "")
if (isset ($this->options['cryptType']) && $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
$cryptFunction = $this->options['cryptType'];
foreach ($additional as $key => $value) {
$additional_key .= ', ' . $key;
$additional_value .= ', ' . $this->db->quote ($value, 'text');
$query = sprintf("INSERT INTO %s (%s, %s%s) VALUES (%s, %s%s)",
$this->db->quote ($username, 'text'),
$this->db->quote ($cryptFunction($password), 'text'),
$res = $this->query($query);
if (MDB2 ::isError ($res)) {
return PEAR ::raiseError ($res->getMessage (), $res->code );
* Remove user from the storage container
* @return mixed True on success, otherwise error object
$query = sprintf("DELETE FROM %s WHERE %s = %s",
$this->db->quote ($username, 'text')
$res = $this->query($query);
if (MDB2 ::isError ($res)) {
return PEAR ::raiseError ($res->getMessage (), $res->code );
* Change password for user in the storage container
* @param string The new password
if (isset ($this->options['cryptType']) && $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
$cryptFunction = $this->options['cryptType'];
$query = sprintf("UPDATE %s SET %s = %s WHERE %s = %s",
$this->db->quote ($password, 'text'),
$this->db->quote ($username, 'text')
$res = $this->query($query);
if (MDB2 ::isError ($res)) {
return PEAR ::raiseError ($res->getMessage (), $res->code );
Documentation generated on Mon, 11 Mar 2019 13:52:33 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|