| Server IP : 213.186.33.4 / Your IP : 216.73.216.193 Web Server : Apache System : Linux webm006.cluster103.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : awebpaca ( 35430) PHP Version : 8.5.0 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/a/w/e/awebpaca/piwik/core/Db/Adapter/ |
Upload File : |
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Db\Adapter;
use Exception;
use Piwik\Config;
use Piwik\Db;
use Piwik\Db\AdapterInterface;
use Piwik\Piwik;
use Zend_Config;
use Zend_Db_Adapter_Mysqli;
/**
*/
class Mysqli extends Zend_Db_Adapter_Mysqli implements AdapterInterface
{
/**
* Constructor
*
* @param array|Zend_Config $config database configuration
*/
public function __construct($config)
{
// Enable LOAD DATA INFILE
$config['driver_options'][MYSQLI_OPT_LOCAL_INFILE] = true;
if ($config['enable_ssl']) {
if (!empty($config['ssl_key'])) {
$config['driver_options']['ssl_key'] = $config['ssl_key'];
}
if (!empty($config['ssl_cert'])) {
$config['driver_options']['ssl_cert'] = $config['ssl_cert'];
}
if (!empty($config['ssl_ca'])) {
$config['driver_options']['ssl_ca'] = $config['ssl_ca'];
}
if (!empty($config['ssl_ca_path'])) {
$config['driver_options']['ssl_ca_path'] = $config['ssl_ca_path'];
}
if (!empty($config['ssl_cipher'])) {
$config['driver_options']['ssl_cipher'] = $config['ssl_cipher'];
}
if (!empty($config['ssl_no_verify'])) {
$config['driver_options']['ssl_no_verify'] = $config['ssl_no_verify'];
}
}
parent::__construct($config);
}
/**
* Reset the configuration variables in this adapter.
*/
public function resetConfig()
{
$this->_config = array();
}
/**
* Return default port.
*
* @return int
*/
public static function getDefaultPort()
{
return 3306;
}
protected function _connect()
{
if ($this->_connection) {
return;
}
parent::_connect();
$this->_connection->query('SET sql_mode = "' . Db::SQL_MODE . '"');
}
/**
* Check MySQL version
*
* @throws Exception
*/
public function checkServerVersion()
{
$serverVersion = $this->getServerVersion();
$requiredVersion = Config::getInstance()->General['minimum_mysql_version'];
if (version_compare($serverVersion, $requiredVersion) === -1) {
throw new Exception(Piwik::translate('General_ExceptionDatabaseVersion', array('MySQL', $serverVersion, $requiredVersion)));
}
}
/**
* Returns the MySQL server version
*
* @return null|string
*/
public function getServerVersion()
{
// prioritizing SELECT @@VERSION in case the connection version string is incorrect (which can
// occur on Azure)
$versionInfo = $this->fetchAll('SELECT @@VERSION');
if (count($versionInfo)) {
return $versionInfo[0]['@@VERSION'];
}
return parent::getServerVersion();
}
/**
* Check client version compatibility against database server
*
* @throws Exception
*/
public function checkClientVersion()
{
$serverVersion = $this->getServerVersion();
$clientVersion = $this->getClientVersion();
// incompatible change to DECIMAL implementation in 5.0.3
if (version_compare($serverVersion, '5.0.3') >= 0
&& version_compare($clientVersion, '5.0.3') < 0
) {
throw new Exception(Piwik::translate('General_ExceptionIncompatibleClientServerVersions', array('MySQL', $clientVersion, $serverVersion)));
}
}
/**
* Return number of affected rows in last query
*
* @param mixed $queryResult Result from query()
* @return int
*/
public function rowCount($queryResult)
{
return mysqli_affected_rows($this->_connection);
}
/**
* Returns true if this adapter's required extensions are enabled
*
* @return bool
*/
public static function isEnabled()
{
$extensions = @get_loaded_extensions();
return in_array('mysqli', $extensions);
}
/**
* Returns true if this adapter supports blobs as fields
*
* @return bool
*/
public function hasBlobDataType()
{
return true;
}
/**
* Returns true if this adapter supports bulk loading
*
* @return bool
*/
public function hasBulkLoader()
{
return true;
}
/**
* Test error number
*
* @param Exception $e
* @param string $errno
* @return bool
*/
public function isErrNo($e, $errno)
{
return self::isMysqliErrorNumber($e, $this->_connection, $errno);
}
/**
* Test error number
*
* @param Exception $e
* @param string $errno
* @return bool
*/
public static function isMysqliErrorNumber($e, $connection, $errno)
{
if (is_null($connection)) {
if (preg_match('/(?:\[|\s)([0-9]{4})(?:\]|\s)/', $e->getMessage(), $match)) {
return $match[1] == $errno;
}
return mysqli_connect_errno() == $errno;
}
return mysqli_errno($connection) == $errno;
}
/**
* Execute unprepared SQL query and throw away the result
*
* Workaround some SQL statements not compatible with prepare().
* See http://framework.zend.com/issues/browse/ZF-1398
*
* @param string $sqlQuery
* @return int Number of rows affected (SELECT/INSERT/UPDATE/DELETE)
*/
public function exec($sqlQuery)
{
$rc = mysqli_query($this->_connection, $sqlQuery);
$rowsAffected = mysqli_affected_rows($this->_connection);
if (!is_bool($rc)) {
mysqli_free_result($rc);
}
return $rowsAffected;
}
/**
* Is the connection character set equal to utf8?
*
* @return bool
*/
public function isConnectionUTF8()
{
$charset = mysqli_character_set_name($this->_connection);
return strpos($charset, 'utf8') === 0;
}
/**
* Get client version
*
* @return string
*/
public function getClientVersion()
{
$this->_connect();
$version = $this->_connection->server_version;
$major = (int)($version / 10000);
$minor = (int)($version % 10000 / 100);
$revision = (int)($version % 100);
return $major . '.' . $minor . '.' . $revision;
}
}