Source for file MDB.php
Documentation is available at MDB.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: MDB.php,v 1.15 2004/03/30 17:39:04 quipo 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 MDB abstraction layer to fetch login data.
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @version $Revision: 1.15 $
* 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::MDB
* @param string Connection data or MDB 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 = & MDB ::Connect ($dsn);
} elseif (is_object($dsn) && MDB ::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 (MDB ::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->getTextValue ($username)
$res = $this->db->getRow ($query, null , null , null , MDB_FETCHMODE_ASSOC );
if (MDB ::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 sence
$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->getAll ($query, null , null , null , MDB_FETCHMODE_ASSOC );
if (MDB ::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->getTextValue ($value);
$query = sprintf("INSERT INTO %s (%s, %s%s) VALUES (%s, %s%s)",
$this->db->getTextValue ($username),
$this->db->getTextValue ($cryptFunction($password)),
$res = $this->query($query);
if (MDB ::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->getTextValue ($username)
$res = $this->query($query);
if (MDB ::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->getTextValue ($password),
$this->db->getTextValue ($username)
$res = $this->query($query);
if (MDB ::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.
|