2011-10-17 72 views
2

我想調用MS SQL存儲過程形式的php。從php執行MSSQL存儲過程

我已經在管理工作室中用硬編碼參數測試了存儲過程本身,並且能夠使其在預期結果下執行。

但是,當試圖從PHP調用它我得到這些錯誤。

警告:mssql_execute()[function.mssql-執行]:存儲過程的執行用C失敗:\ XAMPP \ htdocs中\的index.php上線145

致命錯誤:在超過60秒的最大執行時間在線146上的C:\ xampp \ htdocs \ index.php

在代碼中,我在發帖行145是mssql_execute命令。

任何幫助,將不勝感激。

$userQuery = "select top 1 id from bravo_biometric_batch order by id desc"; 
    $result = mssql_query($userQuery,$DB); 
    $bravo_biometric_batch_id = mssql_result($result,0,0); 

    $company_year_id = 237; 
    $date = date("Ymd"); 
    $server_file_name = "e:\\bravo_csv\\".$filename; 

    $csv_proc_name = mssql_init('bulk_insert_bravo_csv',$DB); 
    mssql_bind($csv_proc_name, '@data_csv_file',$server_file_name,SQLVARCHAR, false,false,200); 
    mssql_bind($csv_proc_name, '@bravo_biometric_batch_id',$bravo_biometric_batch_id, SQLINT2, false,false, 10); 
    mssql_bind($csv_proc_name, '@company_year_id',$company_year_id, SQLINT2, false,false,10); 
    mssql_bind($csv_proc_name, '@upload_date',$date, SQLVARCHAR, false,false,20); 

    mssql_execute($csv_proc_name); 
+0

在執行行後面回顯mssql_get_last_message()以查找有關您的錯誤的更多信息。回傳細節。 http://www.php.net/manual/en/function.mssql-get-last-message.php – Jrod 2011-10-17 13:08:35

+0

我添加了timout錯誤消息,並沒有收到任何新的錯誤信息。 – 2011-10-17 13:15:08

回答

2

錯誤是說您的存儲過程需要超過60秒才能運行。默認情況下,PHP在60秒內超時(這在php.ini中用mysql.connect_timeout設置爲秒)

您應該嘗試在SQL查詢分析器中手動運行該過程,並使用相同的值,看看需要多長時間。例如,如果該文件是C:在服務器上的\ TEMP \ csvfile.csv,批次ID 1234,2011年公司年和當前的時間日期,你會使用:

print 'Start time: ' + getdate() 
exec 'bulk_insert_bravo_csv' 'c:\\temp\\csvfile.csv', 1234, 2011, getdate() 
print 'End time: ' + getdate() 

注意當您在查詢分析器中運行SQL時,任何\字符必須以\轉義。

這將運行相同的命令,並打印前後的時間。然後你可以看到它需要多長時間。如果您不確定要使用的值,請將PHP頁面在mysql_execute()命令之前打印出來,然後將其插入到查詢分析器中。

當您知道需要多長時間時,您可以將過程的超時時間調整爲60秒以上。另一種方法是優化存儲過程(如果可能的話),或者如果可以的話,運行更小的CSV批處理。請注意,在增加60秒查詢超時後,您可能會遇到其他超時。例如,PHP本身將在PHP.ini中的max_execution_time中設置一個超時。 Apache的默認超時時間爲300(5分鐘)。因此,當你增加一次超時時間時,你可能會遇到另一個超時時間,並且必須增加這個時間。

解決此問題的另一種方法是在命令行模式下從shell腳本或批處理文件中運行PHP。這可以讓你在大部分時間內(至少是Apache,PHP)。

0

您實際上想要查找php.ini文件中的mssql.timeout值。或者如果它不在那裏設置它。 default is 60 (seconds)這就是你打的。