我们有一个网站可以访问SQL Server 2005服务器进行一次查询。目前,该站点在ASP中,我们正在将其转移到PHP,而PHP正在进行测试。在PHP站点上运行几个成功的查询后,它会返回“数据库查询中的错误。请稍后再试”下面的代码中的行。当我用sqlsrv_errors重写该行时,它告诉我该表不存在。数据库中大约有40个表,但在发生错误后,它只在Management Studio中显示其中的8个。但是,如果我允许它静置大约5分钟,则会恢复所有表格。无论旧ASP站点使用了多少次,表都不会这样做。但是,当表格从使用新站点消失时,旧站点显示几分钟无法访问,直到表格重新出现在SQL Server管理工作室中。我没有在SQL Server上看到任何类型的连接限制,因此我不知道这是我在PHP SQL查询中还是在SQL Server属性中所做的事情。
<?php
include ("dbvals.inc.php");
if (!empty($_POST['lastnamebox'])) {
$dbhandle = sqlsrv_connect($dbServer, $connectioninfo);
if($dbhandle == false){
echo "Error connecting to database. Please try again later. ";
}
else{
$query = "SELECT * FROM Person WHERE LastName LIKE '%' + ? +
'%' AND InactiveFlag = 'N' ORDER BY LastName, FirstName";
$params = array();
array_push ($params, $_POST['lastnamebox']);
$results = sqlsrv_query($dbhandle, $query, $params);
if($results == false){
echo "Error in database query. Please try again later.";
//This is printed when database tables temporarily disappear
}
else
{
$row = sqlsrv_fetch_array( $results, SQLSRV_FETCH_ASSOC);
if($row){
do{
echo "<tr><td class='tablecell'>";
echo $row['LastName'] . "," . $row['FirstName'] . "<br>";
echo "Address: " . $row['Address'] . "<br>";
echo "City, State, Zip: " . $row['CSZ'] . "<br>";
echo "</tr></td'>";
}while($row = sqlsrv_fetch_array( $results, SQLSRV_FETCH_ASSOC));
}
else{
echo "No results found. Please try another query.";
}
}
}
sqlsrv_free_stmt($results);
sqlsrv_close($dbhandle);
}
else {
echo "Please type a value in the search box.";
}
?>
答案 0 :(得分:1)
$ query开头是错误的。将其更改为:
$query = "SELECT * FROM Person WHERE LastName LIKE '%' + ? +
'%' AND InactiveFlag = 'N' ORDER BY LastName, FirstName";
不确定表格会消失。你在用什么司机?
答案 1 :(得分:1)
我在代码中看到的另一个问题是,它不确定它是否与您的问题有关。或另一个复制错误,但在这里。
if ($r1 = sqlsrv_fetch_array($results)) {
while( $row = sqlsrv_fetch_array( $results, SQLSRV_FETCH_ASSOC)){
第一次提取也应该有&#39;($ results ,, SQLSRV_FETCH_ASSOC)&#39;
另外,该检查将吃掉第一个返回的记录,这可能是也可能不是你想要的记录。
此外,PHP可能会将while中的某些结果视为false,即使它们不是,并且服务器仍在等待您完成剩下的工作。看到这样的代码导致服务器已经离开&#39; MySQL中的错误也可能是这里发生的错误。
不确定语法,但是在连接关闭之前的sqlsrv_clode_cursor()也可以修复您的问题,如果进行某种连接轮询。可能只是因为连接不正常或者旧的状态不正确。
答案 2 :(得分:0)
SELECT * FROM Person WHERE AND LastName LIKE
看起来WHERE和AND之间缺少一些东西。
我真的不知道SQL Server,所以它可以允许,但它不是标准的SQL。根据它对该错误的反应,我可以看到它“离开”,所以说并丢失报告表。