Skip to content
Snippets Groups Projects
Select Git revision
  • 909d6928acb47cb9b50740e589b5e7447353e19c
  • 11.x default protected
  • 11.2.x protected
  • 10.6.x protected
  • 10.5.x protected
  • 11.1.x protected
  • 10.4.x protected
  • 11.0.x protected
  • 10.3.x protected
  • 7.x protected
  • 10.2.x protected
  • 10.1.x protected
  • 9.5.x protected
  • 10.0.x protected
  • 9.4.x protected
  • 9.3.x protected
  • 9.2.x protected
  • 9.1.x protected
  • 8.9.x protected
  • 9.0.x protected
  • 8.8.x protected
  • 10.5.1 protected
  • 11.2.2 protected
  • 11.2.1 protected
  • 11.2.0 protected
  • 10.5.0 protected
  • 11.2.0-rc2 protected
  • 10.5.0-rc1 protected
  • 11.2.0-rc1 protected
  • 10.4.8 protected
  • 11.1.8 protected
  • 10.5.0-beta1 protected
  • 11.2.0-beta1 protected
  • 11.2.0-alpha1 protected
  • 10.4.7 protected
  • 11.1.7 protected
  • 10.4.6 protected
  • 11.1.6 protected
  • 10.3.14 protected
  • 10.4.5 protected
  • 11.0.13 protected
41 results

database.mysql.inc

