为什么sqlsrv_fetch_array()返回null?

时间:2013-10-07 14:27:55

标签: php sql-server null sqlsrv

我正在尝试使用PHP对SQL数据库进行非常简单的查询,但无论我做什么,似乎都无法获得任何正确的结果。以下是我写的代码:

$loDate = '2013-10-01';
$hiDate = '2015-01-01';
$queryStr = "select TimeCol from dbo.SUBPUMP where TimeCol between " . $loDate . " and " . $hiDate;
$conn = sqlsrv_connect($serverName, $conInfo);
$result = sqlsrv_query($conn, $queryStr);

while ($row = sqlsrv_fetch_array($result)) {
    // This never prints.
    echo "row:<br>"; var_dump($row); echo "<br><br>";
}

echo "<br><br><br>";

// Prints "conInfo: resource(2) of type (SQL Server Connection)"
echo "conn: "; var_dump($conn); echo "<br><br>";

// Prints "result: resource(3) of type (SQL Server Statement)"
echo "result: "; var_dump($result); echo "<br><br>";

// Prints "row: NULL"
echo "row: "; var_dump($row); echo "<br><br>";

我感到困惑的是如何建立与数据库的正确连接。

由于$conn$result不会打印任何错误,但似乎并没有真正为我提取任何数据。

到目前为止,我最好的猜测是,因为我试图通过VPN从数据库中获取数据,因此可能只有一个微弱的连接,sqlsrv_connect()将尝试多次尝试连接到数据库,直到它收到一个良好的连接。虽然sqlsrv_query()只会尝试一次,因此无法收集任何数据。

有没有其他人对这里可能出现的问题有任何想法?

5 个答案:

答案 0 :(得分:1)

sqlsrv_fetch_array的{​​{3}}声明:

  

成功时返回一个数组,如果没有更多行要返回则返回NULL,如果发生错误则返回FALSE。

NULL结果只能表示您的查询中有 0结果。所以while ($row = sqlsrv_fetch_array($result))永远不会循环。

您可以使用sqlsrv_has_rows()进行条件检查来处理此问题。如果行数超过0,则返回布尔值true

例如:

if (sqlsrv_has_rows($result)) {
  while ($row = sqlsrv_fetch_array($result)) {
    echo "row:<br>"; var_dump($row); echo "<br><br>";
  }
} else {
  echo "<br/>No Results were found."; 
}

答案 1 :(得分:0)

即使你的结果等于null,$ result也会返回

// Prints "result: resource(.) of type (SQL Server Statement)"
echo "result: "; var_dump($result); echo "<br><br>";

由于您的日期格式,您的查询可能会返回null。您是否尝试过没有日期的查询

  

$ queryStr =“从dbo.SUBPUMP中选择TimeCol”;

答案 2 :(得分:0)

由于您指的是日期列,请尝试在连接选项(http://msdn.microsoft.com/en-us/library/ff628167.aspx)中设置“ReturnDatesAsStrings”选项。

示例连接: -

$connection['UID'] = $username;
$connection['PWD'] = $password;
$connection['Database'] = $database_name;
$connection['ReturnDatesAsStrings'] = true;
$connection['ConnectionPooling'] = false;
$connection['CharacterSet'] = 'UTF-8';

if (!empty($port)) {
  $hostname = $hostname.', '.$port;
}

$conn = sqlsrv_connect($hostname, $connection);

还尝试在sql_query函数(http://msdn.microsoft.com/en-us/library/hh487160.aspx)中将游标类型设置为“SQLSRV_CURSOR_STATIC”

示例查询:

$result_id = sqlsrv_query($conn, $queryStr, null, array(
                'Scrollable' => SQLSRV_CURSOR_STATIC,
                'SendStreamParamsAtExec'=> true
            ));


while($row = sqlsrv_fetch_object($result_id)) {

}

答案 3 :(得分:0)

我有点惊讶这已经过了这么久没有回答。这里的问题很简单:日期周围没有单引号。

$loDate = '2013-10-01';
$hiDate = '2015-01-01';
$queryStr = "select TimeCol from dbo.SUBPUMP where TimeCol between '" . $loDate . "' and '" . $hiDate . "'";

SQL Server要求引用日期字符串以将其解释为日期。

此外,可能值得注意的是,您应该使用准备好的声明。这样更安全,并且不要求您引用字符串。

答案 4 :(得分:0)

我知道这是一个古老的答案,但是今天我遇到了同样的问题。

结果是我正在使用旧版本的PHP。更新到较新的版本为我解决了这个问题。 就我而言,它是从5.6版升级到7.2版。