重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
本篇文章是對使用PHP執行 SQL文件的實現代碼進行了詳細的分析介紹 需要的朋友參考下 ?
秦皇島網站建設公司成都創新互聯公司,秦皇島網站設計制作,有大型網站制作公司豐富經驗。已為秦皇島成百上千提供企業網站建設服務。企業網站搭建\外貿營銷網站建設要多少錢,請找那個售后服務好的秦皇島做網站的公司定做!
demo php:
復制代碼 代碼如下: ?php /** * 讀取 sql 文件并寫入數據庫 * @version demo php */ class DBManager { ??? var $dbHost = ; ??? var $dbUser = ; ??? var $dbPassword = ; ??? var $dbSchema = ; ??? function __construct($host $user $password $schema) ??? { ??????? $this dbHost = $host; ??????? $this dbUser = $user; ??????? $this dbPassword = $password; ??????? $this dbSchema = $schema; ??? } ??? function createFromFile($sqlPath $delimiter = (;/n)|((;/r/n))|(;/r) $prefix = $menter = array( # )) ??? { ??????? //判斷文件是否存在 ??????? if(!file_exists($sqlPath)) ??????????? return false; ??????? $handle = fopen($sqlPath rb );?? ??????? $sqlStr = fread($handle filesize($sqlPath)); ??????? //通過sql語法的語句分割符進行分割 ??????? $segment = explode(";" trim($sqlStr)); ??????? //var_dump($segment); ??????? //去掉注釋和多余的空行 ??????? foreach($segment as $statement) ??????? { ??????????? $sentence = explode("/n" $statement); ??????????? $newStatement = array(); ??????????? foreach($sentence as $subSentence) ??????????? { ??????????????? if( != trim($subSentence)) ??????????????? { ??????????????????? //判斷是會否是注釋 ??????????????????? $isComment = false; ??????????????????? foreach($menter as $er) ??????????????????? { ??????????????????????? if(eregi("^(" $er ")" trim($subSentence))) ??????????????????????? { ??????????????????????????? $isComment = true; ??????????????????????????? break; ??????????????????????? } ??????????????????? } ??????????????????? //如果不是注釋 則認為是sql語句 ??????????????????? if(!$isComment) ??????????????????????? $newStatement[] = $subSentence;?????????????????? ??????????????? } ??????????? } ??????????? $statement = $newStatement; ??????? } ??????? //對表名加前綴 ??????? if( != $prefix) ??????? { ?????? ??????????? //只有表名在第一行出現時才有效 例如 CREATE TABLE talbeName ??????????? $regxTable = "^[/`/ /"]{ }[/_a zA Z]+[/_a zA Z ]*[/`/ /"]{ }$";//處理表名的正則表達式 ??????????? $regxLeftWall = "^[/`/ /"]{ }"; ??????????? $sqlFlagTree = array( ??????????????????? "CREATE" = array( ??????????????????????????? "TABLE" = array( ??????????????????????????????????? "$regxTable" = ??????????????????????????????? ) ??????????????????????? ) ??????????????????? "INSERT" = array( ??????????????????????????? "INTO" = array( ??????????????????????????????? "$regxTable" = ??????????????????????????? ) ??????????????????????? ) ??????????????????? ); ??????????? foreach($segment as $statement) ??????????? { ??????????????? $tokens = split(" " $statement[ ]); ??????????????? $tableName = array(); ??????????????? $this findTableName($sqlFlagTree $tokens $tableName); ??????????????? if(empty($tableName[ leftWall ])) ??????????????? { ??????????????????? $newTableName = $prefix $tableName[ name ]; ??????????????? } ??????????????? else{ ??????????????????? $newTableName = $tableName[ leftWall ] $prefix substr($tableName[ name ] ); ??????????????? } ??????????????? $statement[ ] = str_replace($tableName[ name ] $newTableName $statement[ ]); ??????????? } ??????? }?????? ??????? //組合sql語句 ??????? foreach($segment as $statement) ??????? { ??????????? $newStmt = ; ??????????? foreach($statement as $sentence) ??????????? { ??????????????? $newStmt = $newStmt trim($sentence) "/n"; ??????????? } ??????????? $statement = $newStmt; ??????? } ??????? //用于測試 ?????? ??????? //var_dump($segment); ??????? //writeArrayToFile( data txt $segment); ??????? // ??????? self::saveByQuery($segment); ??????? return true; ??? } ??? private function saveByQuery($sqlArray) ??? { ??????? $conn = mysql_connect($this dbHost $this dbUser $this dbPassword); ??????? mysql_select_db($this dbSchema); ??????? foreach($sqlArray as $sql) ??????? { ??????????? mysql_query($sql); ??????? }?????? ??????? mysql_close($conn); ??? } ??? private function findTableName($sqlFlagTree $tokens $tokensKey= $tableName = array()) ??? { ??????? $regxLeftWall = "^[/`/ /"]{ }"; ??????? if(count($tokens)=$tokensKey) ??????????? return false;?????? ??????? if( == trim($tokens[$tokensKey])) ??????? { ??????????? return self::findTableName($sqlFlagTree $tokens $tokensKey+ $tableName); ??????? } ??????? else ??????? { ??????????? foreach($sqlFlagTree as $flag = $v) ??????????? {?? ??????????????? if(eregi($flag $tokens[$tokensKey])) ??????????????? { ??????????????????? if( ==$v) ??????????????????? { ??????????????????????? $tableName[ name ] = $tokens[$tokensKey]; ??????????????????????? if(eregi($regxLeftWall $tableName[ name ])) ??????????????????????? { ??????????????????????????? $tableName[ leftWall ] = $tableName[ name ]{ }; ??????????????????????? } ??????????????????????? return true; ??????????????????? } ??????????????????? else{ ??????????????????????? return self::findTableName($v $tokens $tokensKey+ $tableName); ??????????????????? } ??????????????? } ??????????? } ??????? } ??????? return false; ??? } } function writeArrayToFile($fileName $dataArray $delimiter="/r/n") { ??? $handle=fopen($fileName "wb"); ??? $text = ; ??? foreach($dataArray as $data) ??? { ??????? $text = $text $data $delimiter; ??? } ??? fwrite($handle $text); } //測試 $dbM = new DBManager( localhost w f test ); $dbM createFromFile( data sql null fff_ ); ? lishixinzhi/Article/program/PHP/201311/21281
1、學習的方法,最好是看手冊
在前一篇文章中涉及到了連接數據庫sqlsrv_connect();還記得我們mysql連接數據庫的時候也是mysql_connect();兩者操作數據庫是很相似的。從零基礎開始學起的話,只能是查閱手冊。查看一下sqlsrv有哪些函數提供我們使用!推薦網址是:
【注意】很多的方法都跟mysql提供的方法很相似,看到后面的函數名就大概知道里面的用法,比如說mysql執行sql語句的時候調用mysql_query();而sqlserver執行sql語句的時候調用也是sqlsrv_query(),但是特別注意一點就是,它們的傳遞參數不一樣。詳細的只能看一下手冊。接下來我簡單總結一下操作數據的方法
2、連接數據庫sqlsrv_connect()
?php$serverName = "serverName\sqlexpress";//服務器的名字,本地localhost$connectionInfo = array( "Database"="dbName", "UID"="userName", "PWD"="password");$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));
}
3、操作數據庫
1)執行sql語句sqlsrv_query(),返回值為true或者false,這里函數的用法跟mysql_query(),不一樣。它需要把連接的資源句柄當作參數傳進去,看源碼。資源句柄就是上面代碼連接數據庫的“$conn”。
$sql = "select * from test1"; ? //sql語句$data = sqlsrv_query($conn,$sql); ?//$conn資源句柄if($data == true){ ? ?die("執行成功");
}else{ ? ?die("執行失敗");
}
2)獲取結果集
//以數值索引數組、關聯數組或這兩種數組的形式檢索下一行的數據。類似于mysql_fetch_arraysqlsrv_fetch_array ?
//以對象形式檢索下一行的數據。sqlsrv_fetch_object 1234
$sql = "select * from test1";$data = sqlsrv_query($conn,$sql);if($data == true){ ? ?while($row = sqlsrv_fetch_array( $data, SQLSRV_FETCH_ASSOC) ) { ? ? ? ? ?echo $row['id'].", ".$row['name']."br /";
}else{ ? ? ? ? die( print_r( sqlsrv_errors(), true));
}
}
$sql = "SELECT fName, lName FROM Table_1";$stmt = sqlsrv_query( $conn, $sql);if( $stmt === false ) { ? ? die( print_r( sqlsrv_errors(), true));
}while( $obj = sqlsrv_fetch_object( $stmt)) { ? ? ?echo $obj-fName.", ".$obj-lName."br /";
}
3)顯示錯誤信息sqlsrv_errors():上面都有用到這個函數,只要是操作數據庫發生錯誤,都可以使用這個函數打印出來看一下壓
這里就不用上代碼了
1、軟件配置
Win7 64 +wampserver2.2d-x32+SQL Server 2008 R2數據庫,wamp2.2中的php版本是5.3.10。
Php環境也可以換成php+apache。
2、支持連接MySQL Server配置
php版本5.3以前,有php_mssql功能,可以使用,但是5.3及以后的版本不支持。
2.1、php連接mssql設置(php5.3以前版本)
(1)、打開php.ini,將
;extension=php_mssql.dll前面的分號(;)去掉,然后重啟 Apache。如果不行的話,進行第2步。
(2)檢查一下你的php安裝目錄下的ext下面有沒有php_mssql.dll存在,如果沒有,從重新下載一個php安裝,要下載那個壓縮包的才是最完整的。
如果ext目錄下已經有了php_mssql.dll,那么你需要打開php.ini,找到
extension_dir = "./ext"
這一句(或者類似的,不一定是"./ext",查找"extension_dir"即可),然后把"./ext"修改為你的php安裝目錄的ext目錄的完整路徑,比如"c:/php/ext",或者"c:/program files/php/ext"這樣。然后再次重啟 Apache。如果還是不行的話,可能就需要第3步了。
(3)把 php 目錄下的 ntwdblib.dll 和 php_mssql.dll 復制到 system32的系統目錄中去,然后重起Apache。
(4)然后就可以連接MSSQL,并進行一些操作了。連接例子如下:
2.2、php連接sqlsrv(php5.3以及以上版本)
(1)、下載Microsoft Drivers for?PHP?for SQL Server,官方下載地址:,我使用的是SQLSRV2.0。
(2)、解壓下載下來的文件將php_pdo_sqlsrv_53_ts_vc9.dll文件和php_sqlsrv_53_ts_vc9.dll文件復制到php安裝目錄下的ext文件夾中。此處根據版本不同使用的文件不同。
(3)、在php.ini中添加
extension=php_sqlsrv_53_ts_vc9.dll
extension=php_pdo_sqlsrv_53_ts_vc9.dll
到很多;extension=***.dll語句后面,注意extension_dir 指向的位置是否正確。
(4)、重啟apache,然后訪問訪問地址/?Phpinfo=1,出現下面圖片中的內容,則代表配置正確。
(5)、寫測試代碼,測試代碼如下:
?php
header("Content-type: text/html; charset=utf-8");
$serverName = "localhost"; //數據庫服務器地址$uid = "foodcert"; //數據庫用戶名$pwd = "foodcert"; //數據庫密碼$connectionInfo = array("UID"=$uid, "PWD"=$pwd, "Database"="FoodCert");
$conn = sqlsrv_connect( $serverName, $connectionInfo);if( $conn == false)
{
echo "連接失敗!";
die( print_r( sqlsrv_errors(), true));
}else{
echo "連接成功!"; ?
}
$query = sqlsrv_query($conn, "select * from 數據庫表");while($row = sqlsrv_fetch_array($query))
{
print_r($row);
}?
(6)、上面完成之后,測試代碼的時候會出現連接失敗,因為沒有安裝sql server nation client ,本地客戶端,去下載合適的客戶端,我使用的是Microsoft? SQL Server? 2012 Native Client,下載地址:
(7)、安裝完成之后,在重新啟動apache,然后訪問就可以連接成功了。
(8)、注意:在php.ini文件所在的文件夾中必須要有ntwdblib.dll文件存在。