PHP 連接 SQL2008

兩種方法

第一種

使用微軟提供的dll文件擴展php

第二種

用php自帶的擴展mssql

(有人說第二種不行總出錯,所以我選了第一個,並且成功了)


 原文地址  http://blog.csdn.net/silentbalanceyh/article/details/4349790

這兩天寫一個工作量統計系統,需要使用PHP連接SQL Server 2005,然後集成在MOSS平臺裏面,頭一次訪問2005的版本,遇到了一些問題,把這些經驗記錄下來。本文純屬經驗記錄,不談是專家之言,若有什麼錯誤或者不清楚的地方,望來信告知:[email protected]

一環境配置:

  因爲我自己機器是Windows 2008 + SQL Server 2008,所以我在使用的時候連接的是SQL Server 2008,後來發現基本功能兩個版本區別不大,因爲三方驅動都是微軟提供的。需要說明的是,在PHP配置文件,即原生的php.ini裏面需要修改一點東西,我沒有嘗試過去掉下邊的註釋是否可以訪問0508的數據庫:

;extension=php_mssql.dll

  我查閱了網上很多資料,這個PHP擴展是提供給SQL Server 2000用的,SQL  Server 2005 SQL Server 2008需要到微軟官方去下載新的驅動,下載地址如下:

Sql2008支持php的擴展插件

http://www.microsoft.com/download/en/search.aspx?q=SQL+Server+for+PHP  全部

http://www.microsoft.com/download/en/details.aspx?id=20098         我下載的

  官方文檔有描述:

  In its continued commitment to interoperability, Microsoft has released an updated SQL Server Driver for PHP. The SQL Server Driver for PHP download is available to all SQL Server users at no additional charge. The SQL Server Driver for PHP is a PHP 5 extension that allows for the reading and writing of SQL Server data from within PHP scripts. The extension provides a procedural interface for accessing data in all editions of SQL Server 2005 and SQL Server 2008.

  根據官方文檔的描述,微軟提供的Driver是同時提供給SQL Server 2005SQL Server 2008兩個版本使用的。所以整體的環境配置步驟如下:

1)下載驅動(上邊有鏈接地址)下載過後的驅動包裏面的內容如下圖:

 

圖例

2)拷貝驅動到相應的位置:

(注意:關於php.ini的位置

有的php環境使用的是軟件打包安裝的方法,一個軟件就可以安裝好php環境,

這個時候php.ini很可能實在你係統的文件夾下例如我的C:\WINDOWS/php.ini 你可以搜索電腦上的php.ini找到它

而你的軟件安裝目錄下例如我的\AppServ\php5 php.ini-dist 是不會被加載的

 這個時候你要去修改真正的php.ini也就是C:\WINDOWS\php.ini

  在Windows操作系統上配置過PHP環境的人應該都清楚,配置的時候若需要配置一個PHP的擴展,此擴展需要將相關的dll文件全部複製到PHP的擴展目錄裏面,然後通過修改php.ini來實現PHP的擴展,在php.ini裏面需要指明擴展路徑,一般情況是在最末尾添加一行:

extension_dir=""

  ""內的內容填寫PHP的擴展目錄名,約定俗成一般是放在PHP目錄下的一個ext文件夾內,當然可以將目錄配置到任何地方(沒有測試過)。把上圖解壓開的dll文件拷貝到extension_dir設置的擴展目錄裏面。

3)修改php.ini實現擴展:

  在php.ini的一大堆;extension=**.dll格式裏面添加兩行,此部分位於以下注釋下邊一般:

; Windows Extensions

; Note that ODBC support is built in, so no dll is needed for it.

; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)

; extension folders as well as the separate PECL DLL download (PHP 5).

; Be sure to appropriately set the extension_dir directive.

  添加的兩行內容爲:

extension=php_sqlsrv_ts.dll

extension=php_sqlsrv.dll

  注意=號右邊是解開過後的擴展的兩個驅動的文件名,必須保證此文件在配置好的擴展目錄內,而且需要注意此處最初不需要帶“;”。*:在php.ini文件裏面,首部分號的含義代表行註釋,如果有分號的時候,服務器在讀取配置的時候會略過分號這一行不去讀取相關內容,只有沒有加分號的行纔會被服務器讀取。】

  這裏解釋一下,兩個驅動程序的區別在於,php_sqlsrv_ts.dll是線程安全的驅動,如果服務器本身的環境是使用的php5ts.dll,就是用這個驅動;php_sqlsrv.dll不是線程 安全的,這種情況下,服務器運行PHP應該加載的是php5.dll

4)測試配置環境:

  整個過程操作好了過後,寫一個test.php測試一下配置的相關環境,測試代碼如下:

<?php

phpinfo();

?>

  若出現以下圖片證明環境已經配置好了:

 

最終測試環境圖  

  這裏列舉一下開發環境,以防出現不同環境有差異的地方:

OSWindows Server 2008  x64 Enterprise Edition

WebServerApache 2.2.11

