仓酷云

标题: PHP编程:《PHP法式设计》 第五章 中场一:数据库... [打印本页]

作者: 柔情似水    时间: 2015-2-16 00:25
标题: PHP编程:《PHP法式设计》 第五章 中场一:数据库...
熟悉了PHP和MYSQL开发的要领之后,再回头看你写的那个留言本,你也许会怀疑那真的是你写的吗?当然,如果屋里还有鬼的话,也许是它写的-_-   


     第五章 中场一:数据库毗连
   
  前两章中集中引见了PHP言语,如今停上去入手下手创立一个使用法式。在本章中将创立一个毗连MySQL数据库的使用法式。
   
  在进修过后面两章以后,你一定已学会了如何处置PHP外部数据,和如何编写语句和函数。下一步从逻辑上讲,应当到了进修若何用SQL(布局化查询语句)处置PHP的内部数据的时分了。然而,在入手下手进修这局部内容前,让咱们临时中止根基道理的进修,轻松一下。
  让我带你一道探求PHP使用法式的开辟过程。从字面意义上讲,每个使用法式都应当是共同的,然而每个使用法式也都能在此前的任务基本上,即一系列通用功效的基本上构建。我建议将这两项手艺夹杂在一同。自觉地利用后人已编写好的功效,会褫夺在法式中到场新特征,还会禁止为进步函数的效力而去修正旧函数。从另外一方面讲,利用已有函数意味着能更快的开辟出使用法式。所以必需在这两个极端中掌控好本人,才干成为一个优异的法式设计员。
   
  注重:假如如今还对HTML不熟习,那末如今就是入手下手进修的工夫了。本书中假定你已熟习HTML了。假如还不熟习HTML表格和表单的话,很快就会被弄懵懂的。
   
  5.1 初步
  每当入手下手一个新项目时,我喜好从一个新的空目次入手下手。在这里,让咱们把这个目次称为phpbook/ch05。固然,这个目次必需在Web办事器的根目次下。假如你是依照第一章的指令装置PHP的话,那末,Web办事器的根目次就应当为/usr/local/apache/htdocs。接着,咱们将创立一个名为menu.php3的文件,个中包括有一个后台办理义务菜单,如清单5.1所示。
   
  清单5.1 menu.php3
  <?php require('common.inc'); ?>
  <?php affy_header('Administrative Menu') ?>
  <h1>Administrative Menu</h1>
  <ol>
  <li><a href="connect.php3">Creat Database
  Connection</a></li>
  </ol>
  <?php affy_footer() ?>
   
  在文件common.inc中包括对函数affy_header和affy_footer的界说。这些函数在本章中稍后还会呈现。
  5.2 创立毗连
  当点击Create Database Connect(创立数据库毗连)联接时,将会履行connect.php3文件,该文件将测验考试毗连在第二章进修中装置的MySQL数据库办事器。
  清单5.2 显示了connect.php3文件利用用户名codebits和暗码codebits测验考试停止数据库毗连,由于在装置MySQL时还没有创立该用户名,所以毗连一定掉败。但是掉败 -- 最最少在本例中 -- 倒是一件功德,由于咱们可以看看应当若何处置这个成绩。图5.1给出了毗连掉败后将会显示的毛病信息和表单。
   
  清单5.2 connect.php3
   
  Page 107 -108 清单 5.2
   
   
  Page 108 Figure 5.1
   
  图5.1 毗连掉败时的毛病信息显示
   
  当数据库毗连掉败时,法式会给出一个毛病信息提醒和一个表单,用户可以在外面输出root用户的暗码。就像在本章稍后讲的那样,有了root的暗码,就能够创立名为codebits的用户。如今先跳过有关$arr_request数组的局部。
  当函数mysql_connect被挪用且毗连掉败时,该函数凡是会显示以下信息:
   
  Warnint: MySQL connection Failed: Access denied
  for user: 'codebits@localhost' (Using password: YES)
   
  绝大多半使用法式需求准确的掌握显示的内容,特别是高度图形化的使用法式。在函数mysql_connect前加上(@)符号将会克制毛病信息的显示。
  注重表单语句的action属性指定点击submit按钮时,将会履行connect.php3文件。这是一个递归途序的例子,也就是说答应PHP文件挪用它本人。
  使用递归编程手艺,可以将有关统一个主题的一切代码编制在统一个文件中。至于甚么时分应当将函数组分解一个文件,或将法式分化成几个文件,这得凭经历。我的重要准绳是:当完成一个特定功效所编的法式代码超越100行以上时,就要创立一个自力的文件。
   
  5.3 获得HTML表单信息
  即便输出一个暗码并点击毗连数据库,毗连依然会掉败,缘由是connect.php3还没有利用表单中的输出值去创立数据库毗连。
  PHP引擎将每个表单域放到一个叫做$HTTP_POST_VARS的数组中。在上述给出的例子中,数组有两个元素:username和password。在此法式中可以经由过程$HTTP_POST_VARS['username']和$HTTP_POST_VARS['password']会见表单信息。
  利用$HTTP_POST_VARS['password']取得表单中的信息看起来对照复杂。然而仍有一些埋没的成绩。起首,要反省表单域的名字(本例中的password)是大写、小写、仍是巨细写都有。
  第二件成绩包括的内容与本例关系不大。除表双方法之外,还可使用URL来运转PHP剧本,例如:
   
  http://.../connect.php3?username=root&password=password
   
  可以看到,用户名和暗码经由过程URL停止传递,问号“?”标记着域信息的入手下手,“&”则是域的定界符。侥幸的是,PHP引擎也主动剖析URL行,并将了局存入$HTTP_GET_VARS数组中。
  成绩(假如你以为它是的话)在于,法式可以从不止一个中央取得信息 -- 数组$HTTP_GET_VARS和数组 $HTTP_POST_VARS。
  看待这些(或其它一些的)成绩,我的处理举措是创立一个名为$arr_request的数组,它从两个$HTTP数组中取得初始化的信息。在common.inc中可使用以下编码行对数组$arr_repuest停止数值初始化。
   
  // declare the request array which holds both
  // url-based (get) and form-based (post) parameters.
  $arr_request = array();
   
  // move the url and form parameters into the
  // request array. Form parameters supercede url
  // parameters. Additionally, all keys are vonverted
  // to lower-case.
  If (count($HTTP_GET-VARS)) {
  While (list($key, $value) = each ($HTTP_GET_VARS)) {
  $arr_request[strtolower($key)] = $value;
  }
  }
  if (count($HTTP_POST_VARS)) {
  while (list($key, $value) = each ($HTTP_POST_VARS)) {
  $arr_request[strtolower($key)] = $value;
  }
  }
   
  假如在一切的PHP剧本中都包括有common.inc文件的话,那末不必忧虑剧本是怎样运转的。一切传曩昔的信息都以小写模式保留在数组$arr_request中,这就意味着,可使用$arr_request['username']失掉用户名信息。
  PHP供应了数组$HTTP_GET_VARS和数组$HTTP_POST_VARS的替换体例,HTML表单和基于URL的信息都可以直接做为PHP变量停止会见。例如,在PHP 剧本中,一个界说为<input type = "input" name="last_name">的域信息可以直接在PHP法式顶用$last_name会见,一样的基于URL的信息,例如说,http://www.site.com?last_name=join,能由$last_name取得。不外,我仍是对照喜好利用数组$arr_request,由于关于要轮回利用传递给法式的一切信息来说,这长短常有效的。假如该信息是一个标量,那末它就不合适被轮回利用。例如:将一切参数名改成大写,以包管不致于由于利用换档键而损坏法式;或在毛病检测时,会需求显示一切的输出参数。
   
  注重:本节只对CGI(通用网关接口)协定作很复杂的引见,更具体的内容请参阅本书附录A,“因特网资本”中所列内容。
   
  5.4 利用HTML表单信息
  既然可以很轻易地从PHP剧本法式中存取表单信息,如今是使用这些信息毗连数据库的工夫了。第一步是反省毗连数据库的代码:
   
  $id_link = @mysql_connect('localhost', 'affy', 'affy');
   
  在这行代码中,用户名和暗码都是字符串数值。为了能使用表单中的信息,这行代码需求加以变化,用变量取代数值:
   
  $id_link = @mysql_connect(
  'localhost',
  $username,
  $password);
   
  既然用到了变量,那末必需对变量停止初始化。以下代码将履行这类初始化:
   
  if ( count($arr_request) ) {
  $username = $arr_request['username'];
  $password = $arr_request['password'];
  }
  else {
  $username = 'phpuser';
  $password = 'phpuser';
  }
   
  当表单信息可用时,函数count的了局将大于1,使得if语句履行真前提的子句,此子句顺次从$arr_request数组中掏出用户名和暗码信息。
  当没有表单信息存在时,用户名和暗码仍可以用字符串数值停止初始化。
  第三种能够性是一个表单有这两个域但没有表单信息。假如挪用connect.php3的表单没有username和password域,会产生甚么情形呢?假如如许,以上代码将掉败。经由过程直接反省表单字段,而不是只依附于$arr_request数组的元素数量可让这段代码的更健壮(即,能处置这类情况下的掉败)。例如:
   
  $username = $arr_request['username'];
  $password = $arr_request['password'];
   
  if (empty($username)) $username = 'phpuser';
  if (empty($password)) $password = 'phpuser';
   
  由于PHP对没有初始化的数组元素将前往空字符串,以上代码的顺应性将更强。利用标量比利用数组可使代码更轻易了解,而且在某些方面更无效率。假如这两个变量有一个为空时,这意味着表单没有供应任何值,将利用缺省值。
  清单5.3显示了有以上更改的connect.php3文件,可以在高低文看到这两个变更的描写。
   
  清单5.3 connect.php3修订版
   
  Page 112 - 113 清单 5.3
   
   
  当准确的root暗码如图5.2所示被输出到表单时,将会胜利地创立数据库毗连。
   
   
  Page 113, Figure 5.2
   
  图5.2 证明胜利地创立了数据库毗连
   
  5.5 common.inc文件
  清单5.4显示了本章需求的common.inc文件的版本。
   
  清单5.4 common.inc--多个使用法式利用的一套例程。
  <?php
  function affy_footer() {
  echo '</body></html>';
  }
   
  function affy_header($title) {
  echo '<html><head><title>';
  echo "$title";
  echo '</title></head><body>';
  }
   
  function affy_message($msg) {
  echo '<table>';
  echo '<tr><td>';
  echo "$msg";
  echo '</td></tr>';
  echo '</table>';
  }
  ?>
   
  5.6 总结
  本章引见了若何利用PHP毗连数据库,第一步创立了一个Web菜单页,用它可以运转毗连数据库的剧本,然后创立了可以毗连数据库的connect.php3文件。
  当connect.php3文件利用affy用户名妄图毗连数据库时掉败了,从而招致显示出了需求root用户暗码的表单。
  表单中的信息经由过程common.inc文件被放在$arr_request数组中。并修正了connect.php3文件,使其利用变量$arr_request中的用户名和暗码来毗连数据库。
   
   
  
