server / localhost之间的不同环境正在改变日期格式 - php pdo mysql / oci

时间:2013-02-18 19:54:10

标签: php mysql oracle pdo

我在配置我的服务器环境时遇到问题,带有PDO的PHP没有像localhost那样格式化日期。 为了测试它,我创建了两个连接(使用带有oci和mysql的pdo)。 在localhost上,oci和mysql正常运行,但在服务器上只有mysql保持正确的格式。

重要细节:在sqldeveloper上,它以与localhost pdo / oci相同的格式显示数据。

我的本​​地主机是WINDOWS 7而我的服务器是LINUX DEBIAN X64。

服务器上的pdo / oci可能会发生什么?

代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sem título</title>
</head>

<body>
<?php
try
{
    $params->host = "172.0.0.0:1521";
    $params->dbname = "geo";
    $params->user = "root";
    $params->pass = "";

    $conn = new PDO("oci:dbname=//$params->host/$params->dbname;charset=UTF8", "$params->user", "$params->pass");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $conn->prepare("select * from tb_geooficio where tipo = 1 and cadastro_im = 37693500 ");
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);
}
catch(Exception $e)
{
    echo $e->getMessage();
}
?>

<?php
try
{
    $host = "200.0.0.1";
    $user = "postmaster";
    $pass = "^PostM@ster^";
    $db = "bd_controleinternet";

    $conn = new PDO("mysql:host=$host; dbname=$db", "$user", "$pass");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $conn->prepare("select * from tbl_secretaria where sec_id = 7");
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);
}
catch(Exception $e)
{
    echo $e->getMessage();
}
?>
</body>
</html>

结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

在Oracle中,您可以使用以下命令更改用于日期转换的默认格式以匹配MySQL默认值:

ALTER SESSION SET NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';

这将使Oracle日期输出像MySQL日期一样。

您可以在每次与PDO的连接时实现这一点:

$driver_options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'ALTER SESSION...' );
try {
    $dbh = new PDO($dsn, $user, $pw, $driver_options);
}
catch (PDOException $e) {
    // Handle exception
}

Oracle和MySQL都具有显式格式化日期的功能,您可以在查询选择列表中的表达式中调用它们。但是在Oracle中,函数是TO_CHAR(),在MySQL中函数是DATE_FORMAT(),这使得编写与RDBMS无关的代码变得更加困难。


重新评论:

似乎可以在initORCL.ora中全局设置NLS_DATE_FORMAT,它可以通过LOGON触发器设置,可以在会话级别设置等等。这可以解释两种不同环境中的不同行为。这是一篇有趣的帖子:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:351017764854