我目前正在將PHP項目從使用PHP的mssql
庫遷移到使用帶有FreeTDS的PDO
庫。我修改了所有的數據庫調用,但在SQL Server數據庫上執行預準備語句時遇到了一個非常奇怪的問題。PHP PDO的分段錯誤FreeTDS ODBC執行
下面是我遇到問題的代碼片段。
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
值不可能是原因。
您應該可以與freetds人交談並報告軟件中的錯誤。 – 2015-02-06 16:53:30