PHP网站制作之PHP 数据库驱动、毗连数据分歧体例进修...
算是1个熟悉的过程,所以c语言的基础有就更好,没有也不怕。目次1.PHP数据库驱动简介2.PHP毗连数据库的分歧体例1.PHP数据库驱动简介驱动是一段计划用来于一种特定范例的数据库服务器举行交互的软件代码。驱动大概会挪用一些库。相似于Java中的数据库驱动的观点复制代码1.JDBC-ODPC桥:它将JDBCAPI映照到ODPCAPI。再让JDBC-ODPC挪用数据库当地驱动代码(也就是数据库厂商供应的数据库操纵二进制代码库,比方Oracle中的oci.dll)2.当地API驱动间接将JDBCAPI映照成数据库特定的客户端API,即经由过程客户端加载数据库厂商供应的当地代码库(C/C++等)3.收集协定驱动(支流)这类范例的驱动给客户端供应了一个收集API,客户端上的JDBC驱动程序利用套接字(Socket)来挪用服务器上的两头件程序,后者在将其哀求转化为所需的详细API挪用。4.当地协定驱动(支流)这类范例的驱动利用Socket,间接在客户端和数据库间通讯。它是一种间接与数据库实例交互的JDBC这类驱动是智能的,它晓得数据库利用的底层协定,也是今朝最支流利用的JDBC驱动,我们本章的重点就是它复制代码而关于PHP来讲,一样支流利用的也是收集协定驱动、当地协定驱动,即MySQL客户端库、MySQLNative驱动库。这些库完成了用于和MySQL数据库服务器举行交互的底层协定。数据库驱动位于PHP和数据库举行通讯的最底层,分歧的数据库厂商城市在基于某个框架的条件下完成本人的驱动,用以供应基础功效、和特定命据库的初级功效。在驱动层之上是"毗连器"、大概是适配器笼统层,用于PHP代码和数据库举行毗连,程序员可使用PDO(PHPDatabaseObject)、大概间接利用扩大接口(mysql、mysqli)这些表露出来的API与底层数据库举行通讯。数据库厂商供应的底层数据库驱动mysql:http://www.mysql.com/products/connector/oracle:http://www.ckuyun.com/technetwork/indexes/downloads/index.html#databasesqlserver:http://msdn.microsoft.com/zh-cn/library/cc296170(SQL.90).aspx...文件型数据库文件型是一种基于文件的数据库引擎,并且利用文件I/O(输出/输入)函数来存储和读取来自磁盘上文件的数据库。它广泛也比干系型数据库(比方Mysql)小良多良多(比方典范的文件型数据库SQLite命令行版本的巨细小于200KB),同时,文件型数据库并且撑持你所熟习的年夜部分SQL命令,同时具有易于照顾的特性接上去,我们以下面这张年夜图作为入手下手,一一进修PHP毗连数据库的分歧体例、和它们在分歧营业场景下的优弱点2.PHP毗连数据库的分歧体例0x1:利用扩大API接口与数据库通讯PHP代码是由一个中心,一些可选扩大构成了中心功效。PHP的MySQL相干扩大,好比mysqli,mysql都是基于PHP扩大框架完成的。扩展一个典范的感化就是表露一个API给PHP程序员,同意扩大本人的功效能够被程序员利用。固然,也有一部分基于PHP扩大框架开辟的扩大不会给PHP程序员表露API接口。好比说PDOMySQL驱动扩大,就没有向PHP程序员表露API接口,可是向它下层的PDO层供应了一个接口。关于PHP扩大的编写请参阅另外一篇博文http://www.ckuyun.com/LittleHann/p/3562259.html在实践编程中,利用频度最多的仍是以扩大API的体例往毗连数据库extension=php_mysql.dll这是计划开辟同意PHP使用与MySQL数据库交互的初期扩大。mysql扩大供应了一个面向历程的接口,而且是针对MySQL4.1.3或更早版本计划的。因而,这个扩大固然能够与MySQL4.1.3或更新的数据库服务端举行交互,但其实不撑持前期MySQL服务端供应的一些特征mysql扩大的源代码在PHP扩大目次ext/mysql下复制代码<?php//毗连、选择数据库$link=mysql_connect(mysql_host,mysql_user,mysql_password)ordie(Couldnotconnect:.mysql_error());echoConnectedsuccessfully;mysql_select_db(my_database)ordie(Couldnotselectdatabase);//实行SQL查询$query=SELECT*FROMmy_table;$result=mysql_query($query)ordie(Queryfailed:.mysql_error());//以HTML打印查询了局echo"<table>";while($line=mysql_fetch_array($result,MYSQL_ASSOC)){echo" <tr>
";foreach($lineas$col_value){echo" <td>$col_value</td>
";}echo" </tr>
";}echo"</table>
";//开释了局集mysql_free_result($result);//封闭毗连mysql_close($link);?>复制代码extension=php_mysqli.dllmysqli扩大,我们偶然称之为MySQL加强扩大,能够用于利用MySQL4.1.3或更新版本中新的初级特征。mysqli扩大在PHP5及今后版本中包括。mysqli扩大有一系列的上风,相对mysql扩大的提拔次要有:复制代码1.面向工具接口2.prepared语句撑持(即参数编译预处置,能够无效进攻SQL注进的产生)3.多语句实行撑持4.事件撑持5.加强的调试才能6.嵌进式服务撑持7.在供应了面向工具接口的同时也供应了一个面向历程的接口。复制代码mysqli扩大是利用PHP扩大框架构建的,它的源代码在PHP源码目次下的ext/mysqli中复制代码<?php$con=newmysqli("localhost","root","111","php4fun_");/*checkconnection*/if(mysqli_connect_errno()){printf("Connectfailed:%s
",mysqli_connect_error());exit();}$sql="selectnamefromuserswherename=?andpass=?";$cmd=$con->prepare($sql);$name=$_GET;$pass=$_GET;//addparameterstosqlquery$cmd->bind_param("ss",$name,$pass);$cmd->execute();$cmd->bind_result($result);$cmd->fetch();if($result){var_dump($result);}?>复制代码mysqli除可使用参数编译预处置来举行数据库通讯,同时也兼容利用面向历程的编码体例复制代码<?php/*ConnecttoaMySQLserver毗连数据库服务器*/$link=mysqli_connect(localhost,/*Thehosttoconnectto毗连MySQL地点*/root,/*Theusertoconnectas毗连MySQL用户名*/111,/*Thepasswordtouse毗连MySQL暗码*/company);/*Thedefaultdatabasetoquery毗连数据库称号*/if(!$link){printf("CantconnecttoMySQLServer.Errorcode:%s",mysqli_connect_error());exit;}/*Sendaquerytotheserver向服务器发送查询哀求*/if($result=mysqli_query($link,SELECT*fromp8_ad_user)){print("Verylargecitiesare:");/*Fetchtheresultsofthequery前往查询的了局*/while($row=mysqli_fetch_assoc($result)){printf("%s(%s)",$row,$row);}/*Destroytheresultsetandfreethememoryusedforit停止查询开释内存*/mysqli_free_result($result);}/*Closetheconnection封闭毗连*/mysqli_close($link);?>复制代码PHP还撑持良多其他的数据库毗连扩大,利用办法都相似,只需遵守函数挪用标准便可,更多概况请参阅http://www.php.net/manual/zh/refs.database.php0x2:利用PDO笼统层与数据库通讯PDO(PHP数据工具PHPDatabaseObject),是PHP使用中的一个数据库笼统层标准。PDO供应了一个一致的API接口可使得你的PHP使用不往体贴详细要毗连的数据库服务器体系范例。也就是说,假如你利用PDO的API,能够在任何必要的时分无缝切换数据库服务器,好比从Firebird到MySQL,仅仅必要修正很少的PHP代码。其他数据库笼统层的例子包含Java使用中的JDBC和Perl中的DBI。注重:使用PDO扩大本身其实不能完成任何数据库功效;必需利用一个详细数据库的PDO驱动来会见数据库服务(它只是一个接口标准)可是反过去说,一个接口供应的兼容性越强,它的定制性、特同性就响应越弱(这很简单了解),PDO接口API的次要弱点是会限定让你不克不及利用MySQL服务端供应一切的数据库初级特征。好比,PDO不同意利用MySQL撑持的多语句实行。在PHP5中,PDO今朝已撑持大批数据库,而且在PHP6中将作为默许数据库毗连体例:1.sqlite2.mysql3.pgsql4.mssql...PDO是基于PHP扩大框架完成的,它的源码在PHP源码目次的ext/pdo下再次夸大,PDO只是一个接口标准,它本身其实不完成任何的数据库功效,程序员必需利用一个详细数据库的"PDO驱动"来会见特定的数据库extension=php_pdo_mysql.dll复制代码<?php$dbhost="localhost";$dbname="company";$dbusr="root";$dbpwd="111";$dbhdl=NULL;$dbstm=NULL;$opt=array(PDO::MYSQL_ATTR_INIT_COMMAND=>SETNAMESutf8,);$dsn=mysql:host=.$dbhost.;port=3306;dbname=.$dbname;try{$dbhdl=newPDO($dsn,$dbusr,$dbpwd,$opt);//Displayexception$dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOExceptsddttrtion$e){//returnPDOExceptionprint"Error!:".$e->getMessage()."<br>";die();}$dbstm=$dbhdl->query(SELECT*fromp8_ad_userLIMIT0,1);$rows=$dbstm->fetchAll(PDO::FETCH_ASSOC);//$rows=$dbhdl->Fetch();print_r($rows);?>复制代码extension=php_pdo_pgsql.dll复制代码<?php$host="localhost";$user="root";$pass="111";$db="company";$cursor="cr_123456";try{$dbh=newPDO("pgsql:host=$host;port=5432;dbname=$db;user=$user;password=$pass");echo"Connected<p>";}catch(Exception$e){echo"Unabletoconnect:".$e->getMessage()."<p>";}$dbh->beginTransaction();$query="SELECT*fromp8_ad_userLIMIT0,1";$dbh->query($query);$query="FETCHALLIN"$cursor"";echo"begindata<p>";foreach($dbh->query($query)as$row){echo"$row$row$row<br>";}echo"enddata";?>复制代码这里只以Mysql、PostGreSQL为例,现实上,PDO这类笼统层体例能够会见今朝支流的年夜多半的数据库,而且PDO将成为PHP6的默许数据库毗连体例,更多概况请参阅http://www.php.net/manual/zh/book.pdo.php0x3:利用ODBC笼统层与数据库通讯ODBC是一种使用程序编程接口(ApplicationProgrammingInterface,API),使我们有才能毗连到某个数据源(好比一个MSAccess数据库)试图经由过程编程言语和数据库查询会见(SQL尺度化)来尺度化毗连办法,好比功效和设置。ODBC的感化是充任接口或毗连器,它具有两重计划方针:1.起首,关于ODBC体系,它充任的是编程言语体系2.其次,关于数据存储体系,它充任的是ODBC体系。所以,ODBC必要一个"对ODBC而言是编程言语"的驱动程序(比方PHP-ODBC库)和一个"对数据存储体系而言是ODBC"的驱动程序(好比MySQL-ODBC库)。除ODBC体系自己以外,ODBC还能够处置数据源的设置,同意数据源和编程言语之间存在含混性。和之前进修的扩大API接口、PDO略有分歧的是,利用ODBC毗连数据库要略微贫苦一点(最少我团体这么以为),这个"贫苦"表现在我们必要对方针数据库服务器的操纵体系举行一些设置,即创立ODBC数据源,然后才能够举行ODBC毗连创立抵达MSAccess数据的ODBC毗连的办法:复制代码1.在把持面板中翻开办理工具2.双击个中的数据源(ODBC)图标3.选择体系DSN选项卡4.点击体系DSN选项卡中的"增加"按钮5.选择MicrosoftAccessDriver。点击完成6.鄙人一个界面,点击“选择”来定位数据库7.为这个数据库取一个数据源名(DSN)8.点击断定复制代码code:复制代码<html><body><?php//毗连一个ODBC数据源,无帐号、暗码$conn=odbc_connect(northwind,,);if(!$conn){exit("ConnectionFailed:".$conn);}$sql="SELECT*FROMp8_ad_user";$rs=odbc_exec($conn,$sql);if(!$rs){exit("ErrorinSQL");}echo"<table><tr>";echo"<th>Companyname</th>";echo"<th>Contactname</th></tr>";while(odbc_fetch_row($rs)){$username=odbc_result($rs,"username");$password=odbc_result($rs,"password");echo"<tr><td>$username</td>";echo"<td>$password</td></tr>";}odbc_close($conn);echo"</table>";?></body></html>复制代码0x4:利用DBX与数据库通讯PHP自己内置了DBX函数,DBX模块是一个数据库笼统层(DBX中的"X"就暗示其所能撑持的X种数据库)。DBX函数同意你会见一切DBX撑持的数据库。DBX撑持以下数据库:1.Mysql2.ODBC3.PgSQL4.Mssql(MicrosoftSQLServer)5.Fbsqldownload:http://pecl.php.net/package/dbxhttp://rpmfind.net/linux/rpm2html/search.php?query=php-dbxcode:复制代码<html><head><title>APHP-DBXURLOrganizer</title><styletype=text/css>p,ul,td,h1,h2,h3{font-family:verdana,helvetica,sans-serif;}</style></head><body><?/******TABLEDEFINITIONFORTHISEXAMPLE:*createtableURLS(*urlVARCHAR(128)notnull,*descriptionTEXT,*primarykey(url));*****///define$MODULEasDBX_MYSQL,DBX_MSSQL,DBX_PGSQL,oryoursupporteddatabase$MODULE=DBX_PGSQL;$server="localhost";$user="root";$password="111";$database="company";/*FUNCTIONS*/functionget_urls($dbconn,$sql){$result=@dbx_query($dbconn,$sql);if($result==0){echodbx_error($dbconn);}else{return$result;}}functionurl($action,$dbconn,$url,$description){if($action=="add"){$sql="insertintoURLSvalues($url,$description)";}elseif($action=="delete"){$url=urldecode($url);$sql="deletefromURLSwhereURL=$url";}$result=@dbx_query($dbconn,$sql);if($result==0){echo"<P>ERRORADDINGURL:".dbx_error($dbconn);}else{print("<p>$action:$urlsucceeded!<p>");}}/***MAIN***/$dbconn=dbx_connect($MODULE,$server,$database,$user,$password)ordie("CANNOTCONNECTTODATABASE");?><h1>PHPDBXURLOrganizer</h1><formaction=dbx_urls.phpmethod=post><p><b>AddaURL:</b><br>URL:<inputtype="text"name="url"maxlength="128"value="http://">Description:<inputtype="text"name="description"><inputtype="submit"name="addurl"value="AddURL!"></form><?if(isset($addurl)){url("add",$dbconn,$url,$description);}if(isset($delete)){url("delete",$dbconn,$delete,"");}$sql="select*fromURLS";$result=get_urls($dbconn,$sql);if(sizeof($result->data)==0){?><h3>Sorry,therearenoURLsinthedatabase.Youshouldaddsome.<?}else{?><p><tableborder=1cellpadding=5cellspacing=0width=600><tr><td><b>URL</b></td><td><b>Description</b></td><td></td></tr><?for($i=0;$i<sizeof($result->data);$i++){?><tr><td><ahref=<?=$result->data[$i]?>><?=$result->data[$i]?></a></td><td><?=$result->data[$i]?></td><tdwidth=1><ahref=dbx_urls.php?delete=<?=urlencode($result->data[$i])?>>delete</a></tr><?}?></table><?}?></body></html>复制代码0x5:利用DBA(Database(dbm-style)AbstractionLayer)与数据库通讯PHP的DBA笼统层是用来撑持BerkeleyDB这类文件型数据库的。ThesefunctionsbuildthefoundationforaccessingBerkeleyDBstyledatabases.在柏克莱的BSD系列操纵体系中,有个复杂的数据库布局,它以数个文件构成超小型的数据库体系,架组成笼统层(abstractionlayer)的DBA数据库。今朝PHP撑持的DBA数据库包含复制代码1.DBM:柏克莱开展的最初期DBA数据库http://en.wikipedia.org/wiki/Dbm2.NDBM:较新且较有弹性的DBAhttp://en.wikipedia.org/wiki/NDBM3.GDBM:GNU开展的DBAftp://ftp.gnu.org/pub/gnu/gdbm/4.DB2:由Sleepycat软件开辟的DB2(非IBM的DB2)http://www.openldap.org/lists/openldap-software/199905/msg00009.html5.CDB:这是qmail作者开辟疾速牢靠的DBAhttp://pobox.com/~djb/cdb.html复制代码安装好DBA后,利用以下代码举行毗连复制代码<?php $id=dba_open("/tmp/test.db","n","db2"); if(!$id){echo"dba_openfailedn"; exit; } dba_replace("key","Thisisanexample!",$id); if(dba_exists("key",$id)){ echodba_fetch("key",$id); dba_delete("key",$id); } dba_close($id);?>复制代码3.跋文以上就是PHP毗连数据库的分歧体例的进修,经由过程本文的进修,我们懂得到一点今朝PHP开辟中支流利用的毗连数据库的手艺是1.Mysql扩大API2.Mysqli扩大API3.PDO笼统层下一步但愿做的事1.研讨一下PHP和mysql举行交互的协定驱动的底层道理2.实验编程复杂的通讯协定驱动学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。 本文当是我的笔记啦,遇到的问题随时填充 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
页:
[1]