dolibarr  19.0.0-dev
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 
25 require_once DOL_DOCUMENT_ROOT.'/core/db/Database.interface.php';
26 
30 abstract 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 -...
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
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.