小魔女 发表于 2015-2-4 00:18:33

PHP教程之PHPLIB和多个数据库毗连(转)

应该大致熟悉了一些学习过程,也许我的过程和你的有些出路,但是不管怎么样是殊途同归,我写这么多,也只是给大家一个借鉴的机会,至于好与不好,默默不敢打包票^0^数据|数据库|数据库毗连   你能够有一个站点,有些页面要处置数据库。你能够想利用PHPLIB,然而不想为了顺应它而改动现存的数据库。这儿给出完成你的妄想的谜底。PHPLIB和多个数据库。

  完成它需求对PHPLIB停止扩大。本文注释了若何创立扩大。你会发明,这篇文章会匡助你在其它方面临PHPLIB停止扩大。浏览完这篇文章后,思虑一下PHPLIB可以完成你想要的98%的情形吧。

  这篇文章所说起的PHPLIB的扩大的建议已提交给了PHPLIB的开辟组。因而,在将来的版本中,能够会呈现这些扩大。在你的网页中的其它的代码将匡助你组织你的数据库办理。

数据库办理

  你可以将每个表放在一个伟大的数据库中。但是,总有一天会刺伤你。对数据库停止办理将会使创伤减小到最小。当你的数据库对一个办事器来讲太大时会呈现甚么情形?当一个办事器不克不及处置IO吞吐量或没有足够的内存停止处置又会怎样?将现有的数据库停止拆分很难,然而从分别的数据库入手下手则轻易多了,而且好的数据库办理会很有匡助。

  假如你运营一家信店,你能够有作者列表,带有价钱的书目列表,以后库存列表和定单列表。跟着你的营业的开展,定单列表会增添,而且每个定单会占用良多的磁盘空间。一种能够性就是有一天你会将定单直接放进财政体系。
  如今入手下手将定单放在分别的数据库中。由于库存的数目是跟着定单而变更的,所以将库存数据放在统一个数据库中。

  作者列表和书目列表为一些静态信息,它们会常常被读到,然而很少改动。实践上,独一的改动能够就是关于作者纪录会每5年一次,这多是当这个作者写了一本旧书(或灭亡了)。这些数据能够利用与定单数据库完整分歧的设置装备摆设。


包括PHPLIB

  PHPLIB经由过程一个名为DB_Sql的类来操作SQL数据库。在你的代码中包括合适你的数据库的版本。在这个例子中,我利用MySQL版本。


  为了在你的代码中失掉DB_Sql,在PHPLIB请求的目次下装置PHPLIB文件。然后,找到你的cgi-bin目次,然后在cgi-bin目次下创立phplib目次。接着,拷贝一切的PHPLIB中的.inc文件到phplib目次下。最初,将phplib目次放在php.ini文件中include_path = 的那行上。

  include_path是PHP援用在include()或require()中文件名的中央。在我的NT任务站上,包括途径是

include_path = ".;i:/project52/includes;i:/project52/phplib";

  在Linux机械上,则为

include_path = ".;/home/httpd/includes;/home/httpd/phplib";


  在每个PHP页面的顶端为


<?php

require(common.php3);


?>

  common.php3在包括目次中,包括对每页都通用的一切的数据和函数。在common.php3中,为


<?php

require(db_mysql.inc);
require(ct_sql.inc);
require(session.inc);
require(auth.inc);
require(perm.inc);
require(user.inc);
require(page.inc);


