Ошибка сегментации из-за выполнения PHP PDO FreeTDS ODBC

В настоящее время я переношу проект PHP с использования библиотеки PHP mssql на использование библиотеки PDO с FreeTDS. Я изменил все свои вызовы базы данных, но столкнулся с очень странной проблемой при выполнении подготовленных операторов в базе данных SQL Server.

Ниже приведен фрагмент кода, с которым у меня возникла проблема.

public static function gift_cards_exist($start_number, $end_number = null) {
    global $sol_donations;
    $db = $sol_donations->get_db();

    $store_id = get_option('pos-store-id', false);
    //$store_id = '01';  // Won't work if value assigned this way
    $payment_method = 'Gift';

    if (empty($end_number)) {
        $end_number = $start_number;
    }

    $query = '
        SELECT * FROM dbo.tblPmtSerialHdr
        WHERE SerialId BETWEEN ? AND ?
        AND   StoreId = ?';
        //AND   PmtMethodId = ?';

    $stmt = $db->prepare($query);
    $stmt->bindParam(1, $start_number, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    $stmt->bindParam(2, $end_number, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    $stmt->bindParam(3, $store_id, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    //$stmt->bindParam(4, $payment_method, \PDO::PARAM_STR | \PDO::PARAM_INPUT_OUTPUT);
    $result = $stmt->execute();

    $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    $stmt->closeCursor();

    /* Nothing printed from this
    echo $stmt->errorCode();
    echo '<br />';
    echo $stmt->errorInfo();
    */
    var_dump($result);
    exit();

    if ($result) {
        return true;
    }
    return false;
}

Вот где проблема существует. Запуск кода в этой форме (со всеми закомментированными строками, оставшимися закомментированными) приводит к правильному выполнению запроса с ожидаемыми, хотя и неправильными для моей программы, результатами.

Однако если я изменю запрос, чтобы использовать второй оператор AND, и раскомментирую последний оператор bindParam для использования с оператором, сценарий завершится ошибкой, что приведет к ошибке сегментации. Фактическое сообщение об ошибке, которое я получаю в журнале ошибок apache:

[Fri Feb 06 10:43:05.406772 2015] [core:notice] [pid 1415] AH00051: child pid 1541 exit signal Segmentation fault (11), possible coredump in /etc/apache2

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

Немного дополнительной информации о ситуации:

FreeTDS установлен правильно и может использоваться для подключения к базе данных и запроса данных.

Я пробовал использовать как bindParam, так и bindValue, и оба дают одинаковые результаты.

Я пробовал запускать оператор с побитовым и без побитового или с PDO::PARAM_INPUT_OUTPUT.

Наконец, я проверил, чтобы убедиться, что в наборе записей нет NULL, которые должны быть возвращены, чтобы убедиться, что значения NULL не могут быть причиной.


person BLenau    schedule 06.02.2015    source источник
comment
вам, вероятно, следует поговорить с людьми из freetds и сообщить об ошибке в их программном обеспечении.   -  person Marc B    schedule 06.02.2015


Ответы (2)


Итак, получается, что это какая-то ошибка в ODBC-драйвере FreeTDS. Я переключился на использование драйвера dblib, и все мои запросы работали правильно, без ошибок сегментации.

person BLenau    schedule 06.02.2015

Была аналогичная проблема, когда запрос, который я выполнял через PDO и DBLIB, возвращал значение денежного типа. Версия DBLIB, которую мне приходится использовать, вызвала ошибки сегментации в apache и google, что привело меня к этому SO.

Простое приведение значения денежного типа к десятичному виду означало, что я мог обойти это, сохраняя при этом десятичную точность.

person rStyles    schedule 20.10.2016