使用 PHP 创建数据库驱动的应用程序

第 3 课:创建新的应用程序用户

此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0

在本课中,将使用“创建新的许愿者”功能扩展应用程序。

该实现将影响 index.php 文件,并将创建名为 createNewWisher.phpeditWishList.php 的两个新文件。

“创建新的许愿者”用例包含三个步骤:

1. 用户打开主页 index.php,然后单击链接进行注册

2. 用户切换到 createNewWisher.php 页以创建新的许愿者

3. 在创建新的许愿者后,用户将切换到 editWishList.php,以便在其中为该用户创建愿望列表。

突出显示在第 3 课创建的新文件的页面流程图

当前文档是“在适用于 PHP 的 NetBeans IDE 中创建数据库应用程序”教程的一部分。


来自上一课的应用程序源代码

MySQL 用户:单击此处以下载源代码,该代码反映了在完成上一课之后的项目状态。

Oracle 数据库用户:单击此处以下载源代码,该代码反映了在完成上一课之后的项目状态。

添加链接以开始创建新的许愿者

打开 index.php。在结束 </form> 标记下面添加一个空行。在该空行中,输入以下代码块:
 <br>Still don't have a wish list?! <a href="createNewWisher.php">Create now</a>

其中,

  • Still don't have a wish list?! 是在页面上的链接旁边显示的文本。
  • <a href="createNewWisher.php"></a> 是实现打开 createNewWisher.php 页的链接的代码。
  • Create now 是作为链接显示的文本。

创建新 PHP Web 页

在项目的 "Source Files"(源文件)中创建两个新的 PHP Web 页,如第 2 课所述

  • createNewWisher.php
  • editWishList.php

editWishList.php 中,将文本 "Hello!" 添加到 HTML 主体中,否则应将其与默认内容保存在一起。将在后面的课程中修改该文件,但需要该文件现在存在,因为 createNewWisher.php 引用该文件。在本课的其余部分,将修改 createNewWisher.php

添加 HTML 窗体以输入新的许愿者数据

createNewWisher.php 的 PHP 块下面键入或粘贴以下 HTML 块:

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
Welcome!<br>
<form action="createNewWisher.php" method="POST">
Your name: <input type="text" name="user"/><br/>
Password: <input type="password" name="password"/><br/>
Please confirm your password: <input type="password" name="password2"/><br/>
<input type="submit" value="Register"/>
</form>
</body> </html>

注:password 类型是一种特殊的文本字段类型,其中将字符替换为星号。该代码显示一个 HTML 窗体,以使用户在文本字段中输入新许愿者的名字和口令。在用户单击 "Register" 按钮时,输入的数据将传输到相同页 (createNewWisher.php) 进行验证。

注:您可以忽略来自 HTML 验证器的警告。

验证数据并将其添加到数据库中

在此部分,您要将 PHP 代码添加到 createNewWisher.php 中。将该代码添加到文件顶部的 PHP 块中。PHP 块必须在所有 HTML 代码上面,是空行或是空白内容。要使重定向语句正常工作,PHP 代码块位置是非常重要的。在 PHP 块中,按编写顺序键入或粘贴本节下面介绍的代码块。

