玩技术,Geeker
一个原创技术文章分享网站

PHP处理HTML表单

前言

这不学习PHP么?网上找了本电子书看着,《PHP与MySQL程序设计(第四版)》,以前也心血来潮买过一本,几经搬家,也不知道丢哪里去了。哪里知道今天还要学习PHP啊,真乃三十年河东,三十年河西啊。好了,《PHP与MySQL程序设计(第四版)》书不错,很基础,对我这种对于PHP和Web开发是小白的选手来说,足够了,就从这本书开始,除去PHP的基础语法部分,就一章章学习,一行行代码实践,一篇篇总结吧。

PHP和Web表单

对于Web开发,真的是我的处女地啊,什么也不懂,不会,完全的空白。大学学习时,写过JSP,也写过几行HTML,也还算知道表单这个东西。

表单可以用来收集用户的输入信息,将输入信息传递到服务器,服务器对用户的这些信息进行处理。服务器对这些数据如何处理,使用哪个脚本文件进行处理呢?下面就通过一个简单的HTML表单程序来说明这些问题。

一个简单的HTML表单

比如有以下HTML代码:

<html>
    <body>
        <form action="register.php" method="post">
            Name:<input type="text" name="name" />
            E-Mail:<input type="text" name="email" />
            <input type="submit" />
        </form>
    </body>
</html>

然后又有对应的register.php文件如下:

<html>
    <body>
        Welcome 
        <?php
            if (isset($_POST["name"]))
            {
                echo $_POST["name"]; 
            }
        ?> <br />

        Your email address is: 
        <?php
            if (isset($_POST["email"]))
            {
                echo $_POST["email"]; 
            } 
        ?><br />
    </body>
</html>

现在再来说说上面的代码,显示使用HTML定义了表单,并指定了以post的方式提交该表单到服务器,同时还指定了服务器使用register.php脚本文件来出来该表单提交的内容。

register.php脚本文件中,对用户提交的处理进行简单的获取与输出,使用了超全局变量$_POST。提交表单的方式有GET和POST两种方式,这两种方式都创建数组(例如,array(key => value, key2 => value2, key3 => value3, …))。该数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。GET和POST操作提交的数据分别被对应到PHP中的超全局变量$_GET数组和$_POST数组中。它们是超全局变量,这意味着对它们的访问无需考虑作用域,不需要任何特殊代码,我们就能够从任何函数、类或文件访问它们。

$_GET是通过URL参数传递到当前脚本的变量数组;而$_POST 是通过HTTP POST传递到当前脚本的变量数组。关于HTTP中GET和POST,这又是一堆复杂的的东西,在我的另一篇博文《详解HTTP中GET和POST的区别》中,我进行了详细的分析与描述。

可以看到,在register.php中,我只是对用户提交的数据进行了简单的输出,而并没有进行复杂的处理,比如用户提交的用户名符不符合规范啊?用户输入的邮件格式是否正确啊?等等问题,这就涉及到验证表单的问题。

验证表单

其实很多时候,我们在注册一个网站的会员的时候,输入了不合法的E-Mail地址以后,都会立刻有一个提示标记,而这些都是在客户端使用了JS进行了一篇简单的校验。对于我们来说,客户端的任何校验都是不可信的校验,在客户端校验,只是减少了用户出错的可能;对于提交到服务器的数据,我们必须要进行二次校验,这样才能放心的对数据进行处理。

对于有一些“调皮的用户”,就喜欢寻找你代码的bug,给你来一个SQL注入啊,或者跨站点脚本攻击什么的。遇到这些,就有些麻烦了,如果有这些麻烦,说明你的代码有问题,你需要去解决这些问题。

对于这些防范工作,你可能觉的很难去做到,但是对于PHP来说,它都想到了(PHP就是功能多,就是这么倔强)。在处理用户的提交数据时,只需要将用户输入的数据在以下的4个函数中走一遍,就可以防范那些简单的,邪恶的攻击了。这4个标准函数如下:

  • escapeshellarg()
  • escapeshellcmd()
  • htmlentities()
  • strip_tags()

对于escapeshellargescapeshellcmd,实际用的比较少,这不做总结,请自行查阅文档。而htmlentitiesstrip_tags基本上是必用的,比如现在基于上面的代码进行测试:

