PHP+SQLServer2005+Apache/系統DSN配置+ODBC查插刪改


0.背景

數據庫實驗要求必須用PHP/ASP, SQL SERVER /ACCESS,ODBC+系統DSN。環境很不好配置(特別是在Win7 64位的環境下)。之前試過用PHP+ACCESS+ODBC+系統DSN,但測試的時候卻報了錯誤,說數據庫驅動與PHP的架構不一樣(網上找了一下:是因爲32位的數據庫驅動與64位的PHP不兼容)。後來改用用PHP+SQLServer+ODBC+系統DSN的搭配,也整了將近一天才把環境配好。所以我把配置過詳細總結了一下,以備日後不時之需。

1. 工具準備:

1. SQL Server 2005 Express Edition 

SQLEXPR_CHS.EXE適用於64位系統

SQLEXPR32_CHS.EXE適用於32位系統

2. Microsoft SQL Server Management Studio Express (SSMSE)

SQLServer2005_SSMSEE.msi適用於32位系統

SQLServer2005_SSMSEE_x64.msi適用於64位系統

SSMSE按默認配置安裝即可。比較簡單,下面就不講了。

3. wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-x64.exe

apache + php + mysql集成軟件,安裝以後就可以使用了,而無需什麼配置(只需要配一下網站根目錄)。

4. ZendStudio

非必須。這是一個PHP的IDE,在eclipse的基礎開發的。

2. 環境

Win7旗艦版

3. 安裝SQL Server 2005 Express Edition主要步驟

首先運行SQLEXPR_CHS.EXE。下圖是系統配置檢查結果


顯示了一些警告信息,但無關緊要,除非你用到了ASP.NET

進入功能選擇菜單後,將【連接組件】選中(主要用於命令行訪問數據庫服務器),可以點擊【瀏覽】改變數據庫安裝位置。

之後是設置數據庫服務器實例名:選擇【命名實例】,可以輸入實例名(此實例名就是安裝完成之後SQLServer服務器的名稱(會轉爲全大寫形式)),或使用它給的實例名。如果選擇【默認實例】:那麼實例名將是MSSQLSERVER

注:【實例名】是用於區分同一臺機器上安裝的各個不同配置的SQLServer服務器的。SQLServer可以是同一個版或不同版。

在設置服務帳戶時:我選擇的是【使用內置系統帳戶:Local system

點擊【下一步】之後進行身份驗證模式。選擇【Windows身份驗證模式】(此處主要是爲了通過ODBC連接數據庫時不使用密碼)。當然如果你需要更高的安全性也可以選擇另外一個,並輸入密碼。

之後的步驟就比較簡單了,按下面的圖操作就可以了。



4. 配置SQL Server 2005 Express

找到安裝好的SQLServer2005,選擇SQL Server 外圍應用配置器。


在出現的界面點擊【服務和連接的外圍應用配置器】

之後會出現下圖所示的界面。當此界面中你就可以看到之後建立的所有【數據庫服務器實例】,並可以對其進行配置。(下圖是最新的圖,其它的圖還是用的以前的,所以別的圖中沒有SQLNEWINSTANCE這個服務器)。選中你要使用的【數據庫服務器】(此處我選的是SQLEXPRESS),然後點擊其【遠程連接】→【本地連接和遠程連接】,選擇【同時使用TCP/IPnamed pipes】(這麼做是爲了使用ODBC連接數據庫服務器)→(重啓服務)點擊【服務】→【停止】→【啓動】→OK這就基本配置完了。




這時候你用【SQL Server配置管理器】就可以去查看服務狀態了。要保證SQLServer(SQLEXPRESS)處於運行狀態。

如果有端口衝突之類的問題,可以點擊【SQLEXPRESS的協議】→【TCP/IP進行配置。配置方法參見:http://blog.163.com/china0359@yeah/blog/static/121719436201235545362/

下面就可以利用你安裝的Microsoft SQL Server Management Studio Express (SSMSE)來連接剛剛建好的數據庫服務器【SQLEXPRESS】,如果有多個服務器實例,則可以點擊下拉菜單來選擇(如果一個服務器都沒有,則說明你的之前的配置有問題。)。


點擊【連接】,之後如果連接成功就會出現下面所示的界面。到此爲SQL SERVER 2005就配置完成了。



5. 配置ODBC+系統DSN數據源

下面來講解創建【系統DSN】數據源並綁定【數據庫】的方法。

首先,在利用Microsoft SQL Server Management Studio Express (SSMSE)新建一個數據庫exp(名稱隨意)。

之後找到【ODBC數據源管理器】(【開始】→【控制面板】→【管理工具】→【數據源(ODBC)】),轉到【系統DSN】中,點擊【添加】。

注:選擇【系統DSN】纔可以讓別的用戶來訪問該數據源;如果選擇【用戶DSN】,則只有當前用戶纔可以使用該數據源。