Blame
  • user avatar
    - #28159: Advanced search features (hello from DrupalCon)
    Steven Wittens authored
    Presentation about it:
    http://www.acko.net/files/drupal-search-slim.pdf
    909d6928
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    database.mysql.inc 10.21 KiB
    <?php
    // $Id$
    
    /**
     * @file
     * Database interface code for MySQL database servers.
     */
    
    /**
     * @ingroup database
     * @{
     */
    
    /**
     * Initialize a database connection.
     *
     * Note that you can change the mysql_connect() call to mysql_pconnect() if you
     * want to use persistent connections. This is not recommended on shared hosts,
     * and might require additional database/webserver tuning. It can increase
     * performance, however, when the overhead to connect to your database is high
     * (e.g. your database and web server live on different machines).
     */
    function db_connect($url) {
      $url = parse_url($url);
    
      // Allow for non-standard MySQL port.
      if (isset($url['port'])) {
         $url['host'] = $url['host'] .':'. $url['port'];
      }
    
      // - TRUE makes mysql_connect() always open a new link, even if
      //   mysql_connect() was called before with the same parameters.
      //   This is important if you are using two databases on the same
      //   server.
      // - 2 means CLIENT_FOUND_ROWS: return the number of found
      //   (matched) rows, not the number of affected rows.
      $connection = @mysql_connect($url['host'], $url['user'], $url['pass'], TRUE, 2);
      if (!$connection) {
        drupal_maintenance_theme();
        drupal_set_title('Unable to connect to database server');
        print theme('maintenance_page', '<p>This either means that the username and password information in your <code>settings.php</code> file is incorrect or we can\'t contact the MySQL database server. This could mean your hosting provider\'s database server is down.</p>
    <p>The MySQL error was: '. theme('placeholder', mysql_error()) .'.</p>
    <p>Currently, the username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.</p>
    <ul>
      <li>Are you sure you have the correct username and password?</li>
      <li>Are you sure that you have typed the correct hostname?</li>
      <li>Are you sure that the database server is running?</li>
    </ul>
    <p>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.</p>');
        exit;
      }
    
      if (!mysql_select_db(substr($url['path'], 1))) {
        drupal_maintenance_theme();
        drupal_set_title('Unable to select database');
        print theme('maintenance_page', '<p>We were able to connect to the MySQL database server (which means your username and password is okay) but not able to select the database.</p>
    <p>The MySQL error was: '. theme('placeholder', mysql_error()) .'.</p>
    <p>Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .'. The username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.</p>
    <ul>
      <li>Are you sure you have the correct database name?</li>
      <li>Are you sure the database exists?</li>
      <li>Are you sure the username has permission to access the database?</li>
    </ul>
    <p>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.</p>');
        exit;
      }
    
      return $connection;
    }
    
    /**
     * Helper function for db_query().
     */
    function _db_query($query, $debug = 0) {
      global $active_db, $queries;
    
      if (variable_get('dev_query', 0)) {
        list($usec, $sec) = explode(' ', microtime());
        $timer = (float)$usec + (float)$sec;
      }
    
      $result = mysql_query($query, $active_db);
    
      if (variable_get('dev_query', 0)) {
        list($usec, $sec) = explode(' ', microtime());
        $stop = (float)$usec + (float)$sec;
        $diff = $stop - $timer;
        $queries[] = array($query, $diff);
      }
    
      if ($debug) {
        print '<p>query: '. $query .'<br />error:'. mysql_error() .'</p>';
      }
    
      if (!mysql_errno()) {
        return $result;
      }
      else {
        trigger_error(mysql_error() ."\nquery: ". htmlspecialchars($query), E_USER_ERROR);
        return FALSE;
      }
    }
    
    /**
     * Fetch one result row from the previous query as an object.
     *
     * @param $result
     *   A database query result resource, as returned from db_query().
     * @return
     *   An object representing the next row of the result. The attributes of this
     *   object are the table fields selected by the query.
     */
    function db_fetch_object($result) {
      if ($result) {
        return mysql_fetch_object($result);
      }
    }
    
    /**
     * Fetch one result row from the previous query as an array.
     *
     * @param $result
     *   A database query result resource, as returned from db_query().
     * @return
     *   An associative array representing the next row of the result. The keys of
     *   this object are the names of the table fields selected by the query, and
     *   the values are the field values for this result row.
     */
    function db_fetch_array($result) {
      if ($result) {
        return mysql_fetch_array($result, MYSQL_ASSOC);
      }
    }
    
    /**
     * Determine how many result rows were found by the preceding query.
     *
     * @param $result
     *   A database query result resource, as returned from db_query().
     * @return
     *   The number of result rows.
     */
    function db_num_rows($result) {
      if ($result) {
        return mysql_num_rows($result);
      }
    }
    
    /**
     * Return an individual result field from the previous query.
     *
     * Only use this function if exactly one field is being selected; otherwise,
     * use db_fetch_object() or db_fetch_array().
     *
     * @param $result
     *   A database query result resource, as returned from db_query().
     * @param $row
     *   The index of the row whose result is needed.
     * @return
     *   The resulting field.
     */
    function db_result($result, $row = 0) {
      if ($result && mysql_num_rows($result) > $row) {
        return mysql_result($result, $row);
      }
    }
    
    /**
     * Determine whether the previous query caused an error.
     */
    function db_error() {
      return mysql_errno();
    }
    
    /**
     * Return a new unique ID in the given sequence.
     *
     * For compatibility reasons, Drupal does not use auto-numbered fields in its
     * database tables. Instead, this function is used to return a new unique ID
     * of the type requested. If necessary, a new sequence with the given name
     * will be created.
     */
    function db_next_id($name) {
      $name = db_prefix_tables($name);
      db_query('LOCK TABLES {sequences} WRITE');
      $id = db_result(db_query("SELECT id FROM {sequences} WHERE name = '%s'", $name)) + 1;
      db_query("REPLACE INTO {sequences} VALUES ('%s', %d)", $name, $id);
      db_query('UNLOCK TABLES');
    
      return $id;
    }
    
    /**
     * Determine the number of rows changed by the preceding query.
     */
    function db_affected_rows() {
      return mysql_affected_rows();
    }
    
    /**
     * Runs a limited-range query in the active database.
     *
     * Use this as a substitute for db_query() when a subset of the query is to be
     * returned.
     * User-supplied arguments to the query should be passed in as separate parameters
     * so that they can be properly escaped to avoid SQL injection attacks.
     *
     * @param $query
     *   A string containing an SQL query.
     * @param ...
     *   A variable number of arguments which are substituted into the query using
     *   printf() syntax. Instead of a variable number of query arguments, you may
     *   also pass a single array containing the query arguments.
     * @param $from
     *   The first result row to return.
     * @param $count
     *   The maximum number of result rows to return.
     * @return
     *   A database query result resource, or FALSE if the query was not executed
     *   correctly.
     */
    function db_query_range($query) {
      $args = func_get_args();
      $count = array_pop($args);
      $from = array_pop($args);
    
      $query = db_prefix_tables($query);
      if (count($args) > 1) {
        // Check for array (alternative syntax).
        if (is_array($args[1])) {
          $args = array_merge(array($query), $args[1]);
        }
        $args = array_map('db_escape_string', $args);
        $args[0] = $query;
        $query = call_user_func_array('sprintf', $args);
      }
      $query .= ' LIMIT '. $from .', '. $count;
      return _db_query($query);
    }
    
    /**
     * Runs a SELECT query and stores its results in a temporary table.
     *
     * Use this as a substitute for db_query() when the results need to stored
     * in a temporary table. Temporary tables exist for the duration of the page
     * request.
     * User-supplied arguments to the query should be passed in as separate parameters
     * so that they can be properly escaped to avoid SQL injection attacks.
     *
     * Note that if you need to know how many results were returned, you should do
     * a SELECT COUNT(*) on the temporary table afterwards. db_num_rows() and
     * db_affected_rows() do not give consistent result across different database
     * types in this case.
     *
     * @param $query
     *   A string containing a normal SELECT SQL query.
     * @param ...
     *   A variable number of arguments which are substituted into the query using
     *   printf() syntax. Instead of a variable number of query arguments, you may
     *   also pass a single array containing the query arguments.
     * @param $table
     *   The name of the temporary table to select into. This name will not be
     *   prefixed as there is no risk of collision.
     * @return
     *   A database query result resource, or FALSE if the query was not executed
     *   correctly.
     */
    function db_query_temporary($query) {
      $args = func_get_args();
      $tablename = array_pop($args);
    
      $query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE '. $tablename .' SELECT', db_prefix_tables($query));
      if (count($args) > 1) {
        // Check for array (alternative syntax).
        if (is_array($args[1])) {
          $args = array_merge(array($query), $args[1]);
        }
        $args = array_map('db_escape_string', $args);
        $args[0] = $query;
        $query = call_user_func_array('sprintf', $args);
      }
      return _db_query($query);
    }
    
    /**
     * Returns a properly formatted Binary Large OBject value.
     *
     * @param $data
     *   Data to encode.
     * @return
     *  Encoded data.
     */
    function db_encode_blob($data) {
      return $data;
    }
    
    /**
     * Returns text from a Binary Large OBject value.
     *
     * @param $data
     *   Data to decode.
     * @return
     *  Decoded data.
     */
    function db_decode_blob($data) {
      return $data;
    }
    
    /**
     * Prepare user input for use in a database query, preventing SQL injection attacks.
     */
    function db_escape_string($text) {
      return mysql_real_escape_string($text);
    }
    
    /**
     * Lock a table.
     */
    function db_lock_table($table) {
      db_query('LOCK TABLES {%s} WRITE', $table);
    }
    
    /**
     * Unlock all locked tables.
     */
    function db_unlock_tables() {
      db_query('UNLOCK TABLES');
    }
    
    
    /**
     * @} End of "ingroup database".
     */