Настройка кодировки соединения в Doctrine DBAL по сравнению с PHP PDO

Есть ли необходимость в использовании 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);
}
?>

1

Решение

Похоже, что 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);
}
?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]