代码之家  ›  专栏  ›  技术社区  ›  Metropolis

返回值为空时出现PHP PDO分段错误

  •  1
  • Metropolis  · 技术社区  · 14 年前

    目前,我正在使用freetds连接到MSSql服务器,在那里我正在拉入大量的会计数据。数据在到达一个空值之前一直处于良好的拉入状态。在这一点上,我没有收到任何PHP错误。相反,我在apache错误日志中得到以下错误。

    儿童PID 10235退出信号分割故障(11)

    我做了一些搜索,发现 this page ,但这并没有真正的帮助。我正在使用的查询如下所示,

    SELECT DISTINCT(t1.PEREND), t2.ERATE, t2.EEXTEND, t2.EARNDED, t1.ENTRYSEQ
           FROM UPCHKD as t1 LEFT JOIN
                (SELECT EARNDED, PEREND, ERATE, EEXTEND, ENTRYSEQ FROM UPCHKD
                        WHERE (EARNDED LIKE '401K%'AND EARNDED NOT LIKE '401KL%') AND
                              EMPLOYEE = ? AND PEREND >= ? AND PEREND <= ?) as t2 ON t1.PEREND = t2.PEREND
           WHERE t1.PEREND >= ? AND t1.PEREND <= ? AND t1.EMPLOYEE = ? ORDER BY PEREND
    

    我使用while循环获取数据,如下所示,

    while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
        //Deal with data here
    }
    

    我不知道这是PDO、我的数据库层、MSSQL还是我的查询的问题。另外,我想指出的是,如果我接受查询并使用MSSQL studio手动运行它,它运行良好,并正确显示空值。

    2 回复  |  直到 14 年前
        1
  •  1
  •   philfreo    14 年前

    分割错误处理起来并不有趣。我能给你最好的回答就是 die('okay'); 在不同的地方打电话,看看在你遇到seg故障之前,你在不同的编码块里走了多远。(如果出现seg故障,您将看不到任何信息)。

    同样值得尝试的是将所有内容升级到最新版本:PHP、PDO等。

        2
  •  0
  •   Metropolis    14 年前

    解决这个问题的一个方法是在所有返回列中添加if null语句,如下所示,

    ISNULL(t2.ERATE, 0) as ERATE, ISNULL(t2.EEXTEND, 0) as EEXTEND, ISNULL(t2.EARNDED, '') as EARNDED
    

    如果现在找到了空值,它们将作为零返回,不会出错。它不是最漂亮的,但很管用。