database.mysql.inc 6.41 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
Kjartan's avatar
Kjartan committed
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
   
Dries committed
4
5
6
7
8
9
/**
 * @file
 * Database interface code for MySQL database servers.
 */

/**
Dries's avatar
   
Dries committed
10
 * @ingroup database
Dries's avatar
   
Dries committed
11
12
13
14
15
16
17
18
19
20
21
22
 * @{
 */

/**
 * 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).
 */
Dries's avatar
 
Dries committed
23
24
25
function db_connect($url) {
  $url = parse_url($url);

26
  // Allow for non-standard MySQL port.
Dries's avatar
   
Dries committed
27
28
  if (isset($url['port'])) {
     $url['host'] = $url['host'] .':'. $url['port'];
29
  }
Dries's avatar
   
Dries committed
30

31
32
33
34
35
36
37
38
  // - 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) or die(mysql_error());

Dries's avatar
   
Dries committed
39
  mysql_select_db(substr($url['path'], 1)) or die('unable to select database');
Dries's avatar
 
Dries committed
40

Dries's avatar
   
Dries committed
41
  return $connection;
Dries's avatar
 
Dries committed
42
43
}

Dries's avatar
   
Dries committed
44
45
46
/**
 * Helper function for db_query().
 */
Dries's avatar
   
Dries committed
47
function _db_query($query, $debug = 0) {
Dries's avatar
   
Dries committed
48
  global $active_db;
Dries's avatar
   
Dries committed
49
50
  global $queries;

Dries's avatar
   
Dries committed
51
52
  if (variable_get('dev_query', 0)) {
    list($usec, $sec) = explode(' ', microtime());
Dries's avatar
   
Dries committed
53
    $timer = (float)$usec + (float)$sec;
Dries's avatar
   
Dries committed
54
  }
Dries's avatar
 
Dries committed
55

Dries's avatar
   
Dries committed
56
  $result = mysql_query($query, $active_db);
Dries's avatar
 
Dries committed
57

Dries's avatar
   
Dries committed
58
59
  if (variable_get('dev_query', 0)) {
    list($usec, $sec) = explode(' ', microtime());
Dries's avatar
   
Dries committed
60
61
62
63
64
    $stop = (float)$usec + (float)$sec;
    $diff = $stop - $timer;
    $queries[] = array($query, $diff);
  }

Dries's avatar
 
Dries committed
65
  if ($debug) {
Dries's avatar
   
Dries committed
66
    print '<p>query: '. $query .'<br />error:'. mysql_error() .'</p>';
Dries's avatar
 
Dries committed
67
68
  }

Dries's avatar
   
Dries committed
69
  if (!mysql_errno()) {
Dries's avatar
 
Dries committed
70
    return $result;
Kjartan's avatar
Kjartan committed
71
72
  }
  else {
Dries's avatar
   
Dries committed
73
    trigger_error(mysql_error() ."\nquery: ". htmlspecialchars($query), E_USER_ERROR);
Dries's avatar
 
Dries committed
74
75
76
  }
}

Dries's avatar
   
Dries committed
77
78
79
80
81
82
83
84
85
/**
 * 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.
 */
Dries's avatar
 
Dries committed
86
87
88
89
90
91
function db_fetch_object($result) {
  if ($result) {
    return mysql_fetch_object($result);
  }
}

Dries's avatar
   
Dries committed
92
93
94
95
96
97
98
99
100
101
/**
 * 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.
 */
Dries's avatar
 
Dries committed
102
103
104
105
106
107
function db_fetch_array($result) {
  if ($result) {
    return mysql_fetch_array($result, MYSQL_ASSOC);
  }
}

Dries's avatar
   
Dries committed
108
109
110
111
112
113
114
115
/**
 * 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.
 */
Dries's avatar
 
Dries committed
116
117
118
119
120
121
function db_num_rows($result) {
  if ($result) {
    return mysql_num_rows($result);
  }
}

Dries's avatar
   
Dries committed
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
 * 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.
 */
Dries's avatar
 
Dries committed
135
136
137
138
139
140
function db_result($result, $row = 0) {
  if ($result && mysql_num_rows($result) > $row) {
    return mysql_result($result, $row);
  }
}

Dries's avatar
   
Dries committed
141
142
143
/**
 * Determine whether the previous query caused an error.
 */
Dries's avatar
 
Dries committed
144
145
146
147
function db_error() {
  return mysql_errno();
}

Dries's avatar
   
Dries committed
148
149
150
151
152
153
154
155
/**
 * 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.
 */
Dries's avatar
   
Dries committed
156
function db_next_id($name) {
Dries's avatar
   
Dries committed
157
  $name = db_prefix_tables($name);
Dries's avatar
   
Dries committed
158
  db_query('LOCK TABLES {sequences} WRITE');
Dries's avatar
   
Dries committed
159
160
  $id = db_result(db_query("SELECT id FROM {sequences} WHERE name = '%s'", $name)) + 1;
  db_query("REPLACE INTO {sequences} VALUES ('%s', %d)", $name, $id);
Dries's avatar
   
Dries committed
161
  db_query('UNLOCK TABLES');
Dries's avatar
   
Dries committed
162
163
164
165

  return $id;
}

Dries's avatar
   
Dries committed
166
167
168
/**
 * Determine the number of rows changed by the preceding query.
 */
Dries's avatar
   
Dries committed
169
170
171
172
function db_affected_rows() {
  return mysql_affected_rows();
}

Dries's avatar
   
Dries committed
173
/**
Dries's avatar
   
Dries committed
174
175
176
177
178
179
 * 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.
Dries's avatar
   
Dries committed
180
 *
Dries's avatar
   
Dries committed
181
182
183
184
 * @param $query
 *   A string containing an SQL query.
 * @param ...
 *   A variable number of arguments which are substituted into the query using
185
186
 *   printf() syntax. Instead of a variable number of query arguments, you may
 *   also pass a single array containing the query arguments.
Dries's avatar
   
Dries committed
187
188
189
190
191
192
193
 * @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.
Dries's avatar
   
Dries committed
194
 */
Dries's avatar
Dries committed
195
196
197
198
function db_query_range($query) {
  $args = func_get_args();
  $count = array_pop($args);
  $from = array_pop($args);
199
200

  $query = db_prefix_tables($query);
Dries's avatar
Dries committed
201
  if (count(func_get_args()) > 3) {
202
203
204
205
    // Check for array (alternative syntax).
    if (is_array($args[1])) {
      $args = array_merge(array($query), $args[1]);
    }
Dries's avatar
   
Dries committed
206
    $args = array_map('db_escape_string', $args);
Dries's avatar
Dries committed
207
    $args[0] = $query;
Dries's avatar
   
Dries committed
208
    $query = call_user_func_array('sprintf', $args);
Dries's avatar
Dries committed
209
  }
Dries's avatar
   
Dries committed
210
  $query .= ' LIMIT '. $from .', '. $count;
Dries's avatar
Dries committed
211
  return _db_query($query);
Dries's avatar
   
Dries committed
212
213
}

Dries's avatar
   
Dries committed
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/**
 * 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;
}

Dries's avatar
   
Dries committed
238
239
240
241
242
243
244
/**
 * Prepare user input for use in a database query, preventing SQL injection attacks.
 */
function db_escape_string($text) {
  return addslashes($text);
}

Dries's avatar
   
Dries committed
245
/**
Dries's avatar
   
Dries committed
246
 * @} End of "ingroup database".
Dries's avatar
   
Dries committed
247
248
 */

249
?>