我正在尝试使用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()
只会尝试一次,因此无法收集任何数据。
有没有其他人对这里可能出现的问题有任何想法?
答案 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版。