添加以下代码以验证数据:

  1. 初始化变量。前几个变量用于传送数据库凭证,其他变量在 PHP 操作中使用。
    /** database connection credentials */
    $dbHost="localhost"; //on MySql $dbXeHost="localhost/XE";
    $dbUsername="phpuser";
    $dbPassword="phpuserpw"; /** other variables */ $userNameIsUnique = true; $passwordIsValid = true; $userIsEmpty = false; $passwordIsEmpty = false; $password2IsEmpty = false;
  2. 在这些变量下面,添加一个 if 子句。if 子句的参数检查是否通过 POST 方法从自身请求页面。如果不是,将不执行进一步验证,并且页面显示上述空字段。
    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
    }
  3. if 子句的花括号中,添加另一个 if 子句,用于检查用户是否填写了许愿者的名字。如果文本字段 "user" 为空,则将 $userIsEmpty 值更改为 true。
    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
    /** Check whether the user has filled in the wisher's name in the text field "user" */    
        if ($_POST["user"]=="") {
        $userIsEmpty = true;
        }
    }
  4. 添加代码以建立数据库连接。如果无法建立连接,则将 MySQL 或 Oracle OCI8 错误发送到输出。

    对于 MySQL 数据库:

    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
    /** Check whether the user has filled in the wisher's name in the text field "user" */    
        if ($_POST["user"]=="") {
            $userIsEmpty = true;
        }
    
        /** Create database connection */
    $con = mysqli_connect($dbHost, $dbUsername, $dbPassword);
    if (!$con) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    //set the default client character set
    mysqli_set_charset($con, 'utf-8');
    }

    对于 Oracle 数据库:

    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER['REQUEST_METHOD'] == "POST") {
    
    /** Check whether the user has filled in the wisher's name in the text field "user" */
        if ($_POST['user'] == "") {
            $userIsEmpty = true;
        }
    
        /** Create database connection */
    $con = oci_connect($dbUsername, $dbPassword, $dbXeHost, "AL32UTF8"); if (!$con) { $m = oci_error(); exit('Connect Error' . $m['message']); } }
  5. 添加代码以检查名字与 "user" 字段匹配的用户是否已存在。该代码的工作方式是,尝试查找名字与 "user" 字段中的名字匹配的许愿者 ID 号。如果此类 ID 号存在,则将 $userNameIsUnique 的值更改为 "false"。

    对于 MySQL 数据库:

    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
    /** Check whether the user has filled in the wisher's name in the text field "user" */
    
        if ($_POST["user"]=="") {
            $userIsEmpty = true;
        }
    /** Create database connection */
    $con = mysqli_connect($dbHost, $dbUsername, $dbPassword);
    if (!$con) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    /**set the default client character set */
    mysqli_set_charset($con, 'utf-8');
    /** Check whether a user whose name matches the "user" field already exists */
    mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, $_POST["user"]);
    $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='".$user."'");
    $wisherIDnum=mysqli_num_rows($wisher);
    if ($wisherIDnum) {
    $userNameIsUnique = false;
    }
    }

    对于 Oracle 数据库:

    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER['REQUEST_METHOD'] == "POST") {
    /** Check whether the user has filled in the wisher's name in the text field "user" */
        if ($_POST['user'] == "") {
            $userIsEmpty = true;
        }
        /** Create database connection */
    $con = oci_connect($dbUsername, $dbPassword, $dbXeHost, "AL32UTF8"); if (!$con) { $m = oci_error(); exit('Connection Error ' . $m['message']); } /** Check whether a user whose name matches the "user" field already exists */ $query = "SELECT id FROM wishers WHERE name = :user_bv"; $stid = oci_parse($con, $query); $user = $_POST['user']; $wisherID = null; oci_bind_by_name($stid, ':user_bv', $user); oci_execute($stid); // Each user name should be unique. Check if the submitted user already exists. $row = oci_fetch_array($stid, OCI_ASSOC); if ($row){ $userNameIsUnique = false; } }
  6. 在检查用户是否唯一的代码后面,添加一系列 if 子句,以便检查用户是否正确输入并确认了口令。该代码检查窗体中的 Password ("password") 和 Confirm Password ('password2) 字段是否不为空以及是否相同。如果为空或不相同,则会更改相应的布尔型变量的值。
    if ($_POST["password"]=="") {
    $passwordIsEmpty = true; }
    if ($_POST["password2"]=="") {
    $password2IsEmpty = true; }
    if ($_POST["password"]!=$_POST["password2"]) {
    $passwordIsValid = false; }
  7. 通过添加在 "wishers" 数据库中插入新条目的代码,完成 if ($_SERVER['REQUEST_METHOD'] == "POST") 子句。该代码检查是否唯一地指定了许愿者名字,以及是否有效地输入并确认了口令。如果符合这些条件,该代码将从 HTML 窗体中提取 "user" 和 "password" 值,然后将其分别插入到 wishers 数据库新行中的 Name 和 Password 列。在创建该行后,该代码将关闭数据库连接并将应用程序重定向到 editWishList.php 页。

    对于 MySQL 数据库:

    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER['REQUEST_METHOD'] == "POST") {
        /** Check whether the user has filled in the wisher's name in the text field "user" */
        if ($_POST['user'] == "") {
            $userIsEmpty = true;
        }
    
        /** Create database connection */
        $con = mysqli_connect($dbHost, $dbUsername, $dbPassword);
        if (!$con) {
            exit('Connect Error (' . mysqli_connect_errno() . ') '
                    . mysqli_connect_error());
        }
        //set the default client character set 
        mysqli_set_charset($con, 'utf-8');
    
        /** Check whether a user whose name matches the "user" field already exists */
        mysqli_select_db($con, "wishlist");
        $user = mysqli_real_escape_string($con, $_POST['user']);
        $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='".$user."'");
        $wisherIDnum=mysqli_num_rows($wisher);
        if ($wisherIDnum) {
            $userNameIsUnique = false;
        }
    
        /** Check whether a password was entered and confirmed correctly */
        if ($_POST['password'] == "") {
            $passwordIsEmpty = true;
        }
        if ($_POST['password2'] == "") {
            $password2IsEmpty = true;
        }
        if ($_POST['password'] != $_POST['password2']) {
            $passwordIsValid = false;
        }
    
        /** Check whether the boolean values show that the input data was validated successfully.
         * If the data was validated successfully, add it as a new entry in the "wishers" database.
         * After adding the new entry, close the connection and redirect the application to editWishList.php.
         */
        if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) {
            $password = mysqli_real_escape_string($con, $_POST['password']);
            mysqli_select_db($con, "wishlist");
            mysqli_query($con, "INSERT wishers (name, password) VALUES ('" . $user . "', '" . $password . "')");
            mysqli_free_result($wisher);
            mysqli_close($con);
            header('Location: editWishList.php');
            exit;
        }
    }

    对于 Oracle 数据库:

    /** Check that the page was requested from itself via the POST method. */
    if ($_SERVER['REQUEST_METHOD'] == "POST") {
    
    /** Check whether the user has filled in the wisher's name in the text field "user" */
        if ($_POST['user'] == "")
            $userIsEmpty = true;
    
        /** Create database connection */
        $con = oci_connect($dbUsername, $dbPassword, $dbXeHost, "AL32UTF8");
        if (!$con) {
            $m = oci_error();
            echo $m['message'], "\n";
            exit;
        }
        
        /** Check whether a user whose name matches the "user" field already exists */
        $query = "select ID from wishers where name = :user_bv";
        $stid = oci_parse($con, $query);
        $user = $_POST['user'];
        $wisherID = null;
        oci_bind_by_name($stid, ':user_bv', $user);
        oci_execute($stid);
    
    /**Each user name should be unique. Check if the submitted user already exists. */
        $row = oci_fetch_array($stid, OCI_ASSOC);
        if ($row) {
        $wisherID = $row['ID']; 
        }
        if ($wisherID != null) {
            $userNameIsUnique = false;
        }
        //Check for the existence and validity of the password
        if ($_POST['password'] == "") {
            $passwordIsEmpty = true;
        }
        if ($_POST['password2'] == "") {
            $password2IsEmpty = true;
        }
        if ($_POST['password'] != $_POST['password2']) {
            $passwordIsValid = false;
        }
        /** Check whether the boolean values show that the input data was validated successfully.
         * If the data was validated successfully, add it as a new entry in the "wishers" database.
         * After adding the new entry, close the connection and redirect the application to editWishList.php.
         */
        if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) {
    
            $query = "INSERT INTO wishers (name, password) VALUES (:user_bv, :pwd_bv)";
            $stid = oci_parse($con, $query);
            $pwd = $_POST['password'];
            oci_bind_by_name($stid, ':user_bv', $user);
            oci_bind_by_name($stid, ':pwd_bv', $pwd);
            oci_execute($stid);
            oci_free_statement($stid);
            oci_close($con);
            header('Location: editWishList.php');
            exit;
        }
    }

