web-dev-qa-db-fra.com

Convertit l'objet datetime mssql en PHP chaîne

Je récupère des informations dans une base de données et l'enregistrement est au format DateTime MSSQL. Lorsque je le renvoie, il s'affiche dans mon tableau comme suit:

[arrayItem] => DateTime Object
    (
        [date] => 2008-06-05 09:14:11
        [timezone_type] => 3
        [timezone] => Europe/London
    )

Lorsque j'essaie d'extraire ceci sous forme de tableau (c'est-à-dire $array[arrayItem][date]), j'obtiens une erreur:

Erreur fatale: impossible d'utiliser un objet de type DateTime en tant que tableau

J'ai également essayé de formater les données en SQL avant qu'elles ne soient transmises à PHP, et les fonctions strtotime n'ont eu aucune joie.

Toute recommandation serait la bienvenue, je me déchire les cheveux avec celui-ci!

Merci

14
Nick

Cela m'a aussi surpris deux fois.

J'espère que cela vous aidera, car c'est ce que j'ai moi-même :)

http://af-design.com/blog/2010/03/13/Microsoft-sql-server-driver-for-php-returns-datetime-object/

Voici l'essentiel de ce que dit cette page, au cas où le lien tomberait.

Lorsque vous interrogez une colonne définie comme datetime, le native PHP extension SQL Server renvoie une chaîne où, comme l'extension Microsoft , renvoie un objet DateTime. Donc, si vous attendez une chaîne, vous devrez ajuster votre code en conséquence.

Il est ensuite expliqué que vous pouvez simplement ajouter un paramètre supplémentaire à vos demandes dans la base de données, en précisant que vous souhaitez que vos dates soient renvoyées sous forme de chaînes. Ajoutez simplement le paramètre ReturnDatesAsStrings, en spécifiant true.

Exemple:

$connectionParams = array(
    'USR'=>'user',
    'PASS'=>'pass',
    'Database'='myDatabase',
    'ReturnDatesAsStrings'=>true  //<-- This is the important line
);
$conn = sqlsrv_connect('127.0.0.1',$connectionParams);

Ensuite, vous pouvez utiliser $conn comme vous le feriez régulièrement pour votre connexion à la base de données sqlsrv. Seules les dates seront renvoyées sous forme de chaînes, au lieu d'objets DateTime.

Alternativement , si vous vouliez seulement un horodatage en dehors de la date et l'heure, vous pouvez appeler: 

$myDateTimeObject->getTimestamp();
24
Brian

Vous devriez y accéder comme ci-dessous. l'index associatif arrayItem contient un objet qui possède certaines propriétés.

$array['arrayItem']->date;
$array['arrayItem']->timezone_type;
6
Shakti Singh

Comme c'est un objet, vous ne pouvez pas obtenir les propriétés comme vous le faites avec un tableau. Vous avez besoin du signe -> pour accéder à la date. Dans votre question, il semble que vous ayez var_dumpé la variable $arrayItem, utilisez-la ainsi:

$date = strtotime($array['arrayItem']->date]);
2
Sascha Galley

Essaye ça. Ça marche pour moi:

$array['arrayItem']->format('Y-m-d H:i:s');

Référence: http://php.net/manual/en/datetime.format.php

2
ron
echo $array['arrayItem']->format('Y-m-d H:i:s');
1
osnosn

Si vous souhaitez afficher les données dans la page PHP, il vous suffit de copier et coller le code <?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['column_name']);

Cela a fonctionné pour moi

date('Y-m-d', strtotime($rs->Fields('time')->value)

Pour la connexion Adodb sur le serveur MSSQL

0
Sanjay Khadka

Une autre solution consiste à faire une boucle.

$_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
}
0
Linesofcode

C'est une fonctionnalité simple à utiliser.

Vous pouvez convertir un objet date à partir d'une date au lieu de la chaîne , Voici comment utiliser:

$obj->arrayItem->format('H:i:s')
$obj->arrayItem->format('Y-m-d')
0
Chintan Gor