Files
wingedit.pl/wp-content/plugins/wpvivid-backuprestore/includes/class-wpvivid-additional-db-method.php
2026-03-11 15:57:27 +01:00

255 lines
8.5 KiB
PHP

<?php
class WPvivid_Additional_DB_Method
{
private $dbuser;
private $dbpass;
private $dbhost;
private $use_mysqli = false;
private $dbh;
private $has_connected = false;
public $charset;
public $collate;
public function __construct($dbuser, $dbpass, $dbhost){
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
$this->dbhost = $dbhost;
if ( function_exists( 'mysqli_connect' ) ) {
$this->use_mysqli = true;
if ( defined( 'WP_USE_EXT_MYSQL' ) ) {
$this->use_mysqli = ! WP_USE_EXT_MYSQL;
}
}
}
public function wpvivid_parse_db_host( $host ) {
$port = null;
$socket = null;
$is_ipv6 = false;
// First peel off the socket parameter from the right, if it exists.
$socket_pos = strpos( $host, ':/' );
if ( $socket_pos !== false ) {
$socket = substr( $host, $socket_pos + 1 );
$host = substr( $host, 0, $socket_pos );
}
// We need to check for an IPv6 address first.
// An IPv6 address will always contain at least two colons.
if ( substr_count( $host, ':' ) > 1 ) {
$pattern = '#^(?:\[)?(?P<host>[0-9a-fA-F:]+)(?:\]:(?P<port>[\d]+))?#';
$is_ipv6 = true;
} else {
// We seem to be dealing with an IPv4 address.
$pattern = '#^(?P<host>[^:/]*)(?::(?P<port>[\d]+))?#';
}
$matches = array();
$result = preg_match( $pattern, $host, $matches );
if ( 1 !== $result ) {
// Couldn't parse the address, bail.
return false;
}
$host = '';
foreach ( array( 'host', 'port' ) as $component ) {
if ( ! empty( $matches[ $component ] ) ) {
$$component = $matches[ $component ];
}
}
return array( $host, $port, $socket, $is_ipv6 );
}
public function db_version() {
if ( $this->use_mysqli ) {
$server_info = mysqli_get_server_info( $this->dbh );
} else {
$server_info = mysql_get_server_info( $this->dbh );
}
return preg_replace( '/[^0-9.].*/', '', $server_info );
}
public function has_cap( $db_cap ) {
$version = $this->db_version();
switch ( strtolower( $db_cap ) ) {
case 'collation': // @since 2.5.0
case 'group_concat': // @since 2.7.0
case 'subqueries': // @since 2.7.0
return version_compare( $version, '4.1', '>=' );
case 'set_charset':
return version_compare( $version, '5.0.7', '>=' );
case 'utf8mb4': // @since 4.1.0
if ( version_compare( $version, '5.5.3', '<' ) ) {
return false;
}
if ( $this->use_mysqli ) {
$client_version = mysqli_get_client_info();
} else {
$client_version = mysql_get_client_info();
}
/*
* libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server.
* mysqlnd has supported utf8mb4 since 5.0.9.
*/
if ( false !== strpos( $client_version, 'mysqlnd' ) ) {
$client_version = preg_replace( '/^\D+([\d.]+).*/', '$1', $client_version );
return version_compare( $client_version, '5.0.9', '>=' );
} else {
return version_compare( $client_version, '5.5.3', '>=' );
}
case 'utf8mb4_520': // @since 4.6.0
return version_compare( $version, '5.6', '>=' );
}
return false;
}
public function determine_charset( $charset, $collate ) {
if ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) {
return compact( 'charset', 'collate' );
}
if ( 'utf8' === $charset && $this->has_cap( 'utf8mb4' ) ) {
$charset = 'utf8mb4';
}
if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) {
$charset = 'utf8';
$collate = str_replace( 'utf8mb4_', 'utf8_', $collate );
}
if ( 'utf8mb4' === $charset ) {
// _general_ is outdated, so we can upgrade it to _unicode_, instead.
if ( ! $collate || 'utf8_general_ci' === $collate ) {
$collate = 'utf8mb4_unicode_ci';
} else {
$collate = str_replace( 'utf8_', 'utf8mb4_', $collate );
}
}
// _unicode_520_ is a better collation, we should use that when it's available.
if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) {
$collate = 'utf8mb4_unicode_520_ci';
}
return compact( 'charset', 'collate' );
}
public function init_charset() {
$charset = '';
$collate = '';
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
$charset = 'utf8';
if ( defined( 'DB_COLLATE' ) && DB_COLLATE ) {
$collate = DB_COLLATE;
} else {
$collate = 'utf8_general_ci';
}
} elseif ( defined( 'DB_COLLATE' ) ) {
$collate = DB_COLLATE;
}
if ( defined( 'DB_CHARSET' ) ) {
$charset = DB_CHARSET;
}
$charset_collate = $this->determine_charset( $charset, $collate );
$this->charset = $charset_collate['charset'];
$this->collate = $charset_collate['collate'];
}
public function wpvivid_do_connect($allow_bail = true){
$new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
$error_code = '';
$error = 'Unknown Error.';
if ( $this->use_mysqli ) {
$this->dbh = mysqli_init();
$host = $this->dbhost;
$port = null;
$socket = null;
$is_ipv6 = false;
if ( $host_data = $this->wpvivid_parse_db_host( $this->dbhost ) ) {
list( $host, $port, $socket, $is_ipv6 ) = $host_data;
}
if ( $is_ipv6 && extension_loaded( 'mysqlnd' ) ) {
$host = "[$host]";
}
@mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpass, null, $port, $socket, $client_flags );
if ( $this->dbh->connect_errno ) {
$error_code = $this->dbh->connect_errno;
$error = $this->dbh->connect_error;
$this->dbh = null;
$attempt_fallback = true;
if ( $this->has_connected ) {
$attempt_fallback = false;
} elseif ( defined( 'WP_USE_EXT_MYSQL' ) && ! WP_USE_EXT_MYSQL ) {
$attempt_fallback = false;
} elseif ( ! function_exists( 'mysql_connect' ) ) {
$attempt_fallback = false;
}
if ( $attempt_fallback ) {
$this->use_mysqli = false;
return $this->wpvivid_do_connect( $allow_bail );
}
}
}
else{
$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpass, $new_link, $client_flags );
}
if($this->dbh){
$this->has_connected = true;
$ret['result'] = WPVIVID_SUCCESS;
}
else{
$ret['result'] = WPVIVID_FAILED;
$ret['error'] = $error_code.': '.$error;
}
return $ret;
}
public function wpvivid_show_additional_databases(){
$query = 'SHOW DATABASES;';
$result = '';
if ( ! empty( $this->dbh ) && $this->use_mysqli ) {
$result = mysqli_query( $this->dbh, $query );
} elseif ( ! empty( $this->dbh ) ) {
$result = mysql_query( $query, $this->dbh );
}
if ( $this->use_mysqli && $result instanceof mysqli_result ) {
while ( $row = mysqli_fetch_object( $result ) ) {
$database_array[] = $row;
}
} elseif ( is_resource( $result ) ) {
while ( $row = mysql_fetch_object( $result ) ) {
$database_array[] = $row;
}
}
if(!empty($database_array)){
foreach ($database_array as $key => $value){
$last_result[] = $value->Database;
}
}
return $last_result;
}
}