sql server — ошибка сегментации при выполнении 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 ценности не могут быть причиной.

0

Решение

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

1

Другие решения

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

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

0

По вопросам рекламы [email protected]