【问题标题】:PDO PHP select distinct query not working for mssqlPDO PHP选择不同的查询不适用于mssql
【发布时间】:2016-11-25 07:46:27
【问题描述】:

我有一个网站正在从我的 MSSQL Server 中提取数据。我正在使用函数来构建报告表格。这是我得到的:

function BeginTable($rowCount,$headings,$searchValue,$ReportName,$OneButton,$NewSearch)
{
    try{
    $StateSelectSQL = "select distinct State from pmdb.MaterialTracking where State is not null";
    var_dump($StateSelectSQL);echo " What!<br>";

    $getSelect = $conn->query($StateSelectSQL);
    var_dump($getSelect);echo " When!<br>";

    $StateSelectNames = $getSelect->fetchALL(PDO::FETCH_ASSOC);
    var_dump($StateSelectNames);echo " Where!<br>";
    }
    catch(Exception $e)
    {
        echo "Something went wrong";
        die(print_r($e->getMessage()));
    }

我也试过这个:

    try{
        $StateSelectSQL = "select distinct State from pmdb.MaterialTracking where State is not null";
        var_dump($StateSelectSQL);echo " What!<br>";

         $getSelect = $conn->prepare($StateSelectSQL);
         $getSelect->execute();

        //$getSelect = $conn->query($StateSelectSQL);
        //var_dump($getSelect);echo " When!<br>";

        $StateSelectNames = $getSelect->fetchALL(PDO::FETCH_ASSOC);
        var_dump($StateSelectNames);echo " Where!<br>";
    }
    catch(Exception $e)
    {
        echo "Something went wrong<br>";
        die( print_r( $e->getMessage()));
    }

第二个和第三个var_dump 从未显示任何内容,其余代码(此处未显示)不会运行。如果我注释掉 $getSelect$StateSelectNames 行(下面有 var_dump),那么其他一切都正常。

这是我的 DBConn.php 文件,它位于 included 上方 Function

    $conn = new PDO("sqlsrv:server=$servername;database=$dbname", $username,$password);
    //set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->setAttribute(PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 10);

$getSelect = $conn-&gt;query($StateSelectSQL); 行有什么问题我想不通。我稍后在我的foreach 中尝试使用它,如下所示:

foreach($conn->query($StateSelectSQL) as $StateName)

但这也不起作用。它再次停在这条线上,不再往前走。我唯一能想到的就是我的 SQL 搞砸了,但是当我在 SSMS 中运行它时它运行良好!

发生了什么事?

【问题讨论】:

    标签: php sql-server pdo


    【解决方案1】:

    在使用 fetchAll 之前尝试准备和执行 SQL。如果您还没有启用异常模式,请考虑启用异常模式并将语句包装在 try catch 中 - 这应该会标记任何问题(例如,您的应用程序数据库用户无权访问架构或语法错误等)

    例外:

    See this stack overflow post for info about how to enable

    对于您的代码:

    try { 
        $sql = "
        SELECT DISTINCT State
          FROM pmdb.MaterialTracking
         WHERE State IS NOT NULL
        ";
    
        $sth = $conn->prepare($sql);
        $sth->execute();
    
        $rowset = $sth->fetchAll(PDO::FETCH_ASSOC);
        print_r($rowset);
    
    } catch PDOException($err) {
        echo "Something went wrong".
        echo $err;
    }
    

    【讨论】:

    • 我在它周围添加了try catch(见上文),但仍然只能到达第一个var_dump,之后什么也没有!它不会引发错误。
    【解决方案2】:

    我拉了一整天头发后才知道!我必须在function 中使用include 我的DBConn.php。在此之后它起作用了。我不知道为什么这很重要,因为文件开头是included。如果有人能解释为什么会这样,我将不胜感激!

    现在看起来像这样:

    function BeginTable($rowCount,$headings,$searchValue,$ReportName,$OneButton,$NewSearch)
    {
        try{
            include("DBConn.php");
            $SelectSQL = "select distinct State from pmdb.MaterialTracking where State is not null order by State";            
    
            $getSelect = $conn->prepare($SelectSQL);
    
            $getSelect->execute();
    
            $StateSelectNames = $getSelect->fetchALL(PDO::FETCH_ASSOC);
    
            }
            catch(Exception $e)
            {
                echo "Something went wrong<br>";
                die( print_r( $e->getMessage()));
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 2015-12-19
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多