2016-11-07 98 views
10

下面是輸出的phpinfo:version.php如何使用PHP7連接到SQL Server? (我是什麼失蹤?)

下面的代碼:

$serverName = "X.X.X.X"; 
$connection = array("UID"=>"UserID", "PWD"=>"Password123", "Database"=>"database_name"); 
$conn = sqlsrv_connect($serverName, $connection); 

if ($conn === false) { 
    $myfile3 = fopen("log.txt", "w"); 
    fwrite($myfile3, sqlsrv_errors()); 
    fclose($myfile3); 

}; 

$tsql = "SELECT top 10 pName from products"; 
$stmt = sqlsrv_query($conn, $tsql); 
$row = sqlsrv_fetch_array($stmt); 

$myfile4 = fopen("log.txt", "w"); 
fwrite($myfile4, $row[0]); 
fclose($myfile4); 
sqlsrv_free_stmt($stmt); 
sqlsrv_close($conn); 

沒有被寫入日誌文件。即使我在fwrite中硬編碼文本($ myfile3,「hard coded text」);地方,沒有什麼是寫出來的。

這裏的php.ini文件中

[ExtensionList] 
;extension=php_mysql.dll 
extension=php_mysqli.dll 
extension=php_mbstring.dll 
extension=php_gd2.dll 
extension=php_gettext.dll 
extension=php_curl.dll 
extension=php_exif.dll 
extension=php_xmlrpc.dll 
extension=php_openssl.dll 
extension=php_soap.dll 
extension=php_pdo_mysql.dll 
extension=php_pdo_sqlite.dll 
extension=php_imap.dll 
extension=php_tidy.dll 
extension=php_sqlsrv_7_nts_x64.dll 
;extension=php_sqlsrv_7_ts_x64.dll 

最後,我知道我並不需要所有的這些擴展部分,但這些都是4名的dll我在ext文件夾。

php_sqlsrv_7_nts_x64.dll 
php_sqlsrv_7_nts_x86.dll 
php_sqlsrv_7_ts_x64.dll 
php_sqlsrv_7_ts_x86.dll 
+0

您是否嘗試過使用'$ serverName =「serverName \ sqlexpress」; // serverName \ instanceName'?沒有文件寫入,我的意思是把死像'die(print_r(sqlsrv_errors(),true));'? –

+0

還要確保SQL服務器在默認端口(1433)上運行,否則除了IP地址外還必須指定它。 –

+0

什麼是錯誤/警告?如果沒有,請確保在.ini文件中打開它們。嘗試將所有內容全部封裝在「try/catch」中以獲取異常。當然,檢查SQL語句是否返回任何內容。 – Parfait

回答

5

使用PDO:

$serverName = "(local)\sqlexpress"; 

/* Connect using Windows Authentication. */ 
try 
{ 
    $conn = new PDO("sqlsrv:server=$serverName ; Database=AdventureWorks", "", ""); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(Exception $e) 
{ 
    die(print_r($e->getMessage())); 
} 

程序的方式:

$serverName = "(local)\sqlexpress"; 
$connectionOptions = array("Database"=>"AdventureWorks"); 

/* Connect using Windows Authentication. */ 
$conn = sqlsrv_connect($serverName, $connectionOptions); 
if($conn === false) 
die(sqlsrv_errors()); 

點擊here獲取更多信息

+0

OP不包含任何指示使用PDO的內容......此外'FormatErrors'似乎是一個自定義函數(從http://stackoverflow.com/questions/28468160/connecting-to-an-sql-server -database-with-php),如果使用的話會導致一個未定義的函數錯誤。也沒有解決與文件寫入問題有關的任何事情。 – Leith

2

首先,你需要隔離您的問題 - 這是什麼問題您的文件寫入或一些錯誤連接到SQL Server,或者出錯了PHP的設置?

故障排除的SQL Server

你可能想要儘可能詳細地調用sqlsrv_errors()時使用的SQLSRV_ERR_ALL標誌,並使用die()或者乾脆print_r/echo結果到屏幕上(而不是寫一個文件),以便您可以查看是否有問題 - 查看sqlsrv_connect文檔頁面上的示例。

接下來我會盡量確保你正確指定端口,如:

$serverName = 'X.X.X.X, 1433';

或指定SQL Server實例,例如:

$serverName = 'X.X.X.X\sqlexpress';

而且確保您的用戶,密碼和數據庫名稱都是正確的,並且您指定的用戶在該數據庫上具有正確的權限。當然,它在1433端口上運行(或者將上面的內容更改爲您運行的任何端口)。

在那之後,我會考慮將這些特性之前sqlsrv_connect()通話儘可能提升到回來疑難解答連接錯誤:

sqlsrv_configure('WarningsReturnAsErrors', true); 
sqlsrv_configure('LogSubsystems', SQLSRV_LOG_SYSTEM_ALL); 
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL); 

看看是否能變成任何東西更實用從SQL服務器直接。

故障排除的文件寫入

  • 你需要看看你的fopen - 你可以使用a模式而不是w,以確保該文件不被截斷當你打開它
  • 如果文件打開失敗,您還應該檢查返回的$myfile3是否爲false,根據the documentation
    • 如果是這樣,那麼您在嘗試創建文件的目錄中可能存在權限問題。如果文件已經提前爲您創建(無需擔心創建它),那麼您也可能沒有該文件的寫入權限。如果打開失敗,它應該生成一個E_WARNING(應顯示在頁面上,因爲您的error_reporting配置設置爲E_ALL,但您也可以檢查PHP錯誤日誌文件)。您還可以使用file_existsis_readable()來幫助檢查權限。
    • 當你說寫入值的硬編碼沒有寫入時,這讓我認爲這是實際的問題。
  • 我也考慮使用不同的日誌文件的各個部分(在這兩種情況下不log.txt

排除你的PHP

看一看在Microsoft documentation,以確保您的DLL與您的Windows版本中使用的正確的PHP7 dll相匹配,儘管它沒有指定驅動程序v4.0的操作系統要求:他們可能不支持Windows Server 2008,儘管我很害怕d很驚訝。他們也沒有顯示他們支持連接到哪個版本的SQL服務器,所以如果你使用的是老版本的SQL服務器,那也可能是一個問題。

1

作爲替代方案,您可以嘗試安裝PDO_SQLSRV驅動程序。這是使用Windows身份驗證連接到SQL-Server的示例。

$serverName = "(local)\sqlexpress";  

/* Connect using Windows Authentication. */ 
try 
{ 
$conn = new PDO("sqlsrv:server=$serverName ; Database=database_name", "", ""); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(Exception $e) 
{ 
die(print_r($e->getMessage())); 
} 

欲瞭解更多信息,看看

1

從文檔,這將給你更多的信息:http://php.net/manual/en/function.sqlsrv-connect.php

$connectionInfo = array("Database"=>"dbName"); 
$conn = sqlsrv_connect($serverName, $connectionInfo); 

if($conn) { 
    echo "Connection established.<br />"; 
}else{ 
    echo "Connection could not be established.<br />"; 
    die(print_r(sqlsrv_errors(), true)); 
} 

如果沒有按給你一個錯誤你可能因爲權限而無法寫入文件?

相關問題