【问题标题】:Setting connection charset in Doctrine DBAL with comparison to PHP PDO在 Doctrine DBAL 中设置连接字符集并与 PHP PDO 进行比较
【发布时间】:2015-06-13 22:31:06
【问题描述】:

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

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

实际学说 DBAL 2.5.1 require PHP >=5.3.2.
如果有人拥有 PHP

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);
}
?>

【问题讨论】:

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


    【解决方案1】:

    看起来 DBAL 在这里没有任何改进。 所以,如果我们的应用有可能在&gt;=5.3.2 and &lt;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);
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 2020-01-30
      • 1970-01-01
      • 2011-05-20
      • 2020-03-20
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      相关资源
      最近更新 更多