PHP Query导致SQL Server表消失并重新出现

时间:2014-06-06 14:38:26

标签: php sql sql-server

我们有一个网站可以访问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.";
}
?>

3 个答案:

答案 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。根据它对该错误的反应,我可以看到它“离开”,所以说并丢失报告表。