是否需要将set names ourcharset
与DBAL与PHP >=5.3.2 and <5.3.6
一起使用?
在PHP 5.3.6之前,PDO连接中的字符集选项被忽略
如果我们运行的是旧版本的PHP,那么我们必须使用set names ourcharset
。
实际条令DBAL 2.5.1需要PHP >=5.3.2
如果有人有PHP<5.3.6版本。
DBAL主要基于PDO,但它也有一些改进,所以我想也许这是改进了。。。但在条令DBAL文档页面上,我只找到了这个:
在PHP 5.3.6之前,PDO在使用非ascii时存在安全问题兼容的字符集。即使使用"SET NAMES"指定字符集,模拟的已准备好的语句和PDO#引号无法可靠地转义值,为潜在的SQL注入打开了大门。如果您正在运行PHP5.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 DoctrineDBALConfiguration();
$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 = DoctrineDBALDriverManager::getConnection($params, $config);
} catch (Exception $e) {
trigger_error($e->getMessage(), E_USER_ERROR);
}
?>
看起来DBAL在这里没有任何改进。因此,如果我们的应用程序有可能在>=5.3.2 and <5.3.6
之间与PHP一起使用,那么是的,使用额外的SET NAMES
:
<?php
require_once "lib/autoload.php";
$config = new DoctrineDBALConfiguration();
$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 = DoctrineDBALDriverManager::getConnection($params, $config);
} catch (Exception $e) {
trigger_error($e->getMessage(), E_USER_ERROR);
}
?>