2

サーバー環境の構成に問題があります。PDO を使用した PHP は、ローカルホストのように日付をフォーマットしていません。テストするために、2 つの接続を作成しました (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>

結果:

ここに画像の説明を入力

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 トリガーで設定でき、セッション レベルで設定できるなどのようです。これは、2 つの異なる環境で異なる動作を説明できる可能性があります。これについての興味深い投稿は次のとおりです。

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

于 2013-02-18T20:44:33.120 に答える