Различная среда между сервером/локальным хостом изменяет формат даты - php pdo mysql/oci


У меня возникли проблемы с настройкой моей серверной среды, PHP с PDO не форматирует дату, как локальный хост. Чтобы проверить это, я создал два соединения (используя pdo с oci и mysql). На локальном хосте 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

Author: Vadim K., 2013-02-18

1 answers

В 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(), что затрудняет написание кода, независимого от СУБД.


Ваш комментарий:

Похоже, что формат NLS_DATE_FORMAT может быть установлен глобально в initORCL.ora, он может быть установлен триггером входа в систему, он может быть установлен на уровне сеанса и т.д. Это может объяснить различное поведение в двух разных средах. Вот интересный пост об этом:

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

 1
Author: Bill Karwin, 2013-02-20 18:48:06