選擇【SQL Native Client】驅動程序→【完成】。


設置數據源名稱:【DBSTestSQLServer】(這是你之後用PHPodbc函數來連接時使用的DSN名稱),點擊【服務器】下拉框(這個操作會耗點時間)→一會之後在出現的條目中選擇你要連接的【數據庫服務器】,這裏我用的是最後一個【SQLEXPRESS→【下一步】。


按如下方式選擇→【下一步】。


勾選【更改默認的數據爲】→點擊下拉框,選擇已經建好的數據庫【exp】(前面建的。根據你建的數據庫名來選擇)→【下一步】→之後的步驟就保持默認設置就可以了。


設置完成之後會出現下面這個。點擊【測試數據源】


如果出現了下面的結果,那麼恭喜你!數據源配置成功了!


現在就可以在系統DSN中看到剛剛建好的數據源了。


6. 在PHP測試數據源及ODBC查插刪改操作

運行WampServer(用於構建Apache+PHP的環境)。利用Zend Studio編輯測試頁面。

6.1. Apache配置:

定位到WampServer安裝目錄,轉到bin\apache\apache2.2.22\conf\目錄,打開httpd.conf

找到如下位置並進行相應修改:

#端口號,不般用這個默認的就可以了。

ServerName localhost:80

#這個是網站根目錄,根據你的實際情況配置。當在瀏覽器中輸入localhost的時候就是訪問的這個文件夾。

DocumentRoot "E:/programming/practice/web/php/"

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

</Directory>

#設置訪問權限。

<Directory "E:/programming/practice/web/php/">

    Options Indexes FollowSymLinks

    AllowOverride all

    Order Deny,Allow

    Allow from all

</Directory>


6.2. 編碼問題

SQL Server中的中文編碼是gbk,所以php文件的編碼也使用gbkANSI),輸出的網頁也要指定編碼爲gbkgb2312。如果其中一個不一樣,那麼中文就會出現亂碼。


6.3. 測試結果:


附:PHP測試代碼

複製之後保存爲db_test.php文件,以ANSI編碼保存。

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>Access DB Test</title>

</head>

<body>

<h1 align="center">Connect DB Test</h1>

<?php

//

// 數據庫操作函數

//

function deleteAll($conn, $table)

{

$sql = 'DELETE FROM '.$table.' WHERE 1=1';

odbc_exec($conn, $sql);

}

function showAll($conn, $table)

{

$sql = 'SELECT id, bID, bName FROM '.$table;

$rs = odbc_do($conn, $sql);

print '<table border="1">';

print '<tr><td>'.odbc_field_name($rs, 1).'</td><td>'.odbc_field_name($rs, 2).'</td><td>'.odbc_field_name($rs, 3).'</td></tr>';

while(odbc_fetch_row($rs))

{

print '<tr>';

print '<td>'.odbc_result($rs, 'id').'</td>';

print '<td>'.odbc_result($rs, 'bID').'</td>';

print '<td>'.odbc_result($rs, 'bName').'</td>';

print '</tr>';

}

print '</table>';

}

function insertTestData($conn)

{

static $i = 0;

for($j = 0; $j < 10; $j++)

{

$insertSql = 'INSERT INTO book (bID, bName) VALUES (\'ISBN 7-5325-2480-'.$i.'\',\'測試'.$i++.'\')';

odbc_exec($conn, $insertSql);

}

}

function createTable($conn)

{

$tableRs = odbc_tables($conn, null, null, 'book', 'TABLE');

if(odbc_fetch_row($tableRs) )

{

return 'table already exists.';

}

$createSql = 

('CREATE TABLE book'.

'('.

'id INT IDENTITY(1, 1) PRIMARY KEY,'.

'bID VARCHAR(30) NOT NULL,'.

'bName NVARCHAR(30) NOT NULL,'.

')'

);

odbc_do($conn, $createSql);

return 'table created!';

}

//

// 測試流程

//

print '<pre>connecting db....</pre>';

$conn = odbc_connect ("DBSTestSQLServer" , "", "", SQL_CUR_USE_ODBC ) or die('fail to connect db');

/**

 * 建表並顯示結果

 */

print createTable($conn).'<br>';

print "Table is :<br>";

$tableRs = odbc_tables($conn, null, null, 'book', 'TABLE');

while(odbc_fetch_row($tableRs))

{

print odbc_result($tableRs, 'TABLE_NAME').'<br>';

}

/**

 * 插入測試數據

 */

insertTestData($conn);

print '<hr>插入的數據: <br>';

showAll($conn, 'book');

/**

 * 刪除數據

 */

deleteAll($conn, 'book');

print '刪除所有數據之後: <br>';

showAll($conn, 'book');

/**

 * 關閉數據連接

 */

odbc_close ( $conn );

?>

</body>

</html>

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