?>


  浏览PHPLIB文档(http://phplib.netuse.de),也能够在...c文件,涵盖了MS SQL,Oracle,Sybase和其它一些数据库。

  请注重,在这个例子中,require()和include()是完整一样的。Require()和include()任务体例分歧,当用在代码两头或在if()语句中时,了局是纷歧样的。

扩大PHPLIB

  PHPLIB处置数据库是经由过程从DB_Sql类创立的一个对象完成的。Db_mysql.inc包括了DB_Sql类,为MySQL 停止了修正。咱们将经由过程向common.php3添加代码来扩大DB_Sql,在包括db_mysql.inc的行的前面。

  DB_Sql包括了良多停止查询的函数。咱们想改动的一个是:

<?php



/* public: 毗连办理 */

function connect($Database = "", $Host = "", $User = "", $Password = "") {

/* 缺省处置 */

if ("" == $Database)

$Database = $this->Database;

if ("" == $Host)

$Host = $this->Host;

if ("" == $User)

$User = $this->User;

if ("" == $Password)

$Password = $this->Password;



/* 创立毗连,选择数据库 */



if ( 0 == $this->Link_ID ) {

$this->Link_ID=mysql_pconnect($Host, $User, $Password);

if (!$this->Link_ID) {

$this->halt("pconnect($Host, $User, $Password) failed.");

return 0;

}



if (!@mysql_select_db($Database,$this->Link_ID)) {

$this->halt("cannot use database ".$this->Database);

return 0;

}

}



return $this->Link_ID;

}



?>



  在你的db_mysql.inc中找到connnect()函数(或针对你的数据库的.inc文件),然后将其拷贝到common.php3中,在db_mysql.inc包括以后的某个中央。你应当将其封装在类的界说中,并依照本文最初所描写的那样。



  我发明那段代码很难读懂。因而,要做的第一件事就是让拷贝的代码可读:



<?php



/* public: 毗连办理 */



function connect($Database = "", $Host = "", $User = "", $Password = "") {

/* 缺省处置 */

if ("" == $Database) {

$Database = $this->Database;

}

if ("" == $Host) {

$Host = $this->Host;

}

if ("" == $User) {

$User = $this->User;

}

if ("" == $Password) {

$Password = $this->Password;

}

/* 创立毗连选择数据库 */

if ( 0 == $this->Link_ID ) {

$this->Link_ID=mysql_pconnect($Host, $User, $Password);

if (!$this->Link_ID) {

$this->halt("pconnect($Host, $User, $Password) failed.");

return 0;

}

if (!@mysql_select_db($Database,$this->Link_ID)) {

$this->halt("cannot use database ".$this->Database);

return 0;

}

}

return $this->Link_ID;

}



?>



  我将代码停止缩近分列,如许关于包含起来的代码,条理关系可让我对括号(译注:指大括号)停止婚配。如许做可以免象由于丧失括号而引发的毛病。关于独自的行我也增添了括号。PHP答应你当if语句后只要单一代码行时不利用括号。一旦你添加了额定的代码,这个简写就掉败了。我建议老是加上括号,以避免在前面增添代码时呈现毛病。



  如今,该修正connect代码了。注重connect()代码是若何检测一个毗连的存在,而且当毗连不存在时是若何创立毗连的。这个connect()函数在每个数据库查询之前被挪用。不幸的是,当创立毗连时它只选择一次数据库。假如PHP页面利用一个以上的数据库,connect()代码将不会看到数据库的变更。



  有几种体例可以修正代码。咱们正在寻觅对PHPLIB影响最小的修正办法,而且可以在咱们需求诊断一个 成绩时,可让咱们显示举动数据库的形态。需求超越PHPLIB的两个变量是毗连id和数据库称号。因而,使这两个变量对PHPLIB内部可见。在common.php3:



<?php



$db_connection = 0; // 通俗数据库毗连id

$db_database = ""; // 以后数据库名字



?>



  接着,咱们修正PHPLIB来保留毗连id和数据库名字在这些字段中。你的其它的代码可以设置和利用统一字段。假如你需求在诊断成绩时晓得哪个数据库正在利用,在你的页面中拔出这些代码:



<?php



Print("<p>db_database: " . $db_database . "</p>");



?>



  (有一些更简约的办法来书写打印语句。这个办法可以在黑色代码编纂器中加亮变量名。这个办法关于数组和其它复合变量名任务也很不乱。)



  咱们若何让connect()来利用新的变量呢?咱们可在项部到场额定的行,所以你可以:



<?php



{

globals $db_connect, $db_database;

/* 缺省处置 */



?>



  这行使咱们的内部变量在connect()中无效。

  上面是更传统些的办法。在$db_database前面直接到场:



<?php



function db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {

globals $db_connect;

if(!empty($db_connect_host)) {

$db_connect = mysql_pconnect($db_connect_host,

$db_connect_user, $db_connect_pass);

}

return($db_connect);

}



function db_database($db_database_new="") {

globals $db_database;

if(!empty($db_database_new)) {

$db_database = @mysql_select_db($db_database_new, db_connect());

}

return($db_database);

}



?>



  经由过程界说这些通用函数一次,你可以在各类中央失掉通用变量,不需求在一切中央增添全局行。这儿就是利用了咱们的db函数的通用函数:



<?php



function connect($Database = "", $Host = "", $User = "", $Password = "") {

/* 缺省处置 */

if ("" == $Database) {

$Database = $this->Database;

}

if ("" == $Host) {

$Host = $this->Host;

}

if ("" == $User) {

$User = $this->User;

}

if ("" == $Password) {

$Password = $this->Password;

}

/* 创立毗连,选择数据库 */

if ( 0 == db_connect()) {

$this->Link_ID = db_connect($Host, $User, $Password);

if (!$this->Link_ID) {

$this->halt("pconnect($Host, $User, $Password) failed.");

return 0;

}

}

if (0 != db_connect()) {

if($Database != db_database()) {

$this->Database = db_database($Database))

if(empty($this->Database)) {

$this->halt("cannot use database " . $this->Database);

return 0;

}

}

}

return $this->Link_ID;

}



?>



  请注重这些小中央的修正:



  关于数据库的测试是在毗连测试以外的,以便connect()可以检测一个新的数据库,乃至当已存在一个以后毗连的时分。这就是说,咱们将db_connect()同0停止对照两次。如许的了局值得做一些小修改。



  咱们将数据库的毗连与数据库的选择放在PHPLIB以外,如许在代码中需求停止数据库选择的中央咱们可使用不异的函数。



  在这类情形下只要一个欠好的中央:咱们假定不异的主机,用户和口令,用于一切的数据库操作。假如你利用一个用户登录,利用出格的权限处置指定的数据库,你将不能不为这类处置创立一个出格的毗连。怎样办呢?界说变量:



<?php



$db_host = "";

$db_user = "";

$db_pass = "";



?>



  扩大db_database()函数,对照以后用户和主机名同特别的用户和主机。你也能够到场:



<?php



$db_type = "";



?>



  然后用它来保留数据库的类型,MySQL,Oracle,等等,如许你就能够处置多个数据库。



  修正代码以即可以处置多个数据库要庞杂一点。你需求修正查询函数,还包含毗连与选择函数。你或许想浏览一下关于PHP的ODBC体例的毗连,在PHPLIB中利用ODBC选项。ODBC可以以一种通用的办法处置良多的数据库,但能够有些慢。ODBC可以答应你利用不异的代码在多个类型的数据库上。假如你的确利用了多个数据库类型,能够会碰到对数据格局的请求分歧的成绩和分歧数据库之间的差别的成绩。ODBC简化了毗连,然而没有完美数据库注释数据和SQL的办法。



  如今入手下手关于派生对象类的冗长教授教养。connect()函数被封装在类的界说中:



<?php



class DB_Sql {



}



?>



  当咱们拷贝这个函数到common.php3中时,咱们需求派生DB_Sql类。咱们经由过程封装connect()来完成:



<?php



class db_DB_Sql extends DB_Sql {



}



?>



  可以查阅PHP的文档关于对象和类的内容,看一下"extends"做了些甚么。用起码的话来讲就是:在派生中界说的每一个器材交换或掩盖了原始界说的器材。



  如今可使用db_DB_Sql了。当你装置好PHPLIB时,你会有一条语句,写为:



<?php



$x = new DB_Sql;



?>



  将其改成:



<?php



$x = new db_DB_Sql;



?>



  如许就会利用修正后的类,取代了原始的类。



  你如今已成了一个对象,类,OOP的专家了,可以请求每一年薪水为,100了。(老外胆量够大)



  咱们做了一个无效的修正,并且对PHPLIB代码的影响最小。纪录下修正的陈迹,如许你可以将其重用于PHPLIB的新版本中。假如在数据库处置中呈现毛病,你可以在内部的函数中拔出print语句,看一看在毗连时产生了甚么。如今你可以做更多的工作了,而没有修正PHPLIB代码。



  假如SQL看上去掉败了,你可以将qurey()函数从db_mysql.inc中的DB_Sql中拷贝到common.PHP3中的db_DB_Sql中去,然后拔出print语句,检查SQL的利用情形。



  PHPLIB会纪录cookie。在PHPLIB两头的一条print语句能够会发生毛病动静,是关于输入HTTP头信息的成绩。可以疏忽毛病,或将诊断信息写到一个磁盘文件中去。



  入手下手为:



$db_log_file = "t:/diag.txt";



  或类似的语句,用来指向一个在磁盘某个中央的文件。在Windows下,要确信利用了一个存在的目次,不然你会失掉一个奇异的毛病。



  如今界说:



<?php



function db_log($db_log_message) {

globals $db_log_file;

$db_log_f = fopen($db_log_file, "a");

fwrite($db_log_f, date("Y m d H:i:s")." ".$db_log_message."\r\n");

fclose($db_log_f);

}



?>



  任什么时候候你需求检查产生了甚么,象如许到场日记信息:



<?php



db_log("current database: " . db_database());



?>

  你可使用一些内建的日记手艺和体系日记。利用体系日记时,能够由于没有处置准确的目次,从而能够要搜刮大批的文件,却只为一点点信息。这类分别的日记可以在测试过程当中向你供应一些掌握。我建议在操作前后到场日记,象:



<?php



db_log("current database: " . db_database());

db_database(\"bookcatalogue");

db_log("current database: " . db_database());



?>



  记住在你的数据库处置中利用准确的数据库,如许你就不必查询PHPLIB数据库了。你能够喜好为数据库函数函数创立一个封装函数,或修正你利用的函数。假如你利用mysql_query(),你可以起首利用db_database()。你也能够交换:



<?php



db_database("bookcatalogue");

$result = mysql_query("select * from?", db_connect());



?>



  成



<?php



$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",

db_connect());



