1

我正在尝试使用 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()只会尝试一次,因此无法收集任何数据。

还有其他人对这里可能出了什么问题有任何想法吗?

4

5 回答 5

2

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

示例连接:-

$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 函数中将游标类型设置为“SQLSRV_CURSOR_STATIC”(http://msdn.microsoft.com/en-us/library/hh487160.aspx

示例查询:-

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


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

}
于 2013-10-07T17:10:36.650 回答
2

文档forsqlsrv_fetch_array指出:

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

因此,NULL结果只能意味着您的查询有0 个结果。所以 while ($row = sqlsrv_fetch_array($result))永远不会循环。

您可以使用sqlsrv_has_rows(). true如果行数超过 0,则返回布尔值。

例如:

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."; 
}
于 2013-10-07T14:36:19.077 回答
0

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

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

由于您的日期格式,您的查询可能返回 null。你试过这个没有日期的查询吗

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

于 2013-10-07T14:49:17.033 回答
0

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

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

于 2019-02-06T04:13:24.717 回答
0

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

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

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

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

于 2016-07-21T19:08:41.703 回答