Преобразование объекта mssql datetime в строку PHP
Я беру некоторую информацию из базы данных, и запись находится в формате MSSQL DateTime, когда я возвращаю ее, она отображается в моем массиве следующим образом:
[arrayItem] => DateTime Object
(
[date] => 2008-06-05 09:14:11
[timezone_type] => 3
[timezone] => Europe/London
)
Когда я пытаюсь извлечь это в виде массива (т.Е. $array[arrayItem][date]
) Я получаю сообщение об ошибке:
Неустранимая ошибка: Невозможно использовать объект типа DateTime в качестве массива
Я также пробовал форматировать данные в SQL, прежде чем они будут переданы в PHP, и функции strtotime, и у меня не было радости.
Любой рекомендации были бы очень кстати, я рву на себе волосы этим!
Спасибо
9 answers
Это тоже пару раз меня настигало.
Надеюсь, это поможет вам, как и мне самому:)
Http://af-design.com/blog/2010/03/13/microsoft-sql-server-driver-for-php-returns-datetime-object/
Вот суть того, что говорится на этой странице, на случай, если ссылка исчезнет.
При запросе столбца, определенного как
datetime
, собственное расширение PHP SQL Server возвращает строку, где в качестве Microsoft расширение возвращает объект DateTime. Поэтому, если вы ожидаете строку, вам нужно будет соответствующим образом скорректировать свой код.
Далее объясняется, что вы можете просто добавить дополнительный параметр к своим запросам в базу данных, указав, что вы хотите, чтобы ваши даты возвращались в виде строк. Просто добавьте параметр ReturnDatesAsStrings
, указав true
.
Пример:
$connectionParams = array(
'USR'=>'user',
'PASS'=>'pass',
'Database'='myDatabase',
'ReturnDatesAsStrings'=>true //<-- This is the important line
);
$conn = sqlsrv_connect('127.0.0.1',$connectionParams);
Затем вы можете использовать $conn
, как обычно, для подключения к базе данных sqlsrv, только даты будут возвращаться в виде строк, а не объектов даты и времени.
В качестве альтернативы, если бы все, что вам было нужно, - это отметка времени вне даты и времени, вы могли бы позвонить:
$myDateTimeObject->getTimestamp();
Вы должны получить к ним доступ, как показано ниже. ассоциативный индекс arrayItem
содержит объект, обладающий некоторыми свойствами.
$array['arrayItem']->date;
$array['arrayItem']->timezone_type;
Поскольку это объект, вы не можете получить свойства, как с массивом. Вам нужен знак ->
для доступа к дате. В вашем вопросе кажется, что вы изменили значение переменной $arrayItem
, поэтому используйте ее следующим образом:
$date = strtotime($array['arrayItem']->date]);
echo $array['arrayItem']->format('Y-m-d H:i:s');
Попробуйте, как это работает для меня:
$array['arrayItem']->format('Y-m-d H:i:s');
Предпочтения: http://php.net/manual/en/datetime.format.php
Другое решение - замкнуть цикл.
$_date = \DateTime::createFromFormat('D M d Y H:i:s e+', $the_date);
foreach($_dateStart as $row){
echo $row; // returns 2014-06-04 15:00
break; // stops at the first position
}
Если вы хотите, чтобы 2 отображали данные на странице php, просто скопируйте и вставьте код:
$serverName = "your_sqlserver";
$username = "your_username";
$password = "your_password";
$database = "your_database";
$connectionInfo = array( "UID"=>$username, "PWD"=>$password, "Database"=>$database, "ReturnDatesAsStrings"=>true);
$connection = sqlsrv_connect($serverName, $connectionInfo);
$result = sqlsrv_query( $connection,"SELECT * from table'");
$msrow = sqlsrv_fetch_array($result);
Print_r($msrow['имя_столбца']);
Это функционально и просто в использовании
Вы можете преобразовать дату из объекта даты вместо строки вот как использовать
$obj->arrayItem->format('H:i:s')
$obj->arrayItem->format('Y-m-d')
Это сработало для меня
date('Y-m-d', strtotime($rs->Fields('time')->value)
Для подключения Adodb на сервере MSSQL