DatabaseSQL Server 2008  x64 Enterprise Edition

PHP5.2.9

  (*:在配置PHP環境的時候,如果是解壓縮的版本,在Windows平臺上需要拷貝PHP根目錄下所有的DLL文件到Windows的目錄裏面,需要說明的是:Windows 32位系統的目標目錄爲:$:/Windows/System32Windows 64位環境的目標目錄爲:$:/Windows/SysWOW64這裏$符號代表安裝操作系統的盤符號。而且本文的Driver好像運行的最低PHP版本應該爲5.2.6,官方文檔裏面說的測試版本是使用的PHP5.2.6,至於低版本是否可以運行,我沒有測試。)

二連接數據庫:

   使用過SQL Server的人應該都清楚,SQL Server常用的有兩種認證方式,一種是本地系統賬戶認證(Windows Authentication ),一種是使用用戶名和密碼(SQL Server Authentication ),第二種認證方式必須啓用SQL Server的混合模式。

  1.Windows Authentication連接部分代碼段:

<?php

$serverName = "(local)";

$connectionInfo = array("Database"=>"TestingInfo","ConnectionPooling"=>false);

$conn = sqlsrv_connect( $serverName,$connectionInfo);

if$conn == false)

{

    echo "連接失敗!";

   die( print_r( sqlsrv_errors(), true));

}

?>

  2.SQL Server Authentication連接部分代碼段:

<?php

$serverName = "(local)"; //資料庫伺服器位址
$uid = "sa";             //資料庫用戶名
$pwd = "Admin78999";       //資料庫密碼
$db_name="DB_FMDISP";    //資料庫名


$connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>$db_name);
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn == false)
{
    echo "Connect error!";
    die( print_r( sqlsrv_errors(), true));
}
//do sql
$query = sqlsrv_query($conn, "SELECT * FROM DB_FMDISP.dbo.tb_user");
if($query === false )
{
     echo "Error in executing query.</br>";
     die( print_r( sqlsrv_errors(), true));
}
//show the data
while($row = sqlsrv_fetch_array($query)){
    echo $row['uid']."-----".$row['uname']."-----".$row['upwd']."<br/>";
}


/* Free statement and connection resources. */
sqlsrv_free_stmt($query);
sqlsrv_close($conn);

?>

  參考官方提供的英文原文檔,針對參數$connectionInfo做一個簡單說明,因爲$connectionInfo是一個Hash表結構,下邊參數格式爲:

Key[DataType]

Description(Default Value):鍵[數據類型]:描述(默認值)

1APP[String類型]

使用的應用程序名稱【*:我自己不太懂得這個地方的意義,不好意思】(沒有默認值)

2ConnectionPooling[1true爲打開連接池,0false爲關閉連接池]

用來設置是否打開SQL Server的連接池功能(默認值爲true(1))

3Database[String類型]

連接的數據庫的名稱,所有連接提供的數據庫名稱類似ASP.NET裏面web.config的連接字符串裏面的數據庫實例名,如果設置了Database的連接屬性,驅動會默認使用SQL Server支持的Transact-SQL腳本來操作所有提供的數據庫實例,包括添加、刪除、查詢、修改等各種操作(默認爲登陸的操作系統裏面的數據庫,我沒有測試過,應該是直接運行程序的(local))

4Encrypt[1true爲執行加密,0false爲不執行加密]

設置是否對傳入服務器的SQL腳本執行加密操作,當然如果使用加密操作會對系統性能存在一定影響,不過影響不明顯(默認爲false(0))

5Failover_Partner[String類型]

提供一個服務器鏡像,此屬性應該是用於主服務器Down掉的情況,當主服務器Down掉的時候,提供一個備份的數據庫和服務器的實例鏡像作爲備份的服務器處理。(未設置默認值)

6LoginTimeout[Integer類型]

提供連接的超時時間,時間單位爲秒。(未設置)

7PWD[String類型]

當使用SQL Server Authentication認證方式的時候需要提供該屬性,該屬性爲登陸用戶的密碼。(未設置任何值)

8QuotedId[1true就是用SQL-92標準,0false就是用遺留的標準]

設置使用SQL腳本的標準是使用SQL-92標準還是使用遺留的Transact-SQL標準。(默認值爲true(1))

9TraceFile[String類型]

此屬性主要爲監控數據使用,可用於調試或者維護,它的值爲一個路徑,SQL Server會將所有的數據執行操作寫入該路徑,至於具體內容是什麼,我沒有使用過。(未設置默認值)

10TraceOn[1true打開監控,0false關閉監控]

是否打開ODBC連接方式的監控。(默認值false(0))

11TransactionIsolation[常量值]

提供數據庫的事務級別(SQLSRV_TXN_READ_COMMITTED)

常量值包括

SQLSRV_TXN_READ_UNCOMMITTED,

SQLSRV_TXN_READ_COMMITTED,

SQLSRV_TXN_REPEATABLE_READ,

