PHP 5.4 到 7.4 mssql 到 sqlsrv sql 查询未运行

问题描述

一点前言 我是一年级的系统管理员,我一直在迁移服务器以使这家公司保持最新状态。我遇到了一个运行 PHP 5.4 的服务器,我正试图将它移动到 PHP 7.4。一切最初都是用 mssql 编写的,我将其移至 sqlsrv。我有连接工作。我可以成功执行一些查询,但是我无法让为 mssql 编写的这些查询sqlsrv 一起使用。

我知道的事情:

  • $record 以数组形式返回,我使用 gettype 对其进行了测试。
  • $conn 之所以有效,是因为我可以通过简单的查询数据库查询表

sql 查询sql server 中正确运行。

任何建议将不胜感激,因为我感觉我需要重写整个脚本,因为我已经为此苦苦挣扎了几天。下面的代码片段只是内置于 if else 链中的众多查询之一。

PHP 5.4编写的原始代码

$query = "Select * INTO #temptable FROM (
    SELECT Employee,transdate,sum([RegHrs]) as RegHrs,sum([OvtHrs]) as OvtHrs
    
    FROM [dbo].[tkDetail]
    WHERE TransDate >= cast('" . $startdate . "' as datetime) and TransDate <= cast('" . $enddate . "' as datetime)
    GROUP BY Employee,transdate) as x

    SELECT LastName,FirstName,emmain.Employee,emcom.PayType,cast(data.TransDate as date) as TransDate,data.reghrs,data.ovthrs
    from dbo.emmain emmain
    Left Join #temptable data on emmain.employee = data.employee
    Left Join dbo.EMCompany emcom on emmain.employee = emcom.employee
    Left Join dbo.EmployeeCustomTabFields custom on emmain.employee = custom.employee
    WHERE custom.custFullTimePartTime = 'Full Time' and emcom.status = 'A'
    ";
    $result = mssql_query($query);
    while ( $record = mssql_fetch_array($result) ) {
        // BUGFIX: Salary reporting shows no regular hour entry as null instead of 0.0
        if ($record['reghrs'] == null) {
            $record['reghrs'] = "0.0";
        }
        
        // BUGFIX: Salary reporting shows no overtime hour entry as null instead of 0.0
        if ($record['ovthrs'] == null) {
            $record['ovthrs'] = "0.0";
        }
        
        if (($record['reghrs'] + $record['ovthrs'] <= 4) && ($record['reghrs'] + $record['ovthrs'] > -1)) {
            print "\t\t\t\t\t<tr>\n";
            print "\t\t\t\t\t\t<td>" . $record['Employee'] . "</td>\n";
            print "\t\t\t\t\t\t<td>" . $record['FirstName'] . " " . $record['LastName'] . "</td>\n";
            print "\t\t\t\t\t\t<td>" . $record['PayType'] . "</td>\n";
            print "\t\t\t\t\t\t<td>" . number_format((float) $record['reghrs'],3) . "</td>\n";
            print "\t\t\t\t\t\t<td>" . number_format((float) $record['ovthrs'],3) . "</td>\n";
            print "\t\t\t\t\t\t<td>" . $record['TransDate'] . "</td>\n";
            print "\t\t\t\t\t</tr>\n";
            $reccount += 1;
        }
    }

我尝试做的事情:

$query = "Select * INTO #temptable FROM (
    SELECT Employee,data.ovthrs
    from dbo.emmain emmain
    Left Join #temptable data on emmain.employee = data.employee
    Left Join dbo.EMCompany emcom on emmain.employee = emcom.employee
    Left Join dbo.EmployeeCustomTabFields custom on emmain.employee = custom.employee
    WHERE custom.custFullTimePartTime = 'Full Time' and emcom.status = 'A'
    ";

    $result = sqlsrv_query($conn,$query);
    if( $result ) {
        echo "result true";
    }else{
        echo "result false <br />";
        die( print_r( sqlsrv_errors(),true));
    }    
    while ($record = sqlsrv_fetch_array($result)) 
        {
            
        // BUGFIX: Salary reporting shows no regular hour entry as null instead of 0.0
        if ($record["reghrs"] == null) {
            $record["reghrs"] = "0.0";
        }
        
        
        // BUGFIX: Salary reporting shows no overtime hour entry as null instead of 0.0
        if ($record['ovthrs'] == null) {
            $record['ovthrs'] = "0.0";
        }
        
        if (($record['reghrs'] + $record['ovthrs'] <= 4) && ($record['reghrs'] + $record['ovthrs'] > -1)) {
            print "\t\t\t\t\t<tr>\n";
            print "\t\t\t\t\t\t<td>" . $record['Employee'] . "</td>\n";
            print "\t\t\t\t\t\t<td>" . $record['FirstName'] . " " . $record['LastName'] . "</td>\n";
            print "\t\t\t\t\t\t<td>" . $record['PayType'] . "</td>\n";
            print "\t\t\t\t\t\t<td>" . number_format((float) $record['reghrs'],3) . "</td>\n";
            print "\t\t\t\t\t\t<td>" . $record['TransDate'] . "</td>\n";
            print "\t\t\t\t\t</tr>\n";
            $reccount += 1;
        }
    }


解决方法

我已开始使用 PDO,但我的一台服务器仍在使用 sqlsrv 函数。当我从 mssql 函数转换时,我遇到了和你一样的麻烦。

您可以使用 sqlsrv_next_result 函数移动指针(如上面的提示所述),或者您可以简单地提供一个附加参数来强制将结果作为关联数组返回。我发现标准的 while 循环的工作方式与旧函数一样,当它以这种方式完成时。

代替:

while ($record = sqlsrv_fetch_array($result))

使用:

while ($record = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC))