2015-02-06 47 views
0

我目前正在將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的安裝是否正確,可用於連接到數據庫和查詢數據。

我已經嘗試使用bindParambindValue兩者都給出了相同的結果。

我試着運行聲明,並且沒有按位或用PDO::PARAM_INPUT_OUTPUT

最後,我檢查了一下,確保記錄集中沒有NULL應該返回以確保NULL值不可能是原因。

+0

您應該可以與freetds人交談並報告軟件中的錯誤。 – 2015-02-06 16:53:30

回答

1

因此,事實證明這是FreeTDS ODBC驅動程序中的某種錯誤。我切換到使用dblib驅動程序,我的所有查詢都正常工作,沒有分段錯誤。

0

有一個類似的問題,我通過PDO和DBLIB運行的查詢返回一個錢類型值。 我不得不使用的DBLIB版本在apache和google中導致了分段錯誤,導致我這樣做。

簡單地將錢類型值轉換爲小數意味着我可以解決這個問題,同時仍然保持小數精度。