Раздел вопрос-ответ mysqli::real_escape_string(): invalid object or resource mysqli

Есть такой код в mysqli-адаптере:

function _performEscape($s, $isIdent)
{
	if (!$this->link) {
		$this->_lazyConnect();
	}

	if (!$isIdent) {
		return "'" . $this->link->real_escape_string($s) . "'";
	} else {
		return "`" . str_replace('`', '``', $s) . "`";
	}
}

Код выше обычно работает ок, но, в моменты пиковых нагрузок на БД воркеры могут выбрасывать такие exceptions:

mysqli::real_escape_string(): invalid object or resource mysqli

Не очень понятна природа таки ошибок, ведь до выполнения функции _performEscape connection должен быть в любом случае установлен. А для выполнения mysqli::real_escape_string вообще не нужен действующий коннекшен к БД. Следующий код подтверждает, что при потере коннекта с базой запросы не проходят, но real_escape_string работает.

$link = mysqli_init();

$link->real_connect(
	'localhost',
	'root',
	'',
	'test'
);

`sudo service mysql restart`;

$link->query('SHOW TABLES');
// выбрасывается ErrorException: Error while sending QUERY packet.
$link = mysqli_init();

$link->real_connect(
	'localhost',
	'root',
	'',
	'test'
);

`sudo service mysql restart`;

$link->real_escape_string('aaaaaa'); 
// всё ok
$link = mysqli_init();

$link->real_connect(
	'localhost',
	'root',
	'',
	'test'
);

`sudo service mysql stop`; //STOP!!!

$link->real_escape_string('aaaaaa'); 
// всё ok!

 

share

1 ответ

Решилось добавлением принудительного reconnect`а, если вместо $link битый объект mysqli. С добавлением try и cath ErrorException.

try {
	return "'" . $this->link->real_escape_string($s) . "'";
}
catch (ErrorException $e) {
	$this->disconnect();
	$this->_lazyConnect();
	return "'" . $this->link->real_escape_string($s) . "'";
}

https://github.com/bopoda/dbsimple-mysqli/pull/1/files

Добавить комментарий
    как минимум 5 символов

    icon Вход в систему

    зарегистрироваться