2

我在配置服务器环境时遇到问题,带有 PDO 的 PHP 没有像 localhost 那样格式化日期。为了测试它,我创建了两个连接(使用 pdo 和 oci 和 mysql)。在 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>

结果:

在此处输入图像描述

4

1 回答 1

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 的代码变得更加困难。


回复您的评论:

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

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

于 2013-02-18T20:44:33.120 回答