Есть ли необходимость в использовании set names ourcharset
с DBAL с PHP >=5.3.2 and <5.3.6
?
До PHP 5.3.6 опция charset в соединении PDO была игнорируются.
Если мы работали с более старой версией PHP, мы должны были использовать set names ourcharset
,
Актуальная доктрина DBAL 2.5.1 требовать PHP >=5.3.2
,
Я не могу найти то, что советует команда Doctrine, если у кого-то есть PHP <Версия 5.3.6.
DBAL в основном основан на PDO, но у него также есть некоторые улучшения по сравнению с ним, поэтому я подумал, может быть, это было улучшено … но в Doctrine DBAL страница документации Я нашел только это:
Вплоть до PHP 5.3.6 PDO имеет проблемы с безопасностью при использовании не ascii
совместимые кодировки. Даже если указать кодировку с помощью «SET NAMES»,
эмулированные подготовленные заявления и цитата PDO # не могли надежно убежать
значения, открывающиеся для потенциальных инъекций SQL. Если вы используете PHP
5.3.6 Вы можете решить эту проблему, передав параметр драйвера «charset» в драйвер Doctrine PDO MySQL. Использование SET NAMES не достаточно!
В PDO к этому времени я сделал:
<?php
$dsn = 'mysql:host='.$_SESSION['options']['host'].';port='.$_SESSION['options']['port'].';dbname='.$_SESSION['options']['dbname'].';charset='.$_SESSION['options']['charset'];
try {
$conn = new \PDO($dsn, $_SESSION['options']['user'], $_SESSION['options']['pass']);
if(version_compare(PHP_VERSION, '5.3.6', '<')) //is this required with DBAL?
$conn->exec("set names {$_SESSION['options']['charset']}");
} catch (\PDOException $e) {
trigger_error($e->getMessage(), E_USER_ERROR);
}
?>
С DBAL это:
<?php
require_once "lib/autoload.php";
$config = new \Doctrine\DBAL\Configuration();
$params = array(
'dbname' => $_SESSION['options']['dbname'],
'user' => $_SESSION['options']['user'],
'password' => $_SESSION['options']['pass'],
'host' => $_SESSION['options']['host'],
'port' => $_SESSION['options']['port'],
'driver' => 'pdo_mysql',
'charset' => $_SESSION['options']['charset'],
);
try {
$conn = \Doctrine\DBAL\DriverManager::getConnection($params, $config);
} catch (\Exception $e) {
trigger_error($e->getMessage(), E_USER_ERROR);
}
?>
Похоже, что DBAL здесь ничего не улучшило.
Таким образом, если есть вероятность, что наше приложение будет использоваться с PHP между >=5.3.2 and <5.3.6
тогда да, используйте дополнительные SET NAMES
:
<?php
require_once "lib/autoload.php";
$config = new \Doctrine\DBAL\Configuration();
$params = array(
'dbname' => $_SESSION['options']['dbname'],
'user' => $_SESSION['options']['user'],
'password' => $_SESSION['options']['pass'],
'host' => $_SESSION['options']['host'],
'port' => $_SESSION['options']['port'],
'driver' => 'pdo_mysql',
'charset' => $_SESSION['options']['charset'],
);
if(version_compare(PHP_VERSION, '5.3.6', '<'))
$params['driverOptions'] = array(1002=>'SET NAMES '.$_SESSION['options']['charset']);
//"1002" is value of constant MYSQL_ATTR_INIT_COMMAND
try {
$conn = \Doctrine\DBAL\DriverManager::getConnection($params, $config);
} catch (\Exception $e) {
trigger_error($e->getMessage(), E_USER_ERROR);
}
?>
Других решений пока нет …