在name输入栏中输入:<b>http://www.jellythink.com</b>,我们期望能输出<b>http://www.jellythink.com</b>,而实际上只是输出了粗体的http://www.jellythink.com了。很明显这不是我们所期望的。很有可能,有的用户故意输入一些代码,在你的网页上捣乱,怎么办?这个时候,我们可以使用htmlentities函数对用户提交数据中含有的一些在HTML中有特殊含义的字符转换为浏览器可以表现的字符串,而不是当做HTML来被浏览器所解释。好了,我们将PHP代码修改为以下这样,就不会有问题了:

<?php
    if (isset($_POST["name"]))
    {
        echo htmlentities($_POST["name"]); 
    }
?> <br />

当然了,我们也可以使用strip_tags函数来剔除用户提交数据中的所有HTML标签了,具体请自行测试。

在实际项目中,得到用户提交的数据以后,我们处理的步骤一般如下:

  1. 使用trim()函数,去掉多余的空白字符;
  2. 使用htmlentities()或者strip_tags()函数处理;
  3. 接下来,进行自定义的处理…

上面说了那么多了,都是安全防范方面的,比如现在要求用户输入一个E-Mail地址,用户没有输入SQL注入啊,跨站点脚本什么的。那么我在服务器端又如何判断用户输入的内容到底符不符合一个邮箱的规则呢?

使用Filter扩展测试数据

上面说到如何判断用户输入的内容到底符不符合邮箱规则呢。很多时候,我们去判断用户输入的内容是否符合一定的规则,都是使用的正则匹配去确定的,先不说正则匹配书写起来有多麻烦,就是写对了,满足所有条件都难。还好,万能的PHP支持各种扩展,我们可以使用PHP的Filter扩展来完成一些已经定义好的校验。比如以下代码:

<?php
    if (isset($_POST["email"]))
    {
        $email = $_POST["email"];
        if (!filter_var($email, FILTER_VALIDATE_EMAIL))
        {
            echo "Invalidate E-Mail";
        }
    } 
?>

我们可以就这样简单的完成对邮箱格式的验证,再也不用去写那些麻烦的正则表达式了。

上面只是对Filter的一个简单的例子,而Filter的功能远不止于此,比如完成URL的验证等等,其余的功能,就等你去发现和实践了。

处理多值表单

我们都知道,在HTML中,是存在多选的,比如以下HTML代码:

<html>
<body>
    <form action="register.php" method="post">
        Language:
        <select name="languages[]" multiple="multiple">
            <option value="CSharp">C#</option>
            <option value="JavaScript">JavaScript</option>
            <option value="Cpp">C++</option>
            <option value="PHP">PHP</option>
        </select>
        <input type="submit" />
    </form>
</body>
</html>

那么PHP是如何接收处理呢?PHP是这样干的:

<?php
    if (isset($_POST["languages"]))
    {
        foreach ($_POST["languages"] as $key => $value)
        {
            $language = htmlentities($value);
            echo "$key => $language<br/>";
        }
    }
?>

总结

好了,关于PHP处理HTML表单的问题,我想应该总结清楚了,使用PHP处理表单的时候,更多的时候,是需要注意安全方面的问题。寥寥几百字,总结的够了。

2014年12月24日 于深圳。

打赏

未经允许不得转载:果冻想 » PHP处理HTML表单

分享到:更多 ()

评论 5

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #3

    果冻,向你问俩问题。
    1.你这个代码高亮的插件是什么呀?
    2.这个章节的这个框是主题带的还是怎么加的,这么好看。

    阿举2年前 (2016-01-07)回复
    • 恩,好的。
      >1.你这个代码高亮的插件是什么呀?
      这个代码高亮是主题自带的,以前我用过可以实现同样效果的代码高亮插件:hightlight.js。可以百度一下hightlight.js。

      >2.这个章节的这个框是主题带的还是怎么加的,这么好看。
      这个是我在主题的基础上进行定制的,改动主题CSS即可。

      希望我的回答对你有帮助。

      果冻想2年前 (2016-01-07)回复
  2. #2

    我想问下。。为什么我在网页上输入了名字和邮箱点击提交后,显示的是我写的php代码,而不是显示我的名字是什么。。之类的。我用的Wamp,环境搭好了应该没问题。

    小小小蘑菇2年前 (2016-01-23)回复
  3. #1

    谢谢果冻。。我已经解决了。。双击htm文件不行,得在地址栏输入地址就可以解析php了,这样子就不会是php代码。

    小小小蘑菇2年前 (2016-01-23)回复
    • 说实话,我没看懂你的问题。

      果冻想2年前 (2016-01-23)回复

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