SQLSRV_TXN_SNAPSHOT,

SQLSRV_TXN_SERIALIZABLE

12TrustServerCertificate[1true設置爲客戶端限制,0false設置爲客戶端不限制]

如果設置爲 true,則使用 SSL 對通道進行加密,但不通過證書鏈對可信度進行驗證。如果將TrustServerCertificate 設置爲 true 並將 Encrypt 設置爲 false,則不對通道進行加密。可識別的值爲truefalseyes  no。有關更多信息,請參見 SQL Server 2005 Books Online(《SQL Server 2005 聯機叢書》)中的“Encryption Hierarchy”(加密層次結構)和“Using Encryption Without Validation”(使用不驗證的加密)(默認值:false(0))

13UID[String類型]

當使用SQL Server Authentication認證方式的時候需要提供該屬性,該屬性爲登陸用戶的用戶名。(未設置任何值)

14WSID[String類型]

監控計算機名稱,此屬性很少用。(未設置任何值)

API 參考 (SQL Server Driver for PHP)



用於 SQL Server Driver for PHP 的 API 名稱是 sqlsrv。所有 sqlsrv函數都以 sqlsrv_打頭,後跟動詞或名詞。後跟動詞的函數用於執行特定操作,而後跟名詞的函數用於返回特定形式的元數據。

SQL Server Driver for PHP 包含以下函數:


函數 說明
sqlsrv_begin_transaction 開始事務。
sqlsrv_cancel 取消語句;並放棄相應語句的所有未決結果。
sqlsrv_client_info 提供有關客戶端的信息。
sqlsrv_close 關閉連接。釋放與相應連接關聯的所有資源。
sqlsrv_commit 提交事務。
sqlsrv_configure 更改錯誤處理和日誌記錄配置。
sqlsrv_connect 創建一個連接,並將其打開。
sqlsrv_errors 返回關於上一操作的錯誤和/或警告信息。
sqlsrv_execute 執行預定義語句。
sqlsrv_fetch 使下一行的數據可供讀取。
sqlsrv_fetch_array 以數值索引數組、關聯數組或這兩種數組的形式檢索下一行的數據。
sqlsrv_fetch_object 以對象形式檢索下一行的數據。
sqlsrv_field_metadata 返回字段元數據。
sqlsrv_free_stmt 關閉語句。釋放與相應語句關聯的所有資源。
sqlsrv_get_config 返回指定配置設置的值。
sqlsrv_get_field 按索引檢索當前行中的字段。可以指定 PHP 返回類型。
sqlsrv_has_rows 檢測結果集是否具有一行或多行。
sqlsrv_next_result 使下一結果可供處理。
sqlsrv_num_rows 報告結果集中的行數。
sqlsrv_num_fields 檢索活動結果集中的字段數。
sqlsrv_prepare 準備 Transact-SQL 查詢,但不執行該查詢。隱式綁定參數。
sqlsrv_query 準備 Transact-SQL 查詢,並將其執行。
sqlsrv_rollback 回滾事務。
sqlsrv_rows_affected 返回有所修改的行的數目。
sqlsrv_send_stream_data 在每次調用函數時向服務器發送最多八千字節 (8 KB) 的數據。
sqlsrv_server_info 提供有關服務器的信息。

總結:

  因爲沒有時間講解連接過後的關於SQL的基本操作和詳細操作,僅僅提供一個實例供參考,望諒解,若有筆誤的地方,請指點:[email protected]。還有更加詳細的內容請參考驅動下載過後的官方文檔,下載驅動過後微軟提供了詳細的CHM官方文檔,如何使用驅動都提供了部分例子。

  ——2009.7.11


方法二

加入一點別人的連接前配置系統,我也是這樣按着他的步驟來的:

1.檢查文件 php5.2.5/ntwdblib.dll 默認下面有一個,不能連接再替換.

下載正確版本的 ntwdblib.dll (2000.80.194.0),地址: http://webzila.com/dll/1/ntwdblib.zip

(這個ntwdblib.dll我還是用的安裝php時的版本2000.80.2039)

2.配置php

a、打開php.in將extension=php_mssql.dll的註釋符號去掉

b、打開php.in將mssql.secure_connection = Off改爲on。

c、將php_mssql.dll拷貝到php.in中extension_dir 指定的目錄或者系統system32目錄下。(php_mssql.dll在php的壓縮安裝包中有)。

以上步驟完成後需要重啓apache。

注意:實際使用中發現 如果通過php壓縮文件手工安裝php到iis下,必須重啓機器而不僅僅是iis。

3.配置sqlserver 
a. 運行 SQL Server 配置管理器:SQL Server Configuration Manager,打開協議 Protocols 
b. 允許命名管道 "named pipes" 和 "tcp/ip" 
c. 右鍵點擊 "tcp/ip",打開屬性 Properties 標籤 "IP addresses" 
d. 在 TCP 動態端口 "TCP Dynamic Ports" 填入 1433 
e. 重啓 SQL Server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章