PHP和sqlsrv:将格式化的查询行回显到表

时间:2018-12-18 18:43:04

标签: php sqlsrv

我正在尝试使用PHP和MS SQL将查询中的数据写入HTML表。我可以成功地将text,integer和float数据写入表中。但是,当我尝试格式化日期列时,整个过程似乎中断了。

    <?php           
echo "<table id='stakeholderTable' class='display nowrap'>
     <thead>
        <tr>";
            foreach ($array as $colmn) {
                echo '<th><strong>' . $colmn . '</strong></th>';
            }
        echo "</tr>
    </thead>";

    echo '<tbody>';
        $sel_result = sqlsrv_query($con,$query);
        while($sel_row = sqlsrv_fetch_array($sel_result)) {
            echo '<tr>';
                foreach ($array as $colmn) {
                    $colmn2 = str_replace("'", "", $colmn);
                    $joe = str_replace("tbl_actor.", "", $colmn2);
                    $joe = str_replace("tbl_commitment.", "", $joe);
                    if($joe == 'com_date' || $joe == 'com_due') {
                        echo '<td>' . $sel_row[$joe]->format('Y-m-d') . '</td>';
                    }else{
                        echo '<td>' . $sel_row[$joe] . '</td>';
                    }
                }
            echo '</tr>';
        }
    echo '</tbody>'; 
echo '</table>';
?>

上面的代码只要值不是日期(com_date或com_due)即可​​工作。如果值为日期,则表的第一行将以正确的格式打印,但随后的行将不打印,并且页面的Javascript停止工作。

问题似乎出在线路上

echo '<td>' . $sel_row[$joe]->format('Y-m-d') . '</td>';

但是我不知道这是怎么回事。

任何帮助将不胜感激

干杯

3 个答案:

答案 0 :(得分:1)

日期可能已经是php中的字符串对象,因此您必须创建日期对象,然后格式化它们。附言:我本来会留此作为评论,但我没有足够的声誉。

答案 1 :(得分:0)

好的。弄清楚了。我正在对空单元格调用方法。在运行代码之前,我不得不检查空值。

更改:

foreach ($array as $colmn) {
    $colmn2 = str_replace("'", "", $colmn);
    $joe = str_replace("tbl_actor.", "", $colmn2);
    $joe = str_replace("tbl_commitment.", "", $joe);
    if($joe == 'com_date' || $joe == 'com_due') {
        echo '<td>' . $sel_row[$joe]->format('Y-m-d') . '</td>';
    }else{
        echo '<td>' . $sel_row[$joe] . '</td>';
    }
}

收件人:

foreach ($array as $colmn) {
    $colmn2 = str_replace("'", "", $colmn);
    $joe = str_replace("tbl_actor.", "", $colmn2);
    $joe = str_replace("tbl_commitment.", "", $joe);
    if($joe == 'com_date' || $joe == 'com_due') {
        if(!empty($sel_row[$joe])){
            echo '<td>' . $sel_row[$joe]->format('Y-m-d') . '</td>';
        }else{
            echo '<td>' . $sel_row[$joe] . '</td>';
        }
    }else{
        echo '<td>' . $sel_row[$joe] . '</td>';
    }
}

答案 2 :(得分:0)

我认为这对您有用。当您将PHP驱动程序用于SQL Server(而非PDO版本)时,可以通过在字符串中指定ReturnDatesAsStrings选项,将retrieve date and time types(日期时间,日期,时间,日期时间2和日期时间偏移)作为字符串或PHP日期时间对象。连接字符串:

<?php 
...
$server = 'server\instance,port';
$cinfo = array(
    "ReturnDatesAsStrings"=>false,
    # Set to TRUE if you want to get date values as string.
    #"ReturnDatesAsStrings"=>true,
    "Database"=>'database',
    "UID"=>"username",
    "PWD"=>"password"
);
$conn = sqlsrv_connect($server, $cinfo);
...
?>

默认情况下,ReturnDatesAsStringsfalse,因此您需要格式化日期时间对象并检查null的值。

<?php
...
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo is_null($row['DateField']) ? '' : date_format($row['DateField'] , 'Y-m-d');
}
...

?>

如果将ReturnDatesAsStrings设置为true,则不需要进行此检查,但是如果要以特定格式打印此值,则需要先将文本转换为日期。

<?php
...
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['DateField']);
    # Use this if you want to use specific date/time format.
    #echo empty($row['DateField']) ? '' : date_format(date_create($row['DateField']), 'Y-m-d');
}
...
?>