2013-09-10 10:29:55 +00:00
|
|
|
|
<?php
|
|
|
|
|
|
/*
|
2015-05-12 17:01:01 +00:00
|
|
|
|
* Copyright (C) 2013-2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
|
2015-03-10 13:09:29 +00:00
|
|
|
|
* Copyright (C) 2014-2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
2013-09-10 10:29:55 +00:00
|
|
|
|
*
|
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
|
*
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
*
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
2019-09-23 19:55:30 +00:00
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
2013-09-10 10:29:55 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2014-09-27 14:00:11 +00:00
|
|
|
|
* \file htdocs/core/db/DoliDB.class.php
|
|
|
|
|
|
* \brief Class file to manage Dolibarr database access
|
2013-09-10 10:29:55 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
2020-04-10 08:59:32 +00:00
|
|
|
|
require_once DOL_DOCUMENT_ROOT.'/core/db/Database.interface.php';
|
2014-02-21 11:38:43 +00:00
|
|
|
|
|
2013-09-10 10:29:55 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Class to manage Dolibarr database access
|
|
|
|
|
|
*/
|
2014-02-21 11:38:43 +00:00
|
|
|
|
abstract class DoliDB implements Database
|
2013-09-10 10:29:55 +00:00
|
|
|
|
{
|
2020-02-06 09:13:10 +00:00
|
|
|
|
/** @var bool|resource|SQLite3 Database handler */
|
2015-05-12 17:01:01 +00:00
|
|
|
|
public $db;
|
|
|
|
|
|
/** @var string Database type */
|
|
|
|
|
|
public $type;
|
|
|
|
|
|
/** @var string Charset used to force charset when creating database */
|
2020-04-10 08:59:32 +00:00
|
|
|
|
public $forcecharset = 'utf8';
|
2015-05-12 17:01:01 +00:00
|
|
|
|
/** @var string Collate used to force collate when creating database */
|
2020-04-10 08:59:32 +00:00
|
|
|
|
public $forcecollate = 'utf8_unicode_ci';
|
2015-05-12 17:01:01 +00:00
|
|
|
|
/** @var resource Resultset of last query */
|
|
|
|
|
|
private $_results;
|
|
|
|
|
|
/** @var bool true if connected, else false */
|
|
|
|
|
|
public $connected;
|
|
|
|
|
|
/** @var bool true if database selected, else false */
|
|
|
|
|
|
public $database_selected;
|
|
|
|
|
|
/** @var string Selected database name */
|
|
|
|
|
|
public $database_name;
|
|
|
|
|
|
/** @var string Database username */
|
|
|
|
|
|
public $database_user;
|
|
|
|
|
|
/** @var string Database host */
|
|
|
|
|
|
public $database_host;
|
|
|
|
|
|
/** @var int Database port */
|
|
|
|
|
|
public $database_port;
|
|
|
|
|
|
/** @var int >=1 if a transaction is opened, 0 otherwise */
|
|
|
|
|
|
public $transaction_opened;
|
|
|
|
|
|
/** @var string Last successful query */
|
|
|
|
|
|
public $lastquery;
|
2015-06-06 12:34:57 +00:00
|
|
|
|
/** @var string Last failed query */
|
2015-05-12 17:01:01 +00:00
|
|
|
|
public $lastqueryerror;
|
|
|
|
|
|
/** @var string Last error message */
|
|
|
|
|
|
public $lasterror;
|
2017-10-16 07:29:10 +00:00
|
|
|
|
/** @var string Last error number. For example: 'DB_ERROR_RECORD_ALREADY_EXISTS', '12345', ... */
|
2015-05-12 17:01:01 +00:00
|
|
|
|
public $lasterrno;
|
2013-09-10 10:29:55 +00:00
|
|
|
|
|
2022-01-18 11:24:19 +00:00
|
|
|
|
/** @var string If we need to set a prefix specific to the database so it can be reused (when defined instead of MAIN_DB_PREFIX) to forge requests */
|
2022-01-18 11:16:13 +00:00
|
|
|
|
public $prefix_db;
|
|
|
|
|
|
|
2015-05-12 17:01:01 +00:00
|
|
|
|
/** @var bool Status */
|
|
|
|
|
|
public $ok;
|
|
|
|
|
|
/** @var string */
|
|
|
|
|
|
public $error;
|
2014-02-06 19:40:01 +00:00
|
|
|
|
|
2022-01-20 17:50:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Return the DB prefix
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string The DB prefix
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function prefix()
|
|
|
|
|
|
{
|
|
|
|
|
|
return (empty($this->prefix_db) ? MAIN_DB_PREFIX : $this->prefix_db);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 04:54:13 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Format a SQL IF
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $test Test string (example: 'cd.statut=0', 'field IS NULL')
|
|
|
|
|
|
* @param string $resok resultat si test egal
|
|
|
|
|
|
* @param string $resko resultat si test non egal
|
|
|
|
|
|
* @return string SQL string
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function ifsql($test, $resok, $resko)
|
2014-03-15 04:54:13 +00:00
|
|
|
|
{
|
2021-11-18 18:38:56 +00:00
|
|
|
|
//return 'IF('.$test.','.$resok.','.$resko.')'; // Not sql standard
|
|
|
|
|
|
return '(CASE WHEN '.$test.' THEN '.$resok.' ELSE '.$resko.' END)';
|
2014-03-15 04:54:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-06 15:32:56 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return SQL string to force an index
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $nameofindex Name of index
|
|
|
|
|
|
* @return string SQL string
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function hintindex($nameofindex)
|
|
|
|
|
|
{
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 05:04:16 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Convert (by PHP) a GM Timestamp date into a string date with PHP server TZ to insert into a date field.
|
|
|
|
|
|
* Function to use to build INSERT, UPDATE or WHERE predica
|
|
|
|
|
|
*
|
2021-01-03 14:26:31 +00:00
|
|
|
|
* @param int $param Date TMS to convert
|
|
|
|
|
|
* @param mixed $gm 'gmt'=Input informations are GMT values, 'tzserver'=Local to server TZ
|
|
|
|
|
|
* @return string Date in a string YYYY-MM-DD HH:MM:SS
|
2014-03-15 05:04:16 +00:00
|
|
|
|
*/
|
2021-01-03 14:26:31 +00:00
|
|
|
|
public function idate($param, $gm = 'tzserver')
|
2014-03-15 05:04:16 +00:00
|
|
|
|
{
|
2022-04-05 11:54:09 +00:00
|
|
|
|
// TODO $param should be gmt, so we should have default $gm to 'gmt' instead of default 'tzserver'
|
2021-01-03 14:26:31 +00:00
|
|
|
|
return dol_print_date($param, "%Y-%m-%d %H:%M:%S", $gm);
|
2014-03-15 05:04:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 05:07:46 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return last error code
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string lasterrno
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function lasterrno()
|
2014-03-15 05:07:46 +00:00
|
|
|
|
{
|
|
|
|
|
|
return $this->lasterrno;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-09-18 15:13:01 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Sanitize a string for SQL forging
|
|
|
|
|
|
*
|
2020-10-06 13:11:45 +00:00
|
|
|
|
* @param string $stringtosanitize String to escape
|
2021-06-14 11:51:09 +00:00
|
|
|
|
* @param int $allowsimplequote 1=Allow simple quotes in string. When string is used as a list of SQL string ('aa', 'bb', ...)
|
2020-09-18 15:13:01 +00:00
|
|
|
|
* @return string String escaped
|
|
|
|
|
|
*/
|
2020-10-06 13:11:45 +00:00
|
|
|
|
public function sanitize($stringtosanitize, $allowsimplequote = 0)
|
2020-09-18 15:13:01 +00:00
|
|
|
|
{
|
2020-10-06 13:11:45 +00:00
|
|
|
|
if ($allowsimplequote) {
|
|
|
|
|
|
return preg_replace('/[^a-z0-9_\-\.,\']/i', '', $stringtosanitize);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return preg_replace('/[^a-z0-9_\-\.,]/i', '', $stringtosanitize);
|
|
|
|
|
|
}
|
2020-09-18 15:13:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 05:17:12 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Start transaction
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return int 1 if transaction successfuly opened or already opened, 0 if error
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function begin()
|
2014-03-15 05:17:12 +00:00
|
|
|
|
{
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if (!$this->transaction_opened) {
|
2020-04-10 08:59:32 +00:00
|
|
|
|
$ret = $this->query("BEGIN");
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($ret) {
|
2014-03-15 05:17:12 +00:00
|
|
|
|
$this->transaction_opened++;
|
2019-01-27 10:55:16 +00:00
|
|
|
|
dol_syslog("BEGIN Transaction", LOG_DEBUG);
|
|
|
|
|
|
dol_syslog('', 0, 1);
|
2014-03-15 05:17:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
return $ret;
|
2020-05-21 13:05:19 +00:00
|
|
|
|
} else {
|
2014-03-15 05:17:12 +00:00
|
|
|
|
$this->transaction_opened++;
|
2019-01-27 10:55:16 +00:00
|
|
|
|
dol_syslog('', 0, 1);
|
2014-03-15 05:17:12 +00:00
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-04-23 09:12:06 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Validate a database transaction
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $log Add more log to default log line
|
|
|
|
|
|
* @return int 1 if validation is OK or transaction level no started, 0 if ERROR
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function commit($log = '')
|
2014-04-23 09:12:06 +00:00
|
|
|
|
{
|
2019-01-27 10:55:16 +00:00
|
|
|
|
dol_syslog('', 0, -1);
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($this->transaction_opened <= 1) {
|
2020-04-10 08:59:32 +00:00
|
|
|
|
$ret = $this->query("COMMIT");
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($ret) {
|
2020-04-10 08:59:32 +00:00
|
|
|
|
$this->transaction_opened = 0;
|
|
|
|
|
|
dol_syslog("COMMIT Transaction".($log ? ' '.$log : ''), LOG_DEBUG);
|
2014-10-04 23:22:17 +00:00
|
|
|
|
return 1;
|
2020-05-21 13:05:19 +00:00
|
|
|
|
} else {
|
2014-10-04 23:22:17 +00:00
|
|
|
|
return 0;
|
2014-04-23 09:12:06 +00:00
|
|
|
|
}
|
2020-05-21 13:05:19 +00:00
|
|
|
|
} else {
|
2014-04-23 09:12:06 +00:00
|
|
|
|
$this->transaction_opened--;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2019-06-22 17:15:15 +00:00
|
|
|
|
* Cancel a transaction and go back to initial data values
|
2014-04-23 09:12:06 +00:00
|
|
|
|
*
|
2014-11-15 14:19:37 +00:00
|
|
|
|
* @param string $log Add more log to default log line
|
2019-06-22 17:15:15 +00:00
|
|
|
|
* @return resource|int 1 if cancelation is ok or transaction not open, 0 if error
|
2014-04-23 09:12:06 +00:00
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function rollback($log = '')
|
2014-04-23 09:12:06 +00:00
|
|
|
|
{
|
2019-01-27 10:55:16 +00:00
|
|
|
|
dol_syslog('', 0, -1);
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($this->transaction_opened <= 1) {
|
2020-04-10 08:59:32 +00:00
|
|
|
|
$ret = $this->query("ROLLBACK");
|
|
|
|
|
|
$this->transaction_opened = 0;
|
|
|
|
|
|
dol_syslog("ROLLBACK Transaction".($log ? ' '.$log : ''), LOG_DEBUG);
|
2014-04-23 09:12:06 +00:00
|
|
|
|
return $ret;
|
2020-05-21 13:05:19 +00:00
|
|
|
|
} else {
|
2014-04-23 09:12:06 +00:00
|
|
|
|
$this->transaction_opened--;
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-04-23 10:15:13 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Define limits and offset of request
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param int $limit Maximum number of lines returned (-1=conf->liste_limit, 0=no limit)
|
|
|
|
|
|
* @param int $offset Numero of line from where starting fetch
|
|
|
|
|
|
* @return string String with SQL syntax to add a limit and offset
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function plimit($limit = 0, $offset = 0)
|
2014-04-23 10:15:13 +00:00
|
|
|
|
{
|
|
|
|
|
|
global $conf;
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if (empty($limit)) {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($limit < 0) {
|
|
|
|
|
|
$limit = $conf->liste_limit;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($offset > 0) {
|
2021-08-27 20:42:04 +00:00
|
|
|
|
return " LIMIT ".((int) $offset).",".((int) $limit)." ";
|
2021-02-23 21:03:23 +00:00
|
|
|
|
} else {
|
2021-08-27 20:42:04 +00:00
|
|
|
|
return " LIMIT ".((int) $limit)." ";
|
2021-02-23 21:03:23 +00:00
|
|
|
|
}
|
2014-04-23 10:15:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 05:40:13 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return version of database server into an array
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return array Version array
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function getVersionArray()
|
2014-03-15 05:40:13 +00:00
|
|
|
|
{
|
2019-01-27 10:55:16 +00:00
|
|
|
|
return preg_split("/[\.,-]/", $this->getVersion());
|
2014-03-15 05:40:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 05:48:39 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return last request executed with query()
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string Last query
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function lastquery()
|
2014-03-15 05:48:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
return $this->lastquery;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-02-06 19:40:01 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Define sort criteria of request
|
|
|
|
|
|
*
|
2018-04-28 17:54:41 +00:00
|
|
|
|
* @param string $sortfield List of sort fields, separated by comma. Example: 't1.fielda,t2.fieldb'
|
2021-11-11 12:36:04 +00:00
|
|
|
|
* @param string $sortorder Sort order, separated by comma. Example: 'ASC,DESC'. Note: If the quantity fo sortorder values is lower than sortfield, we used the last value for missing values.
|
2017-11-25 15:21:44 +00:00
|
|
|
|
* @return string String to provide syntax of a sort sql string
|
2014-02-06 19:40:01 +00:00
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function order($sortfield = null, $sortorder = null)
|
2014-02-06 19:40:01 +00:00
|
|
|
|
{
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if (!empty($sortfield)) {
|
2020-10-29 10:05:43 +00:00
|
|
|
|
$oldsortorder = '';
|
2020-10-31 13:32:18 +00:00
|
|
|
|
$return = '';
|
|
|
|
|
|
$fields = explode(',', $sortfield);
|
|
|
|
|
|
$orders = explode(',', $sortorder);
|
|
|
|
|
|
$i = 0;
|
2020-10-29 17:44:15 +00:00
|
|
|
|
foreach ($fields as $val) {
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if (!$return) {
|
|
|
|
|
|
$return .= ' ORDER BY ';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$return .= ', ';
|
|
|
|
|
|
}
|
2014-02-06 19:40:01 +00:00
|
|
|
|
|
2020-10-31 13:32:18 +00:00
|
|
|
|
$return .= preg_replace('/[^0-9a-z_\.]/i', '', $val); // Add field
|
2017-10-16 07:29:10 +00:00
|
|
|
|
|
2020-10-30 04:45:36 +00:00
|
|
|
|
$tmpsortorder = (empty($orders[$i]) ? '' : trim($orders[$i]));
|
2017-10-16 07:29:10 +00:00
|
|
|
|
|
2015-12-02 20:12:23 +00:00
|
|
|
|
// Only ASC and DESC values are valid SQL
|
2017-04-28 22:44:25 +00:00
|
|
|
|
if (strtoupper($tmpsortorder) === 'ASC') {
|
2020-10-29 10:05:43 +00:00
|
|
|
|
$oldsortorder = 'ASC';
|
2015-12-02 20:12:23 +00:00
|
|
|
|
$return .= ' ASC';
|
2017-04-28 22:44:25 +00:00
|
|
|
|
} elseif (strtoupper($tmpsortorder) === 'DESC') {
|
2020-10-29 10:05:43 +00:00
|
|
|
|
$oldsortorder = 'DESC';
|
2015-12-02 20:12:23 +00:00
|
|
|
|
$return .= ' DESC';
|
2020-10-29 10:05:43 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$return .= ' '.($oldsortorder ? $oldsortorder : 'ASC');
|
2015-05-12 17:01:01 +00:00
|
|
|
|
}
|
2017-10-16 07:29:10 +00:00
|
|
|
|
|
2017-04-28 22:44:25 +00:00
|
|
|
|
$i++;
|
2014-02-06 19:40:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
return $return;
|
2020-05-21 13:05:19 +00:00
|
|
|
|
} else {
|
2014-02-06 19:40:01 +00:00
|
|
|
|
return '';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2014-03-15 04:47:17 +00:00
|
|
|
|
|
2014-03-15 06:11:45 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return last error label
|
|
|
|
|
|
*
|
2014-10-04 23:22:17 +00:00
|
|
|
|
* @return string Last error
|
2014-03-15 06:11:45 +00:00
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function lasterror()
|
2014-03-15 06:11:45 +00:00
|
|
|
|
{
|
|
|
|
|
|
return $this->lasterror;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-03-15 04:47:17 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Convert (by PHP) a PHP server TZ string date into a Timestamps date (GMT if gm=true)
|
2022-02-11 10:20:36 +00:00
|
|
|
|
* 19700101020000 -> 3600 with server TZ = +1 and $gm='tzserver'
|
|
|
|
|
|
* 19700101020000 -> 7200 whaterver is server TZ if $gm='gmt'
|
2014-03-15 04:47:17 +00:00
|
|
|
|
*
|
2014-10-04 23:22:17 +00:00
|
|
|
|
* @param string $string Date in a string (YYYYMMDDHHMMSS, YYYYMMDD, YYYY-MM-DD HH:MM:SS)
|
2021-01-03 14:26:31 +00:00
|
|
|
|
* @param mixed $gm 'gmt'=Input informations are GMT values, 'tzserver'=Local to server TZ
|
2015-04-06 09:28:06 +00:00
|
|
|
|
* @return int|string Date TMS or ''
|
2014-03-15 04:47:17 +00:00
|
|
|
|
*/
|
2021-01-03 14:26:31 +00:00
|
|
|
|
public function jdate($string, $gm = 'tzserver')
|
2014-03-15 04:47:17 +00:00
|
|
|
|
{
|
2021-01-03 14:10:33 +00:00
|
|
|
|
// TODO $string should be converted into a GMT timestamp, so param gm should be set to true by default instead of false
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($string == 0 || $string == "0000-00-00 00:00:00") {
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
2020-04-10 08:59:32 +00:00
|
|
|
|
$string = preg_replace('/([^0-9])/i', '', $string);
|
|
|
|
|
|
$tmp = $string.'000000';
|
|
|
|
|
|
$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);
|
2014-03-15 04:47:17 +00:00
|
|
|
|
return $date;
|
|
|
|
|
|
}
|
2014-03-15 06:20:00 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Return last query in error
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string lastqueryerror
|
|
|
|
|
|
*/
|
2020-10-31 13:32:18 +00:00
|
|
|
|
public function lastqueryerror()
|
2014-03-15 06:20:00 +00:00
|
|
|
|
{
|
|
|
|
|
|
return $this->lastqueryerror;
|
|
|
|
|
|
}
|
2020-04-18 11:20:08 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
2020-04-18 11:44:13 +00:00
|
|
|
|
* Return first result from query as object
|
|
|
|
|
|
* Note : This method executes a given SQL query and retrieves the first row of results as an object. It should only be used with SELECT queries
|
|
|
|
|
|
* Dont add LIMIT to your query, it will be added by this method
|
2021-11-01 02:30:22 +00:00
|
|
|
|
*
|
2021-11-06 20:04:17 +00:00
|
|
|
|
* @param string $sql The sql query string
|
|
|
|
|
|
* @return bool|int|object False on failure, 0 on empty, object on success
|
2020-04-18 11:20:08 +00:00
|
|
|
|
*/
|
|
|
|
|
|
public function getRow($sql)
|
|
|
|
|
|
{
|
2021-11-01 02:30:22 +00:00
|
|
|
|
$sql .= ' LIMIT 1';
|
2020-04-18 11:20:08 +00:00
|
|
|
|
|
|
|
|
|
|
$res = $this->query($sql);
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($res) {
|
2021-11-04 11:10:19 +00:00
|
|
|
|
$obj = $this->fetch_object($res);
|
2021-11-05 11:42:42 +00:00
|
|
|
|
if ($obj) {
|
2021-11-04 11:10:19 +00:00
|
|
|
|
return $obj;
|
2021-11-05 11:42:42 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
return 0;
|
2021-11-04 11:10:19 +00:00
|
|
|
|
}
|
2020-04-18 11:20:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2020-04-18 11:44:13 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
2021-11-06 20:11:05 +00:00
|
|
|
|
* Return all results from query as an array of objects
|
2020-04-18 11:44:13 +00:00
|
|
|
|
* Note : This method executes a given SQL query and retrieves all row of results as an array of objects. It should only be used with SELECT queries
|
2021-11-01 02:30:22 +00:00
|
|
|
|
* be carefull with this method use it only with some limit of results to avoid performences loss.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $sql The sql query string
|
|
|
|
|
|
* @return bool|array Result
|
2021-08-17 18:02:19 +00:00
|
|
|
|
* @deprecated
|
2020-04-18 11:44:13 +00:00
|
|
|
|
*/
|
|
|
|
|
|
public function getRows($sql)
|
|
|
|
|
|
{
|
|
|
|
|
|
$res = $this->query($sql);
|
2021-02-23 21:03:23 +00:00
|
|
|
|
if ($res) {
|
2020-04-18 11:44:13 +00:00
|
|
|
|
$results = array();
|
2020-10-31 13:32:18 +00:00
|
|
|
|
if ($this->num_rows($res) > 0) {
|
|
|
|
|
|
while ($obj = $this->fetch_object($res)) {
|
2020-04-18 11:44:13 +00:00
|
|
|
|
$results[] = $obj;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return $results;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2013-09-10 10:29:55 +00:00
|
|
|
|
}
|