2016-01-21 51 views
2

我正在使用此代碼從excel中的sql server查詢下載結果。 連接&查詢工作正常,我已經正確安裝sqlsrv擴展。 不過還是我收到錯誤,如這些PHP-與SQLSRV_FETCH_ASSOC&sqlsrv_fetch_array錯誤

「未定義的常量SQLSRV_FETCH_ASSOC的使用 - 假設 SQLSRV_FETCH_ASSOC'」
警告:sqlsrv_fetch_array()預計參數2要長」

我認爲問題在於SQLSRV_FETCH_ASSOC。 任何幫助,將不勝感激。

function cleanData(&$str) 
    { 
    $str = preg_replace("/\t/", "\\t", $str); 
    $str = preg_replace("/\r?\n/", "\\n", $str); 
    if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; 
    } 

    $serverName = "********"; 
$connectionInfo = array("Database"=>"****", "UID"=>"***", "PWD"=>"*****"); 
$connect = sqlsrv_connect($serverName, $connectionInfo); 

    // filename for download 
    $filename = "website_data_" . date('Ymd') . ".xls"; 

    header("Content-Disposition: attachment; filename=\"$filename\""); 
    header("Content-Type: application/vnd.ms-excel"); 

    $flag = false; 
    $query="select * from business_partners ORDER BY 1 desc"; 

    $result = sqlsrv_query($connect, $query) or die('A error occured: ' . sqlsrv_errors()); 
    while(false !== ($row = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC))) 
    { 
    if(!$flag) { 
     // display field/column names as first row 
     echo implode("\t", array_keys($row)) . "\r\n"; 
     $flag = true; 
    }**strong text** 
    array_walk($row, 'cleanData'); 
    echo implode("\t", array_values($row)) . "\r\n"; 
    } 
    exit; 

回答

1

我沒有解釋爲什麼在明確加載擴展的時候不會定義常量,但是您應該能夠通過自己定義來繞過這個問題。

SQLSRV_FETCH_ASSOC has the value 2,所以你只要添加這個地方,最好在一個文件中,你總是包括:

if (!defined('SQLSRV_FETCH_ASSOC')) 
    define('SQLSRV_FETCH_ASSOC', 2); 

if (!defined())條款可以確保您的代碼不破以後,當實際的問題是固定的常數突然重新出現。

另外,如果你只在文件中使用它一次,它是不是真的值得定義常量(除了可讀性),你可以只使用實際值作爲參數:

$row = sqlsrv_fetch_array($result, 2); // 2 = SQLSRV_FETCH_ASSOC 
+0

我試過 while(false!==($ row = sqlsrv_fetch_array($ result,SQLSRV_FETCH_NUMERIC)))它的工作..但我不需要數值。 擴展我正在使用php_sqlsrv_55_ts.dll。 –

+0

你有沒有得到相同的'未定義的常量'的消息? –

+0

沒有。我不知道最新的SQLSRV_FETCH_ASSOC問題 –