本篇文章是對(duì)使用PHP執(zhí)行 SQL文件的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹 需要的朋友參考下 ?

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)建站提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價(jià)值。
demo php:
復(fù)制代碼 代碼如下: ?php /** * 讀取 sql 文件并寫入數(shù)據(jù)庫 * @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語法的語句分割符進(jìn)行分割 ??????? $segment = explode(";" trim($sqlStr)); ??????? //var_dump($segment); ??????? //去掉注釋和多余的空行 ??????? foreach($segment as $statement) ??????? { ??????????? $sentence = explode("/n" $statement); ??????????? $newStatement = array(); ??????????? foreach($sentence as $subSentence) ??????????? { ??????????????? if( != trim($subSentence)) ??????????????? { ??????????????????? //判斷是會(huì)否是注釋 ??????????????????? $isComment = false; ??????????????????? foreach($menter as $er) ??????????????????? { ??????????????????????? if(eregi("^(" $er ")" trim($subSentence))) ??????????????????????? { ??????????????????????????? $isComment = true; ??????????????????????????? break; ??????????????????????? } ??????????????????? } ??????????????????? //如果不是注釋 則認(rèn)為是sql語句 ??????????????????? if(!$isComment) ??????????????????????? $newStatement[] = $subSentence;?????????????????? ??????????????? } ??????????? } ??????????? $statement = $newStatement; ??????? } ??????? //對(duì)表名加前綴 ??????? if( != $prefix) ??????? { ?????? ??????????? //只有表名在第一行出現(xiàn)時(shí)才有效 例如 CREATE TABLE talbeName ??????????? $regxTable = "^[/`/ /"]{ }[/_a zA Z]+[/_a zA Z ]*[/`/ /"]{ }$";//處理表名的正則表達(dá)式 ??????????? $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
我用的php版本是php5.6.12,mssql數(shù)據(jù)庫版本為2008
兩種途徑:
1、直接連接
$servname="captainhero567";
$conninfo=array(
"database"="netdata",
"uid"="lxz2005",
"pwd"="831140");
$conn=sqlsrv_connect($servname,
$conninfo);
$sql="select
*
from
pinfo";
$db=sqlsrv_query($conn,
$sql);
while($row=sqlsrv_fetch_array($db))
{
echo("
".iconv("gb2312","utf-8",$row["pname"])."
");
}
2、使用pdo抽象數(shù)據(jù)層連接
$hostname
=
"192.168.1.100";
$dbname
=
"northwind";
$username
=
"sa";
$pwd
=
"pwd100";
$dsn="sqlsrv:server=$hostname;database=$dbname";
$conn
=
new
pdo
($dsn,$username,$pwd);
$conn-setattribute(pdo::attr_errmode,pdo::errmode_exception);
echo
"mssql
database
connnection
sucessed!";
1、學(xué)習(xí)的方法,最好是看手冊(cè)
在前一篇文章中涉及到了連接數(shù)據(jù)庫sqlsrv_connect();還記得我們mysql連接數(shù)據(jù)庫的時(shí)候也是mysql_connect();兩者操作數(shù)據(jù)庫是很相似的。從零基礎(chǔ)開始學(xué)起的話,只能是查閱手冊(cè)。查看一下sqlsrv有哪些函數(shù)提供我們使用!推薦網(wǎng)址是:
【注意】很多的方法都跟mysql提供的方法很相似,看到后面的函數(shù)名就大概知道里面的用法,比如說mysql執(zhí)行sql語句的時(shí)候調(diào)用mysql_query();而sqlserver執(zhí)行sql語句的時(shí)候調(diào)用也是sqlsrv_query(),但是特別注意一點(diǎn)就是,它們的傳遞參數(shù)不一樣。詳細(xì)的只能看一下手冊(cè)。接下來我簡單總結(jié)一下操作數(shù)據(jù)的方法
2、連接數(shù)據(jù)庫sqlsrv_connect()
?php$serverName = "serverName\sqlexpress";//服務(wù)器的名字,本地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、操作數(shù)據(jù)庫
1)執(zhí)行sql語句sqlsrv_query(),返回值為true或者false,這里函數(shù)的用法跟mysql_query(),不一樣。它需要把連接的資源句柄當(dāng)作參數(shù)傳進(jìn)去,看源碼。資源句柄就是上面代碼連接數(shù)據(jù)庫的“$conn”。
$sql = "select * from test1"; ? //sql語句$data = sqlsrv_query($conn,$sql); ?//$conn資源句柄if($data == true){ ? ?die("執(zhí)行成功");
}else{ ? ?die("執(zhí)行失敗");
}
2)獲取結(jié)果集
//以數(shù)值索引數(shù)組、關(guān)聯(lián)數(shù)組或這兩種數(shù)組的形式檢索下一行的數(shù)據(jù)。類似于mysql_fetch_arraysqlsrv_fetch_array ?
//以對(duì)象形式檢索下一行的數(shù)據(jù)。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)顯示錯(cuò)誤信息sqlsrv_errors():上面都有用到這個(gè)函數(shù),只要是操作數(shù)據(jù)庫發(fā)生錯(cuò)誤,都可以使用這個(gè)函數(shù)打印出來看一下壓
這里就不用上代碼了
$haha = M(),$res = $haha-query($sql)。
或 $res = $waw-execute($sql)。
$sql中包含了表名,實(shí)例化模型時(shí)可以為空。注意query是查功能,execute是增刪改功能。
結(jié)構(gòu)化查詢語言(Structured Query Language)簡稱SQL(發(fā)音:/?es kju? ?el/ "S-Q-L"),是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設(shè)計(jì)語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng);同時(shí)也是數(shù)據(jù)庫腳本文件的擴(kuò)展名。
結(jié)構(gòu)化查詢語言是高級(jí)的非過程化編程語言,允許用戶在高層數(shù)據(jù)結(jié)構(gòu)上工作。它不要求用戶指定對(duì)數(shù)據(jù)的存放方法,也不需要用戶了解具體的數(shù)據(jù)存放方式,所以具有完全不同底層結(jié)構(gòu)的不同數(shù)據(jù)庫系統(tǒng)。
可以使用相同的結(jié)構(gòu)化查詢語言作為數(shù)據(jù)輸入與管理的接口。結(jié)構(gòu)化查詢語言語句可以嵌套,這使它具有極大的靈活性和強(qiáng)大的功能。
1986年10月,美國國家標(biāo)準(zhǔn)協(xié)會(huì)對(duì)SQL進(jìn)行規(guī)范后,以此作為關(guān)系式數(shù)據(jù)庫管理系統(tǒng)的標(biāo)準(zhǔn)語言(ANSI X3. 135-1986),1987年得到國際標(biāo)準(zhǔn)組織的支持下成為國際標(biāo)準(zhǔn)。不過各種通行的數(shù)據(jù)庫系統(tǒng)在其實(shí)踐過程中都對(duì)SQL規(guī)范作了某些編改和擴(kuò)充。
所以,實(shí)際上不同數(shù)據(jù)庫系統(tǒng)之間的SQL不能完全相互通用。
本文名稱:php的數(shù)據(jù)庫sql php的數(shù)據(jù)庫控制臺(tái)中為什么不能持續(xù)的增加外鍵
鏈接地址:http://chinadenli.net/article48/dohgdep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)