1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: | |
19: |
|
20: | defined('XOOPS_ROOT_PATH') || die('Restricted access');
|
21: |
|
22: | include_once XOOPS_ROOT_PATH . '/class/database/database.php';
|
23: |
|
24: | |
25: | |
26: | |
27: | |
28: | |
29: | |
30: | |
31: | |
32: |
|
33: | abstract class XoopsMySQLDatabase extends XoopsDatabase
|
34: | {
|
35: | |
36: | |
37: | |
38: | |
39: |
|
40: | public $conn;
|
41: |
|
42: | |
43: | |
44: | |
45: | |
46: | |
47: |
|
48: | public function connect($selectdb = true)
|
49: | {
|
50: | if (!extension_loaded('mysqli')) {
|
51: | trigger_error('notrace:mysqli extension not loaded', E_USER_ERROR);
|
52: |
|
53: | return false;
|
54: | }
|
55: |
|
56: | $this->allowWebChanges = ($_SERVER['REQUEST_METHOD'] !== 'GET');
|
57: |
|
58: | if ($selectdb) {
|
59: | $dbname = constant('XOOPS_DB_NAME');
|
60: | } else {
|
61: | $dbname = '';
|
62: | }
|
63: | mysqli_report(MYSQLI_REPORT_OFF);
|
64: | if (XOOPS_DB_PCONNECT == 1) {
|
65: | $this->conn = new mysqli('p:' . XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS, $dbname);
|
66: | } else {
|
67: | $this->conn = new mysqli(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS, $dbname);
|
68: | }
|
69: |
|
70: |
|
71: | if (0 !== $this->conn->connect_errno) {
|
72: | return false;
|
73: | }
|
74: |
|
75: | if (defined('XOOPS_DB_CHARSET') && ('' !== XOOPS_DB_CHARSET)) {
|
76: |
|
77: | $this->conn->set_charset(XOOPS_DB_CHARSET);
|
78: | }
|
79: | $this->queryF('SET SQL_BIG_SELECTS = 1');
|
80: |
|
81: | return true;
|
82: | }
|
83: |
|
84: | |
85: | |
86: | |
87: | |
88: | |
89: | |
90: | |
91: | |
92: |
|
93: | public function genId($sequence)
|
94: | {
|
95: | return 0;
|
96: | }
|
97: |
|
98: | |
99: | |
100: | |
101: | |
102: | |
103: | |
104: |
|
105: | public function fetchRow($result)
|
106: | {
|
107: | $row = @mysqli_fetch_row($result);
|
108: | return (null === $row) ? false : $row;
|
109: | }
|
110: |
|
111: | |
112: | |
113: | |
114: | |
115: | |
116: | |
117: |
|
118: | public function fetchArray($result)
|
119: | {
|
120: | $row = @mysqli_fetch_assoc($result);
|
121: | return (null === $row) ? false : $row;
|
122: |
|
123: | }
|
124: |
|
125: | |
126: | |
127: | |
128: | |
129: | |
130: | |
131: |
|
132: | public function fetchBoth($result)
|
133: | {
|
134: | $row = @mysqli_fetch_array($result, MYSQLI_BOTH);
|
135: | return (null === $row) ? false : $row;
|
136: | }
|
137: |
|
138: | |
139: | |
140: | |
141: | |
142: | |
143: |
|
144: | public function fetchObject($result)
|
145: | {
|
146: | $row = @mysqli_fetch_object($result);
|
147: | return (null === $row) ? false : $row;
|
148: | }
|
149: |
|
150: | |
151: | |
152: | |
153: | |
154: |
|
155: | public function getInsertId()
|
156: | {
|
157: | return mysqli_insert_id($this->conn);
|
158: | }
|
159: |
|
160: | |
161: | |
162: | |
163: | |
164: | |
165: | |
166: |
|
167: | public function getRowsNum($result)
|
168: | {
|
169: | return (int)@mysqli_num_rows($result);
|
170: | }
|
171: |
|
172: | |
173: | |
174: | |
175: | |
176: |
|
177: | public function getAffectedRows()
|
178: | {
|
179: | return (int)mysqli_affected_rows($this->conn);
|
180: | }
|
181: |
|
182: | |
183: | |
184: | |
185: | |
186: |
|
187: | public function close()
|
188: | {
|
189: | mysqli_close($this->conn);
|
190: | }
|
191: |
|
192: | |
193: | |
194: | |
195: | |
196: | |
197: | |
198: |
|
199: | public function freeRecordSet($result)
|
200: | {
|
201: | mysqli_free_result($result);
|
202: | }
|
203: |
|
204: | |
205: | |
206: | |
207: | |
208: |
|
209: | public function error()
|
210: | {
|
211: | return @mysqli_error($this->conn);
|
212: | }
|
213: |
|
214: | |
215: | |
216: | |
217: | |
218: |
|
219: | public function errno()
|
220: | {
|
221: | return @mysqli_errno($this->conn);
|
222: | }
|
223: |
|
224: | |
225: | |
226: | |
227: | |
228: | |
229: |
|
230: | public function quoteString($str)
|
231: | {
|
232: | return $this->quote($str);
|
233: | }
|
234: |
|
235: | |
236: | |
237: | |
238: | |
239: | |
240: | |
241: |
|
242: | public function quote($string)
|
243: | {
|
244: | $quoted = $this->escape($string);
|
245: | return "'{$quoted}'";
|
246: | }
|
247: |
|
248: | |
249: | |
250: | |
251: | |
252: | |
253: | |
254: |
|
255: | public function escape($string)
|
256: | {
|
257: | return mysqli_real_escape_string($this->conn, (string) $string);
|
258: | }
|
259: |
|
260: | |
261: | |
262: | |
263: | |
264: | |
265: | |
266: | |
267: | |
268: |
|
269: | public function queryF($sql, $limit = 0, $start = 0)
|
270: | {
|
271: | if (!empty($limit)) {
|
272: | if (empty($start)) {
|
273: | $start = 0;
|
274: | }
|
275: | $sql = $sql . ' LIMIT ' . (int)$start . ', ' . (int)$limit;
|
276: | }
|
277: | $this->logger->startTime('query_time');
|
278: | $result = mysqli_query($this->conn, $sql);
|
279: | $this->logger->stopTime('query_time');
|
280: | $query_time = $this->logger->dumpTime('query_time', true);
|
281: | if ($result) {
|
282: | $this->logger->addQuery($sql, null, null, $query_time);
|
283: |
|
284: | return $result;
|
285: | } else {
|
286: | $this->logger->addQuery($sql, $this->error(), $this->errno(), $query_time);
|
287: |
|
288: | return false;
|
289: | }
|
290: | }
|
291: |
|
292: | |
293: | |
294: | |
295: | |
296: | |
297: | |
298: | |
299: | |
300: | |
301: | |
302: | |
303: | |
304: |
|
305: | abstract public function query($sql, $limit = 0, $start = 0);
|
306: |
|
307: | |
308: | |
309: | |
310: | |
311: | |
312: |
|
313: | public function queryFromFile($file)
|
314: | {
|
315: | if (false !== ($fp = fopen($file, 'r'))) {
|
316: | include_once XOOPS_ROOT_PATH . '/class/database/sqlutility.php';
|
317: | $sql_queries = trim(fread($fp, filesize($file)));
|
318: | SqlUtility::splitMySqlFile($pieces, $sql_queries);
|
319: | foreach ($pieces as $query) {
|
320: |
|
321: |
|
322: | $prefixed_query = SqlUtility::prefixQuery(trim($query), $this->prefix());
|
323: | if ($prefixed_query != false) {
|
324: | $this->query($prefixed_query[0]);
|
325: | }
|
326: | }
|
327: |
|
328: | return true;
|
329: | }
|
330: |
|
331: | return false;
|
332: | }
|
333: |
|
334: | |
335: | |
336: | |
337: | |
338: | |
339: | |
340: | |
341: |
|
342: | public function getFieldName($result, $offset)
|
343: | {
|
344: | return $result->fetch_field_direct($offset)->name;
|
345: | }
|
346: |
|
347: | |
348: | |
349: | |
350: | |
351: | |
352: | |
353: | |
354: |
|
355: | public function getFieldType($result, $offset)
|
356: | {
|
357: | $typecode = $result->fetch_field_direct($offset)->type;
|
358: | switch ($typecode) {
|
359: | case MYSQLI_TYPE_DECIMAL:
|
360: | case MYSQLI_TYPE_NEWDECIMAL:
|
361: | $type = 'decimal';
|
362: | break;
|
363: | case MYSQLI_TYPE_BIT:
|
364: | $type = 'bit';
|
365: | break;
|
366: | case MYSQLI_TYPE_TINY:
|
367: | case MYSQLI_TYPE_CHAR:
|
368: | $type = 'tinyint';
|
369: | break;
|
370: | case MYSQLI_TYPE_SHORT:
|
371: | $type = 'smallint';
|
372: | break;
|
373: | case MYSQLI_TYPE_LONG:
|
374: | $type = 'int';
|
375: | break;
|
376: | case MYSQLI_TYPE_FLOAT:
|
377: | $type = 'float';
|
378: | break;
|
379: | case MYSQLI_TYPE_DOUBLE:
|
380: | $type = 'double';
|
381: | break;
|
382: | case MYSQLI_TYPE_NULL:
|
383: | $type = 'NULL';
|
384: | break;
|
385: | case MYSQLI_TYPE_TIMESTAMP:
|
386: | $type = 'timestamp';
|
387: | break;
|
388: | case MYSQLI_TYPE_LONGLONG:
|
389: | $type = 'bigint';
|
390: | break;
|
391: | case MYSQLI_TYPE_INT24:
|
392: | $type = 'mediumint';
|
393: | break;
|
394: | case MYSQLI_TYPE_NEWDATE:
|
395: | case MYSQLI_TYPE_DATE:
|
396: | $type = 'date';
|
397: | break;
|
398: | case MYSQLI_TYPE_TIME:
|
399: | $type = 'time';
|
400: | break;
|
401: | case MYSQLI_TYPE_DATETIME:
|
402: | $type = 'datetime';
|
403: | break;
|
404: | case MYSQLI_TYPE_YEAR:
|
405: | $type = 'year';
|
406: | break;
|
407: | case MYSQLI_TYPE_INTERVAL:
|
408: | $type = 'interval';
|
409: | break;
|
410: | case MYSQLI_TYPE_ENUM:
|
411: | $type = 'enum';
|
412: | break;
|
413: | case MYSQLI_TYPE_SET:
|
414: | $type = 'set';
|
415: | break;
|
416: | case MYSQLI_TYPE_TINY_BLOB:
|
417: | $type = 'tinyblob';
|
418: | break;
|
419: | case MYSQLI_TYPE_MEDIUM_BLOB:
|
420: | $type = 'mediumblob';
|
421: | break;
|
422: | case MYSQLI_TYPE_LONG_BLOB:
|
423: | $type = 'longblob';
|
424: | break;
|
425: | case MYSQLI_TYPE_BLOB:
|
426: | $type = 'blob';
|
427: | break;
|
428: | case MYSQLI_TYPE_VAR_STRING:
|
429: | $type = 'varchar';
|
430: | break;
|
431: | case MYSQLI_TYPE_STRING:
|
432: | $type = 'char';
|
433: | break;
|
434: | case MYSQLI_TYPE_GEOMETRY:
|
435: | $type = 'geometry';
|
436: | break;
|
437: | default:
|
438: | $type = 'unknown';
|
439: | break;
|
440: | }
|
441: |
|
442: | return $type;
|
443: | }
|
444: |
|
445: | |
446: | |
447: | |
448: | |
449: | |
450: | |
451: |
|
452: | public function getFieldsNum($result)
|
453: | {
|
454: | return mysqli_num_fields($result);
|
455: | }
|
456: |
|
457: | |
458: | |
459: | |
460: | |
461: |
|
462: | public function getServerVersion()
|
463: | {
|
464: | return mysqli_get_server_info($this->conn);
|
465: | }
|
466: |
|
467: | |
468: | |
469: | |
470: | |
471: | |
472: | |
473: |
|
474: | public function isResultSet($result)
|
475: | {
|
476: | return is_a($result, 'mysqli_result');
|
477: | }
|
478: | }
|
479: |
|
480: | |
481: | |
482: | |
483: | |
484: | |
485: | |
486: | |
487: |
|
488: | class XoopsMySQLDatabaseSafe extends XoopsMySQLDatabase
|
489: | {
|
490: | |
491: | |
492: | |
493: | |
494: | |
495: | |
496: | |
497: | |
498: |
|
499: | public function query($sql, $limit = 0, $start = 0)
|
500: | {
|
501: | return $this->queryF($sql, $limit, $start);
|
502: | }
|
503: | }
|
504: |
|
505: | |
506: | |
507: | |
508: | |
509: | |
510: | |
511: | |
512: | |
513: | |
514: | |
515: |
|
516: | class XoopsMySQLDatabaseProxy extends XoopsMySQLDatabase
|
517: | {
|
518: | |
519: | |
520: | |
521: | |
522: | |
523: | |
524: | |
525: | |
526: | |
527: | |
528: | |
529: |
|
530: | public function query($sql, $limit = 0, $start = 0)
|
531: | {
|
532: | $sql = ltrim($sql);
|
533: | if (!$this->allowWebChanges && strtolower(substr($sql, 0, 6)) !== 'select') {
|
534: | trigger_error('Database updates are not allowed during processing of a GET request', E_USER_WARNING);
|
535: |
|
536: | return false;
|
537: | }
|
538: |
|
539: | return $this->queryF($sql, $limit, $start);
|
540: | }
|
541: | }
|
542: | |