|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我先解释一下我的学习思路。教程|数据|数据库|数据库毗连 中场一:数据库毗连
前两章中集中引见了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中的用户名和暗码来毗连数据库。
开发相册系统过程中就有过这样的问题,因为没有交流好,出现重复工作问题,因为文档没有详细的说明而经常临时问对方。 |
|