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/IP和named 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】(這是你之後用PHP的odbc函數來連接時使用的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文件的編碼也使用gbk(ANSI),輸出的網頁也要指定編碼爲gbk或gb2312。如果其中一個不一樣,那麼中文就會出現亂碼。
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>