?>



  建议做成函数:



<?php



function db_query($db_query_database, $db_query_sql) {

return(mysql_db_query(db_database($db_query_database), $db_query_sql,

db_connect());

}



?>



  如今你可以完成

利用PHPLIB(和任何类似的软件)处置多个数据库

扩大类/对象

拔出诊断反省

将日记信息写入文件中

  以相反的次第理论它们。在日记文件可任务后,然后是诊断反省,然后是对类的扩大,然后是多个数据库。掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。

飘灵儿 发表于 2015-2-4 11:15:23

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

不帅 发表于 2015-2-9 15:50:24

我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。

蒙在股里 发表于 2015-2-11 20:08:17

有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。

再见西城 发表于 2015-2-25 12:57:58

我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:

金色的骷髅 发表于 2015-3-6 21:35:25

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

仓酷云 发表于 2015-3-7 03:43:00

开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。

冷月葬花魂 发表于 2015-3-10 13:05:47

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

老尸 发表于 2015-3-12 11:08:39

当然这种网站的会员费就几十块钱。

海妖 发表于 2015-3-19 20:52:38

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

若天明 发表于 2015-3-22 20:38:05

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

愤怒的大鸟 发表于 2015-4-1 10:30:34

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

活着的死人 发表于 2015-4-3 21:54:46

多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。

小女巫 发表于 2015-4-4 17:00:22

学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql

透明 发表于 2015-4-11 08:27:18

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

再现理想 发表于 2015-4-16 22:11:57

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

admin 发表于 2015-5-5 06:48:53

首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。

灵魂腐蚀 发表于 2015-6-4 20:17:41

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

精灵巫婆 发表于 2015-6-12 01:33:58

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

深爱那片海 发表于 2015-6-25 21:42:02

本文当是我的笔记啦,遇到的问题随时填充
页: [1]
查看完整版本: PHP教程之PHPLIB和多个数据库毗连(转)