2013-02-18 27 views
2

我有问题来配置我的服务器环境,PHP与PDO没有格式化日期像本地主机。 为了测试它,我创建了两个连接(使用ocdo和mysql使用pdo)。 在localhost上,oci和mysql正常运行,但在服务器上只有mysql保持正确的格式。服务器/本地主机之间的不同环境正在改变日期格式-php pdo mysql/oci

重要细节:在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 = "^[email protected]^"; 
    $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

+0

你比较环境之间的php.ini? – prodigitalson 2013-02-18 20:01:28

+0

我能比较什么?两个php.ini的时区是America/Sao_Paulo – claudioivp 2013-02-18 20:02:46

+1

尽管我不知道原因,但可以在SELECT中使用mysql日期函数来显式指定返回日期的方式:[mysql date docs](https ://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html) – Jerry 2013-02-18 20:03:20

回答

1

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

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

这会使Oracle日期输出li 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进行设置,它可以通过登录触发器进行设置,它可以在会话级别设置等,这可以解释两种不同环境中的不同行为。下面是关于它的有趣的帖子:

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

+0

作为$ driver_options它没有运行。但如果试图查询它,我会获得成功。 '$ conn-> query(“Alter Session set NLS_DATE_FORMAT ='DD-MM-YYYY'”);' 这真的很酷。在我将此作为答案之前,请说出我的看法:您认为这两种环境可能会发生什么,导致这种差异?大拥抱。 – claudioivp 2013-02-19 11:25:14

相关问题