Различная среда между сервером/локальным хостом изменяет формат даты - 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>
Результат:
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