在输入窗体中显示错误消息

现在,将实现在输入无效数据时显示错误消息的功能。该实现基于验证和布尔型变量值更改,如验证数据并将其添加到数据库中所述。

  1. 在 HTML 输入窗体中,在许愿者的名字输入下面输入以下 PHP 代码块:
    Welcome!<br>
    <form action="createNewWisher.php" method="POST">
    Your name: <input type="text" name="user"/><br/>
    <?php if ($userIsEmpty) { echo ("Enter your name, please!"); echo ("<br/>"); } if (!$userNameIsUnique) { echo ("The person already exists. Please check the spelling and try again"); echo ("<br/>"); } ?>
  2. 在 HTML 输入窗体中,在口令输入代码下输入以下 PHP 代码块:
    Password: <input type="password" name="password"/><br/>
    
    <?php if ($passwordIsEmpty) { echo ("Enter the password, please!"); echo ("<br/>"); } ?>
  3. 在 HTML 输入窗体中,在口令确认代码下面输入以下 PHP 代码块:
    Please confirm your password: <input type="password" name="password2"/><br/>
    
    
    
    <?php if ($password2IsEmpty) { echo ("Confirm your password, please"); echo ("<br/>"); } if (!$password2IsEmpty && !$passwordIsValid) { echo ("The passwords do not match!"); echo ("<br/>"); } ?>

测试“创建新的许愿者”功能

  1. 运行应用程序。索引页打开。
    主应用程序页 index.php 包含两个选项:查看某个人的愿望列表和创建愿望列表
  2. 在索引页中,单击 "Still don't have a wish list?" 文本旁边的链接。以下窗体打开:
    用于注册为许愿者的空窗体
  3. 将这些字段保留空白,然后单击 "Register"。此时将显示一条错误消息。
    许愿者注册窗体具有错误消息:未填写姓名
  4. 在 "Your name" 字段中输入注册的许愿者名字(如 Tom),正确填写其他字段,然后单击 "Register"。此时将显示一条错误消息。
  5. 使用不同的值填写 "Password" 和 "Please confirm your password" 字段,然后单击 "Register"。此时将显示一条错误消息。
  6. 在 "Your name" 字段中输入 Bob,在两个口令字段中指定相同的口令,然后单击 "Register"。打开的页为空页,但正确传送了重定向,因为 URL 以 editWishList.php 结尾:
    具有欢迎问候的 editWishList.php 页
  7. 要检查数据是否存储在数据库中,请导航到 "Services"(服务)窗口中的 wislist1 节点下面的 wishers,然后从上下文菜单中选择 "View Data"(查看数据)
    使用 NetBeans IDE 界面查看数据库中的数据:已添加新许愿者 Bob

完成当前课程后的应用程序源代码

MySQL 用户:单击此处以下载源代码,该代码反映了在完成课程后的项目状态。

Oracle 数据库用户:单击此处以下载源代码,该代码反映了在完成课程后的项目状态。

后续步骤

<< 上一课

下一课 >>

返回到教程主页



要发送意见和建议、获得支持以及随时了解 NetBeans IDE PHP 开发功能的最新开发情况,请加入 邮件列表

返回至 PHP 学习资源

get support for the NetBeans

Support