Ошибка сегментации PHP PDO при нулевом возвращаемом значении

В настоящее время я использую freetds для подключения к серверу MSSql, где я загружаю много учетных данных. Данные загружаются нормально, пока не достигают нулевого значения. В этот момент я не получаю никаких ошибок PHP. Вместо этого я получаю следующую ошибку в журнале ошибок apache.

[уведомление] дочерний pid 10235 выходной сигнал Ошибка сегментации (11)

Я немного поискал и нашел эту страницу, но это не особо помогает . Запрос, который я использую, выглядит примерно так:

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, он будет работать нормально и правильно покажет нулевые значения.


person Metropolis    schedule 22.11.2010    source источник


Ответы (2)


С ошибками сегментации не очень весело иметь дело. Лучший ответ, который я могу вам дать, — постоянно размещать die('okay'); вызовы в разных местах, чтобы увидеть, как далеко вы продвинулись в разных блоках кодирования, прежде чем столкнетесь с ошибкой seg. (Вы ничего не увидите, если была ошибка seg).

Также стоит попробовать просто обновить все до последних версий: PHP, PDO и т.д.

person philfreo    schedule 22.11.2010

Одно из решений этой проблемы работает путем добавления операторов if null ко всем возвращаемым столбцам, например:

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

Если сейчас найдены нули, они возвращаются как нули без ошибок. Это не самое красивое, но оно работает.

person Metropolis    schedule 30.11.2010