培训的第三阶段,开始接触MYSQL,设计数据库,学习PHP如何去连接MYSQL数据库。对于MYSQL,我并不陌生,因为学校开设了Linux系统的课程,对于数据库的操作。
作者: 只想知道    时间: 2015-2-16 01:55
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者: 老尸    时间: 2015-3-4 22:17
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 深爱那片海    时间: 2015-3-7 10:37
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者: 因胸联盟    时间: 2015-3-14 23:57
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 乐观    时间: 2015-3-16 21:45
本文当是我的笔记啦,遇到的问题随时填充
作者: 兰色精灵    时间: 2015-3-23 03:45
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 爱飞    时间: 2015-3-25 03:46
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 海妖    时间: 2015-4-1 12:10
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 金色的骷髅    时间: 2015-4-9 13:00
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者: 柔情似水    时间: 2015-4-16 10:10
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 灵魂腐蚀    时间: 2015-4-21 07:11
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 小女巫    时间: 2015-4-21 19:12
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 第二个灵魂    时间: 2015-4-28 22:27
做为1门年轻的语言,php一直很努力。
作者: 若天明    时间: 2015-5-8 16:42
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 仓酷云    时间: 2015-6-5 19:37
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 小妖女    时间: 2015-6-25 20:33
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 飘灵儿    时间: 2015-7-4 15:31
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者: 透明    时间: 2015-7-7 13:29
兴趣是最好的老师,百度是最好的词典。
作者: 若相依    时间: 2015-7-10 20:58
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: admin    时间: 2015-7-12 21:01
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2