在Doctrine DBAL中设置连接字符集,并与PHP PDO进行比较

时间:2015-04-08 19:23:50

标签: php pdo doctrine-orm character-encoding dbal

是否需要将set names ourcharset与带有PHP >=5.3.2 and <5.3.6的DBAL一起使用?

在PHP 5.3.6之前,PDO连接中的charset选项为ignored 如果我们运行的是旧版本的PHP,我们必须使用set names ourcharset

Actual Doctrine DBAL 2.5.1 require PHP >=5.3.2
如果某人有PHP&lt; 5.3.6版本,我无法找到Doctrine团队的建议。

DBAL主要基于PDO,但它也有一些改进,所以我想也许这有所改进......但是在Doctrine DBAL documentation page我发现只有这个:

  

直到PHP 5.3.6 PDO在使用非ascii时存在安全问题   兼容的字符集。即使使用“SET NAMES”指定字符集,   模拟准备好的语句和PDO#quote无法可靠地逃脱   值,开放潜在的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 个答案:

答案 0 :(得分:0)

看起来DBAL在这里没有任何改进。 因此,如果我们的应用程序可能会在>=5.3.2 and <5.3.6之间使用PHP,那么请使用其他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);
}
?>