Verzeichnisstruktur phpBB-3.0.0
- Veröffentlicht
- 12.12.2007
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
mysqli.php
001 <?php
002 /**
003 *
004 * @package dbal
005 * @version $Id$
006 * @copyright (c) 2005 phpBB Group
007 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
008 *
009 */
010
011 /**
012 * @ignore
013 */
014 if (!defined('IN_PHPBB'))
015 {
016 exit;
017 }
018
019 include_once($phpbb_root_path . 'includes/db/dbal.' . $phpEx);
020
021 /**
022 * MySQLi Database Abstraction Layer
023 * mysqli-extension has to be compiled with:
024 * MySQL 4.1+ or MySQL 5.0+
025 * @package dbal
026 */
027 class dbal_mysqli extends dbal
028 {
029 var $multi_insert = true;
030
031 /**
032 * Connect to server
033 */
034 function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false , $new_link = false)
035 {
036 $this->persistency = $persistency;
037 $this->user = $sqluser;
038 $this->server = $sqlserver;
039 $this->dbname = $database;
040 $port = (!$port) ? NULL : $port;
041
042 // Persistant connections not supported by the mysqli extension?
043 $this->db_connect_id = @mysqli_connect($this->server, $this->user, $sqlpassword, $this->dbname, $port);
044
045 if ($this->db_connect_id && $this->dbname != '')
046 {
047 @mysqli_query($this->db_connect_id, "SET NAMES 'utf8'");
048 // enforce strict mode on databases that support it
049 if (mysqli_get_server_version($this->db_connect_id) >= 50002)
050 {
051 $result = @mysqli_query($this->db_connect_id, 'SELECT @@session.sql_mode AS sql_mode');
052 $row = @mysqli_fetch_assoc($result);
053 @mysqli_free_result($result);
054 $modes = array_map('trim', explode(',', $row['sql_mode']));
055
056 // TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES
057 if (!in_array('TRADITIONAL', $modes))
058 {
059 if (!in_array('STRICT_ALL_TABLES', $modes))
060 {
061 $modes[] = 'STRICT_ALL_TABLES';
062 }
063
064 if (!in_array('STRICT_TRANS_TABLES', $modes))
065 {
066 $modes[] = 'STRICT_TRANS_TABLES';
067 }
068 }
069
070 $mode = implode(',', $modes);
071 @mysqli_query($this->db_connect_id, "SET SESSION sql_mode='{$mode}'");
072 }
073 return $this->db_connect_id;
074 }
075
076 return $this->sql_error('');
077 }
078
079 /**
080 * Version information about used database
081 */
082 function sql_server_info()
083 {
084 return 'MySQL(i) ' . @mysqli_get_server_info($this->db_connect_id);
085 }
086
087 /**
088 * SQL Transaction
089 * @access private
090 */
091 function _sql_transaction($status = 'begin')
092 {
093 switch ($status)
094 {
095 case 'begin':
096 return @mysqli_autocommit($this->db_connect_id, false);
097 break;
098
099 case 'commit':
100 $result = @mysqli_commit($this->db_connect_id);
101 @mysqli_autocommit($this->db_connect_id, true);
102 return $result;
103 break;
104
105 case 'rollback':
106 $result = @mysqli_rollback($this->db_connect_id);
107 @mysqli_autocommit($this->db_connect_id, true);
108 return $result;
109 break;
110 }
111
112 return true;
113 }
114
115 /**
116 * Base query method
117 *
118 * @param string $query Contains the SQL query which shall be executed
119 * @param int $cache_ttl Either 0 to avoid caching or the time in seconds which the result shall be kept in cache
120 * @return mixed When casted to bool the returned value returns true on success and false on failure
121 *
122 * @access public
123 */
124 function sql_query($query = '', $cache_ttl = 0)
125 {
126 if ($query != '')
127 {
128 global $cache;
129
130 // EXPLAIN only in extra debug mode
131 if (defined('DEBUG_EXTRA'))
132 {
133 $this->sql_report('start', $query);
134 }
135
136 $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;
137 $this->sql_add_num_queries($this->query_result);
138
139 if ($this->query_result === false)
140 {
141 if (($this->query_result = @mysqli_query($this->db_connect_id, $query)) === false)
142 {
143 $this->sql_error($query);
144 }
145
146 if (defined('DEBUG_EXTRA'))
147 {
148 $this->sql_report('stop', $query);
149 }
150
151 if ($cache_ttl && method_exists($cache, 'sql_save'))
152 {
153 $cache->sql_save($query, $this->query_result, $cache_ttl);
154 }
155 }
156 else if (defined('DEBUG_EXTRA'))
157 {
158 $this->sql_report('fromcache', $query);
159 }
160 }
161 else
162 {
163 return false;
164 }
165
166 return ($this->query_result) ? $this->query_result : false;
167 }
168
169 /**
170 * Build LIMIT query
171 */
172 function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
173 {
174 $this->query_result = false;
175
176 // if $total is set to 0 we do not want to limit the number of rows
177 if ($total == 0)
178 {
179 // MySQL 4.1+ no longer supports -1 in limit queries
180 $total = '18446744073709551615';
181 }
182
183 $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
184
185 return $this->sql_query($query, $cache_ttl);
186 }
187
188 /**
189 * Return number of affected rows
190 */
191 function sql_affectedrows()
192 {
193 return ($this->db_connect_id) ? @mysqli_affected_rows($this->db_connect_id) : false;
194 }
195
196 /**
197 * Fetch current row
198 */
199 function sql_fetchrow($query_id = false)
200 {
201 global $cache;
202
203 if ($query_id === false)
204 {
205 $query_id = $this->query_result;
206 }
207
208 if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
209 {
210 return $cache->sql_fetchrow($query_id);
211 }
212
213 return ($query_id !== false) ? @mysqli_fetch_assoc($query_id) : false;
214 }
215
216 /**
217 * Seek to given row number
218 * rownum is zero-based
219 */
220 function sql_rowseek($rownum, &$query_id)
221 {
222 global $cache;
223
224 if ($query_id === false)
225 {
226 $query_id = $this->query_result;
227 }
228
229 if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
230 {
231 return $cache->sql_rowseek($rownum, $query_id);
232 }
233
234 return ($query_id !== false) ? @mysqli_data_seek($query_id, $rownum) : false;
235 }
236
237 /**
238 * Get last inserted id after insert statement
239 */
240 function sql_nextid()
241 {
242 return ($this->db_connect_id) ? @mysqli_insert_id($this->db_connect_id) : false;
243 }
244
245 /**
246 * Free sql result
247 */
248 function sql_freeresult($query_id = false)
249 {
250 global $cache;
251
252 if ($query_id === false)
253 {
254 $query_id = $this->query_result;
255 }
256
257 if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
258 {
259 return $cache->sql_freeresult($query_id);
260 }
261
262 return @mysqli_free_result($query_id);
263 }
264
265 /**
266 * Escape string used in sql query
267 */
268 function sql_escape($msg)
269 {
270 return @mysqli_real_escape_string($this->db_connect_id, $msg);
271 }
272
273 /**
274 * Build LIKE expression
275 * @access private
276 */
277 function _sql_like_expression($expression)
278 {
279 return $expression;
280 }
281
282 /**
283 * Build db-specific query data
284 * @access private
285 */
286 function _sql_custom_build($stage, $data)
287 {
288 switch ($stage)
289 {
290 case 'FROM':
291 $data = '(' . $data . ')';
292 break;
293 }
294
295 return $data;
296 }
297
298 /**
299 * return sql error array
300 * @access private
301 */
302 function _sql_error()
303 {
304 if (!$this->db_connect_id)
305 {
306 return array(
307 'message' => @mysqli_connect_error(),
308 'code' => @mysqli_connect_errno()
309 );
310 }
311
312 return array(
313 'message' => @mysqli_error($this->db_connect_id),
314 'code' => @mysqli_errno($this->db_connect_id)
315 );
316 }
317
318 /**
319 * Close sql connection
320 * @access private
321 */
322 function _sql_close()
323 {
324 return @mysqli_close($this->db_connect_id);
325 }
326
327 /**
328 * Build db-specific report
329 * @access private
330 */
331 function _sql_report($mode, $query = '')
332 {
333 static $test_prof;
334
335 // current detection method, might just switch to see the existance of INFORMATION_SCHEMA.PROFILING
336 if ($test_prof === null)
337 {
338 $test_prof = false;
339 if (strpos(mysqli_get_server_info($this->db_connect_id), 'community') !== false)
340 {
341 $ver = mysqli_get_server_version($this->db_connect_id);
342 if ($ver >= 50037 && $ver < 50100)
343 {
344 $test_prof = true;
345 }
346 }
347 }
348
349 switch ($mode)
350 {
351 case 'start':
352
353 $explain_query = $query;
354 if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
355 {
356 $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
357 }
358 else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
359 {
360 $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
361 }
362
363 if (preg_match('/^SELECT/', $explain_query))
364 {
365 $html_table = false;
366
367 // begin profiling
368 if ($test_prof)
369 {
370 @mysqli_query($this->db_connect_id, 'SET profiling = 1;');
371 }
372
373 if ($result = @mysqli_query($this->db_connect_id, "EXPLAIN $explain_query"))
374 {
375 while ($row = @mysqli_fetch_assoc($result))
376 {
377 $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
378 }
379 }
380 @mysqli_free_result($result);
381
382 if ($html_table)
383 {
384 $this->html_hold .= '</table>';
385 }
386
387 if ($test_prof)
388 {
389 $html_table = false;
390
391 // get the last profile
392 if ($result = @mysqli_query($this->db_connect_id, 'SHOW PROFILE ALL;'))
393 {
394 $this->html_hold .= '<br />';
395 while ($row = @mysqli_fetch_assoc($result))
396 {
397 // make <unknown> HTML safe
398 if (!empty($row['Source_function']))
399 {
400 $row['Source_function'] = str_replace(array('<', '>'), array('<', '>'), $row['Source_function']);
401 }
402
403 // remove unsupported features
404 foreach ($row as $key => $val)
405 {
406 if ($val === null)
407 {
408 unset($row[$key]);
409 }
410 }
411 $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
412 }
413 }
414 @mysqli_free_result($result);
415
416 if ($html_table)
417 {
418 $this->html_hold .= '</table>';
419 }
420
421 @mysqli_query($this->db_connect_id, 'SET profiling = 0;');
422 }
423 }
424
425 break;
426
427 case 'fromcache':
428 $endtime = explode(' ', microtime());
429 $endtime = $endtime[0] + $endtime[1];
430
431 $result = @mysqli_query($this->db_connect_id, $query);
432 while ($void = @mysqli_fetch_assoc($result))
433 {
434 // Take the time spent on parsing rows into account
435 }
436 @mysqli_free_result($result);
437
438 $splittime = explode(' ', microtime());
439 $splittime = $splittime[0] + $splittime[1];
440
441 $this->sql_report('record_fromcache', $query, $endtime, $splittime);
442
443 break;
444 }
445 }
446 }
447
448 ?>