dolibarr 18.0.6
DoliDB.class.php
Go to the documentation of this file.
1<?php
2/*
3 * Copyright (C) 2013-2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
4 * Copyright (C) 2014-2015 Laurent Destailleur <eldy@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
25require_once DOL_DOCUMENT_ROOT.'/core/db/Database.interface.php';
26
30abstract class DoliDB implements Database
31{
33 public $db;
35 public $type;
37 public $forcecharset = 'utf8';
39 public $forcecollate = 'utf8_unicode_ci';
40
42 private $_results;
43
45 public $connected;
47 public $database_selected;
49 public $database_name;
51 public $database_user;
53 public $database_host;
55 public $database_port;
57 public $transaction_opened;
59 public $lastquery;
61 public $lastqueryerror;
63 public $lasterror;
65 public $lasterrno;
66
68 public $prefix_db;
69
71 public $ok;
73 public $error;
74
75
76
83 public function prefix()
84 {
85 return (empty($this->prefix_db) ? MAIN_DB_PREFIX : $this->prefix_db);
86 }
87
96 public function ifsql($test, $resok, $resko)
97 {
98 //return 'IF('.$test.','.$resok.','.$resko.')'; // Not sql standard
99 return '(CASE WHEN '.$test.' THEN '.$resok.' ELSE '.$resko.' END)';
100 }
101
108 public function hintindex($nameofindex)
109 {
110 return '';
111 }
112
113
122 public function regexpsql($subject, $pattern, $sqlstring = false)
123 {
124 if ($sqlstring) {
125 return "(". $subject ." REGEXP '" . $pattern . "')";
126 }
127
128 return "('". $subject ."' REGEXP '" . $pattern . "')";
129 }
130
131
140 public function idate($param, $gm = 'tzserver')
141 {
142 // TODO $param should be gmt, so we should have default $gm to 'gmt' instead of default 'tzserver'
143 return dol_print_date($param, "%Y-%m-%d %H:%M:%S", $gm);
144 }
145
151 public function lasterrno()
152 {
153 return $this->lasterrno;
154 }
155
164 public function sanitize($stringtosanitize, $allowsimplequote = 0, $allowsequals = 0)
165 {
166 return preg_replace('/[^a-z0-9_\-\.,'.($allowsequals ? '=' : '').($allowsimplequote ? "\'" : '').']/i', '', $stringtosanitize);
167 }
168
175 public function begin($textinlog = '')
176 {
177 if (!$this->transaction_opened) {
178 $ret = $this->query("BEGIN");
179 if ($ret) {
180 $this->transaction_opened++;
181 dol_syslog("BEGIN Transaction".($textinlog ? ' '.$textinlog : ''), LOG_DEBUG);
182 dol_syslog('', 0, 1);
183 }
184 return $ret;
185 } else {
186 $this->transaction_opened++;
187 dol_syslog('', 0, 1);
188 return 1;
189 }
190 }
191
198 public function commit($log = '')
199 {
200 dol_syslog('', 0, -1);
201 if ($this->transaction_opened <= 1) {
202 $ret = $this->query("COMMIT");
203 if ($ret) {
204 $this->transaction_opened = 0;
205 dol_syslog("COMMIT Transaction".($log ? ' '.$log : ''), LOG_DEBUG);
206 return 1;
207 } else {
208 return 0;
209 }
210 } else {
211 $this->transaction_opened--;
212 return 1;
213 }
214 }
215
222 public function rollback($log = '')
223 {
224 dol_syslog('', 0, -1);
225 if ($this->transaction_opened <= 1) {
226 $ret = $this->query("ROLLBACK");
227 $this->transaction_opened = 0;
228 dol_syslog("ROLLBACK Transaction".($log ? ' '.$log : ''), LOG_DEBUG);
229 return $ret;
230 } else {
231 $this->transaction_opened--;
232 return 1;
233 }
234 }
235
243 public function plimit($limit = 0, $offset = 0)
244 {
245 global $conf;
246 if (empty($limit)) {
247 return "";
248 }
249 if ($limit < 0) {
250 $limit = $conf->liste_limit;
251 }
252 if ($offset > 0) {
253 return " LIMIT ".((int) $offset).",".((int) $limit)." ";
254 } else {
255 return " LIMIT ".((int) $limit)." ";
256 }
257 }
258
264 public function getVersionArray()
265 {
266 return preg_split("/[\.,-]/", $this->getVersion());
267 }
268
274 public function lastquery()
275 {
276 return $this->lastquery;
277 }
278
286 public function order($sortfield = '', $sortorder = '')
287 {
288 if (!empty($sortfield)) {
289 $oldsortorder = '';
290 $return = '';
291 $fields = explode(',', $sortfield);
292 $orders = explode(',', $sortorder);
293 $i = 0;
294 foreach ($fields as $val) {
295 if (!$return) {
296 $return .= ' ORDER BY ';
297 } else {
298 $return .= ', ';
299 }
300
301 $return .= preg_replace('/[^0-9a-z_\.]/i', '', $val); // Add field
302
303 $tmpsortorder = (empty($orders[$i]) ? '' : trim($orders[$i]));
304
305 // Only ASC and DESC values are valid SQL
306 if (strtoupper($tmpsortorder) === 'ASC') {
307 $oldsortorder = 'ASC';
308 $return .= ' ASC';
309 } elseif (strtoupper($tmpsortorder) === 'DESC') {
310 $oldsortorder = 'DESC';
311 $return .= ' DESC';
312 } else {
313 $return .= ' '.($oldsortorder ? $oldsortorder : 'ASC');
314 }
315
316 $i++;
317 }
318 return $return;
319 } else {
320 return '';
321 }
322 }
323
329 public function lasterror()
330 {
331 return $this->lasterror;
332 }
333
343 public function jdate($string, $gm = 'tzserver')
344 {
345 // TODO $string should be converted into a GMT timestamp, so param gm should be set to true by default instead of false
346 if ($string == 0 || $string == "0000-00-00 00:00:00") {
347 return '';
348 }
349 $string = preg_replace('/([^0-9])/i', '', $string);
350 $tmp = $string.'000000';
351 $date = dol_mktime((int) substr($tmp, 8, 2), (int) substr($tmp, 10, 2), (int) substr($tmp, 12, 2), (int) substr($tmp, 4, 2), (int) substr($tmp, 6, 2), (int) substr($tmp, 0, 4), $gm);
352 return $date;
353 }
354
360 public function lastqueryerror()
361 {
362 return $this->lastqueryerror;
363 }
364
373 public function getRow($sql)
374 {
375 $sql .= ' LIMIT 1';
376
377 $res = $this->query($sql);
378 if ($res) {
379 $obj = $this->fetch_object($res);
380 if ($obj) {
381 return $obj;
382 } else {
383 return 0;
384 }
385 }
386
387 return false;
388 }
389
399 public function getRows($sql)
400 {
401 $res = $this->query($sql);
402 if ($res) {
403 $results = array();
404 if ($this->num_rows($res) > 0) {
405 while ($obj = $this->fetch_object($res)) {
406 $results[] = $obj;
407 }
408 }
409 return $results;
410 }
411
412 return false;
413 }
414}
Class to manage Dolibarr database access.
sanitize($stringtosanitize, $allowsimplequote=0, $allowsequals=0)
Sanitize a string for SQL forging.
commit($log='')
Validate a database transaction.
idate($param, $gm='tzserver')
Convert (by PHP) a GM Timestamp date into a string date with PHP server TZ to insert into a date fiel...
ifsql($test, $resok, $resko)
Format a SQL IF.
getVersionArray()
Return version of database server into an array.
lastqueryerror()
Return last query in error.
begin($textinlog='')
Start transaction.
rollback($log='')
Cancel a transaction and go back to initial data values.
lasterror()
Return last error label.
getRow($sql)
Return first result from query as object Note : This method executes a given SQL query and retrieves ...
lasterrno()
Return last error code.
lastquery()
Return last request executed with query()
plimit($limit=0, $offset=0)
Define limits and offset of request.
prefix()
Return the DB prefix found into prefix_db (if it was set manually by doing $dbhandler->prefix_db=....
hintindex($nameofindex)
Return SQL string to force an index.
getRows($sql)
Return all results from query as an array of objects Note : This method executes a given SQL query an...
order($sortfield='', $sortorder='')
Define sort criteria of request.
regexpsql($subject, $pattern, $sqlstring=false)
Format a SQL REGEXP.
jdate($string, $gm='tzserver')
Convert (by PHP) a PHP server TZ string date into a Timestamps date (GMT if gm=true) 19700101020000 -...
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
Class to manage Dolibarr database access for an SQL database.
query($query, $usesavepoint=0, $type='auto', $result_mode=0)
Execute a SQL request and return the resultset.
getVersion()
Return version of database server.
fetch_object($resultset)
Returns the current line (as an object) for the resultset cursor.
num_rows($resultset)
Return number of lines for result of a SELECT.