<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
-->
<html>
   <head>
      <title>Creating a Database Driven Application With PHP. PHP implementation of creating a record in MySQL database</title>
          <meta http-equiv="content-type" content="text/html; charset=UTF-8">
     <meta name="KEYWORDS" content="CRUD, Update, Delete, MySQL, PHP, NetBeans">
      <meta name="DESCRIPTION" content="Creating a Database Driven Application With PHP. PHP implementation of creating a new record in MySQL database" >
      <link rel="stylesheet" type="text/css" href="../../../netbeans.css" media="screen">
</head>
   <body>
        <h1>Creating a Database Driven Application With PHP </h1>
        <h1>Lesson 3:  Creating a New Application User </h1>
        <div style="margin-left:-3px">
            <div class="feedback-box margin-around float-left" style="margin-right:15px">
<h4>Tutorial contents:</h4>
        <ol start="0">
    <li><a href="wish-list-tutorial-main-page.html">Creating a Database Driven Application With PHP - Main page</a></li>
    <li><p>Creating the Database</p> <ol type="a"><li><a href="wish-list-lesson1.html">Creating a MySQL Database</a></li>
    <li><a href="wish-list-oracle-lesson1.html">Creating Oracle Database Tables</a></li>
    </ol></li>
    <li>
    <p><a href="wish-list-lesson2.html">Designing the Application. Reading from the Database</a></p>
    </li>
    <li><p><b>=&gt; Creating a New Application User</b></p>
    <ul>
		<li><a href="#previousLessonSourceCode">Application Source Code from the Previous Lesson</a></li>
  <li><a href="#addLinkNewWisher">Adding a Link to Start Creating a New Wisher</a></li>
  <li><a href="#implementCreateNewWisher">Creating New PHP Web Pages</a>
  <li><a href="#inputFormNewWisher">Adding an HTML Form for Entering the Data of a New Wisher</a></li>
		<li><a href="#validatinDataBeforeAddingToDatabase">Validating Data and Adding It to the Database</a></li>
		<li><a href="#errorMessagesInInputForm">Displaying Error Messages in the Input Form</a></li>
		<li><a href="#testCreateNewWisherFunctionality">Testing the Create New Wisher Functionality</a></li>
		
		
		<li><a href="#lessonResultSourceCode">Application Source Code after the Current Lesson Is Completed</a></li>
   </ul>
    </li>
    <li><a href="wish-list-lesson4.html">Optimizing the Code</a></li>
    <li><a href="wish-list-lesson5.html">Adding Security. Implementing Application User Logon</a></li>
    <li><a href="wish-list-lesson6.html">Adding a New Wish to the Database</a></li>
    <li><a href="wish-list-lesson7.html">Updating and Deleting Entries in the Database</a></li>
    <li><a href="wish-list-lesson8.html">Making the Application Look Better Using the CSS Technology</a></li>
    <li><a href="wish-list-lesson9.html">Deploying the Application on a Remote Web Server</a></li>
</ol>
</div>
</div>
        <img  src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" class="stamp" alt="Content on this page applies to NetBeans IDE 7.2, 7.3, 7.4 and 8.0" title="Content on this page applies to the NetBeans IDE 7.2, 7.3, 7.4 and 8.0" >

   <p>In this lesson you  expand the application with the Create a New Wisher functionality. </p>
        <p>The implementation will affect the index.php file and two new  files will be created named <tt>createNewWisher.php</tt> and <tt>editWishList.php</tt>.</p>
        <p>The Create a New Wisher use case consists of three  steps:</p>
       <p>1. <a href="#addLinkNewWisher">The user opens the front page index.php and clicks the link to register</a>.</p>
         <p>2. <a href="#implementCreateNewWisher">The user switches to the createNewWisher.php page for creating a new wisher</a>. </p>
         <p>3. After creating a new wisher, the user switches to editWishList.php, where he creates a wish list for the user.</p>
         <img src="../../../images_www/articles/72/php/oracle-wishlist/page-flow-diagram-l3.png" alt="Page flow diagram highliting new files created in Lesson 3" height="265" width="439" class="margin-around">   
   <p>The current document is a part of the Creating a Database Application in the NetBeans IDE for PHP tutorial. </p>
        <br style="clear:left">

        
   <h2><a name="previousLessonSourceCode"></a>Application Source Code from the Previous Lesson</h2>
<p>MySQL users: Click <a target="_blank" href="https://netbeans.org/files/documents/4/1928/lesson2.zip">here</a> to download the source code that reflects the project state after the previous lesson is completed. </p>
<p>Oracle Database users: Click <a target="_blank" href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson2.zip">here</a> to download the source code that reflects the project state after the previous lesson is completed.</p>
<h2><a name="addLinkNewWisher" id="addLinkNewWisher"></a>Adding a Link to Start Creating a New Wisher </h2>
   Open <tt>index.php</tt>. Add a blank line below the closing &lt;/form&gt; tag. In that blank line, enter the following code block:
<pre class="examplecode"> &lt;br&gt;Still don't have a wish list?! &lt;a href=&quot;createNewWisher.php&quot;&gt;Create now&lt;/a&gt;</pre>
        <p>Where:</p>
        <ul>
          <li><tt>Still don't have a wish list?! </tt> is the text that will be displayed on the page next to the link. </li>
          <li><tt>&lt;a href=&quot;createNewWisher.php&quot;&gt;&lt;/a&gt;</tt> is the code that implements a link that opens the createNewWisher.php page.
          </li>
          <li><tt>Create now</tt> is the text that will be displayed as a link.
          </li>
    </ul>
        <h2><a name="implementCreateNewWisher" id="implementCreateNewWisher"></a>Creating New PHP Web Pages</h2>
        <p>Create two new PHP web pages in your project's Source Files, as <a href="wish-list-lesson2.html#createNewFile">described</a> in Lesson 2.</p>
        <ul>
          <li><tt>createNewWisher.php</tt></li>
          <li><tt>editWishList.php</tt></li>
        </ul>
        <p>In <tt>editWishList.php</tt>, add the text &quot;Hello!&quot; to the HTML body and otherwise leave it with its default content. You will modify this file in later lessons, but you need it to exist now because <tt>createNewWisher.php</tt> references it. For the remainder of this lesson, you modify <tt>createNewWisher.php</tt>.</p>
   
        <h2><a name="inputFormNewWisher" id="inputFormNewWisher"></a>Adding an HTML Form for Entering the Data of a New Wisher </h2>
        <p>Type or paste the following HTML  block into <tt>createNewWisher.php</tt>, beneath the PHP block:</p>
          <pre class="examplecode">&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &lt;title&gt;&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;<br>      Welcome!&lt;br&gt;<br>        &lt;form action=&quot;createNewWisher.php&quot; method=&quot;POST&quot;&gt;<br>            Your name: &lt;input type=&quot;text&quot; name=&quot;user&quot;/&gt;&lt;br/&gt;<br>            Password: &lt;input type=&quot;password&quot; name=&quot;password&quot;/&gt;&lt;br/&gt;<br>            Please confirm your password: &lt;input type=&quot;password&quot; name=&quot;password2&quot;/&gt;&lt;br/&gt;<br>            &lt;input type=&quot;submit&quot; value=&quot;Register&quot;/&gt;<br>        &lt;/form&gt;<br>     &lt;/body&gt;
&lt;/html&gt;</pre>
          <p class="notes"><strong>Note:</strong> The  <tt>password</tt> type is a special type of a text field where characters are replaced with asterisks.  
        The code presents an <a href="wish-list-lesson3.html#htmlForm">HTML form</a> for a user to enter the name and password of the new wisher in the text fields. When the user clicks the &quot;Register&quot; button, the entered data is transferred for validation to the same page, <tt>createNewWisher.php</tt>.</p>
                  <p class="notes"><b>Note: </b>You can ignore warnings from the HTML validator.</p>

		  <h3><a name="validatinDataBeforeAddingToDatabase" id="validatinDataBeforeAddingToDatabase"></a>Validating Data and Adding It to the Database </h3>
			<p>In this section you add PHP code to <tt>createNewWisher.php</tt>. Add this code to the PHP block at the top of the file. The PHP block must be  above <strong>all</strong> HTML code,  empty lines, or whitespace. The position of the PHP code block is important to enable correct functioning of the redirection statement. Within the PHP block, type or paste the code blocks described below in  this section, in the order they are written.</p>
   <p><strong>Add the following code to validate data:</strong></p>
			<ol>
			  <li>Initialize variables. The first variables pass database credentials and the others are the variables that will be used in the PHP operations. <pre class="examplecode">
/** database connection credentials */<br>$dbHost=&quot;localhost&quot;; //on MySql
$dbXeHost=&quot;localhost/XE&quot;; <br>$dbUsername=&quot;phpuser&quot;;<br>$dbPassword=&quot;phpuserpw&quot;;

/** other variables */
$userNameIsUnique = true;
$passwordIsValid = true;				
$userIsEmpty = false;					
$passwordIsEmpty = false;				
$password2IsEmpty = false;	

			</pre>
			  </li>
              <li>Below the variables, add an <tt>if </tt>clause. The parameter of the <tt>if</tt> clause checks that the page was requested from itself via the POST method. 
          If not, the further validations are not performed and the page is shown with empty fields as described above.
                <pre class="examplecode">/** Check that the page was requested from itself via the POST method. */
if ($_SERVER[&quot;REQUEST_METHOD&quot;] == &quot;POST&quot;) {

}</pre>
              </li>
              <li>Within the curly braces of the <tt>if </tt> clause, add another <tt>if </tt> clause that checks whether the user has filled in the wisher's name. If the text field "user"  is empty, the value of <tt>$userIsEmpty</tt> is changed to true.	<pre class="examplecode">/** Check that the page was requested from itself via the POST method. */
if ($_SERVER[&quot;REQUEST_METHOD&quot;] == &quot;POST&quot;) {

/** Check whether the user has filled in the wisher's name in the text field &quot;user&quot; */    <strong>
    if ($_POST[&quot;user&quot;]==&quot;&quot;) {
    $userIsEmpty = true;
    }</strong>
}</pre> 
              </li>
              <li><p>Add code that establishes a database connection. If the connection 
                cannot be established, the MySQL or Oracle OCI8 error is sent to the output.</p>
                <p><b>For the MySQL database:</b></p>
                <pre class="examplecode">/** Check that the page was requested from itself via the POST method. */
if ($_SERVER[&quot;REQUEST_METHOD&quot;] == &quot;POST&quot;) {

/** Check whether the user has filled in the wisher's name in the text field &quot;user&quot; */    
    if ($_POST[&quot;user&quot;]==&quot;&quot;) {
        $userIsEmpty = true;
    }

    /** Create database connection */<br>
    <strong>$con = mysqli_connect($dbHost, $dbUsername, $dbPassword);<br>    if (!$con) {<br>        exit('Connect Error (' . mysqli_connect_errno() . ') '<br>                . mysqli_connect_error());<br>    }<br>//set the default client character set <br>    mysqli_set_charset($con, 'utf-8');</strong>
} </pre>
<p><b>For the Oracle database:</b></p>
<pre class="examplecode">
/** 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 &quot;user&quot; */
    if ($_POST['user'] == "") {
        $userIsEmpty = true;
    }

    /** Create database connection */<br>
    <strong>$con = oci_connect($dbUsername, $dbPassword, $dbXeHost, &quot;AL32UTF8&quot;);
    if (!$con) {
        $m = oci_error();
        exit('Connect Error' . $m['message']);

    }</strong>
}</pre>
              </li>
              <li>Add code that checks whether a user whose name matches the &quot;user&quot; field already exists. The code does this by trying to find a wisher ID number for a name matching the name in the &quot;user&quot; field. If such an ID number exists,  the value of <tt>$userNameIsUnique</tt> is changed to &quot;false.&quot;
                <p><b>For the MySQL database:</b></p>
                <pre class="examplecode">/** Check that the page was requested from itself via the POST method. */
if ($_SERVER[&quot;REQUEST_METHOD&quot;] == &quot;POST&quot;) {

/** Check whether the user has filled in the wisher's name in the text field &quot;user&quot; */

    if ($_POST[&quot;user&quot;]==&quot;&quot;) {
        $userIsEmpty = true;
    }<br>
    
    /** Create database connection */<br>    $con = mysqli_connect($dbHost, $dbUsername, $dbPassword);<br>    if (!$con) {<br>        exit('Connect Error (' . mysqli_connect_errno() . ') '<br>                . mysqli_connect_error());<br>    }<br>   <strong>/**set the default client character set */ <br>    mysqli_set_charset($con, 'utf-8');</strong>
   <strong>/** Check whether a user whose name matches the &quot;user&quot; field already exists */</strong><br>
    <strong>mysqli_select_db($con, &quot;wishlist&quot;);
    $user = mysqli_real_escape_string($con, $_POST[&quot;user&quot;]);<br>    $wisher = mysqli_query($con, &quot;SELECT id FROM wishers WHERE name='&quot;.$user.&quot;'&quot;);<br>    $wisherIDnum=mysqli_num_rows($wisher);<br>    if ($wisherIDnum) {<br>        $userNameIsUnique = false;<br>    }</strong>
} </pre>
<p><b>For the Oracle database:</b></p>
<pre class="examplecode">/** 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 &quot;user&quot; */
    if ($_POST['user'] == "") {
        $userIsEmpty = true;
    }
    /** Create database connection */<br>
    $con = oci_connect($dbUsername, $dbPassword, $dbXeHost, &quot;AL32UTF8&quot;);
    if (!$con) {
        $m = oci_error();
        exit('Connection Error ' . $m['message']);

    }

   <strong>/** Check whether a user whose name matches the &quot;user&quot; field already exists */</strong>
    <strong>$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;
    }</strong>
}</pre>
              </li>
              <li>After the code that checks if the user is unique, add a series of <tt>if </tt>clauses that check whether the user entered and confirmed a password correctly.
              The code checks that the Password (&quot;password&quot;) and Confirm Password ('password2) fields are not empty in the form and that they are identical. Otherwise the values of the corresponding boolean variables are changed accordingly.
              <pre class="examplecode">if ($_POST[&quot;password&quot;]==&quot;&quot;) {<br>    $passwordIsEmpty = true;
}<br>if ($_POST[&quot;password2&quot;]==&quot;&quot;) {<br>    $password2IsEmpty = true;
}<br>if ($_POST[&quot;password&quot;]!=$_POST[&quot;password2&quot;]) {<br>    $passwordIsValid = false;
} </pre>
</li>
<li>
  <p>Complete the <tt>if ($_SERVER['REQUEST_METHOD'] == "POST")</tt> clause by adding code that inserts a new entry into the &quot;wishers&quot; database. The code checks that the name of the wisher is specified uniquely and that the password is entered and confirmed validly. If the conditions are met, the code takes the &quot;user&quot; and &quot;password&quot; values  from the HTML form  and inserts them into the Name and Password columns, respectively, of a new row in the wishers database. After creating the row, the code closes the database connection and redirects the application to the page <tt>editWishList.php</tt>.</p>
  <p><b>For the MySQL database:</b></p>
  <pre class="examplecode">/** 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.
     */
    <strong>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;
    }</strong>
}</pre>
    <p><b>For the Oracle database:</b></p>
    <pre class="examplecode">/** 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, &quot;AL32UTF8&quot;);
    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.
     */
    <strong>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;
    }</strong>
}</pre>
</li>
		  </ol>
			
       
   <h2><a name="errorMessagesInInputForm" id="errorMessagesInInputForm"></a>Displaying Error Messages in the Input Form</h2>
          <p>Now you implement the display of error messages when the entered data is invalid. The implementation is based on the validations and changes to the values of the boolean variables described in  <a href="#validatinDataBeforeAddingToDatabase">Validating Data and Adding It to the Database</a>. </p>
          <ol>
          <li>Enter the following PHP code block inside the HTML input form, below the wisher's name input:
            <pre class="examplecode">Welcome!&lt;br&gt;<br>&lt;form action=&quot;createNewWisher.php&quot; method=&quot;POST&quot;&gt;<br>    Your name: &lt;input type=&quot;text&quot; name=&quot;user&quot;/&gt;&lt;br/&gt;

<br>
    <strong>&lt;?php
    if ($userIsEmpty) {
        echo (&quot;Enter your name, please!&quot;);
        echo (&quot;&lt;br/&gt;&quot;);
    }                
    if (!$userNameIsUnique) {
        echo (&quot;The person already exists. Please check the spelling and try again&quot;);
        echo (&quot;&lt;br/&gt;&quot;);
    }
    ?&gt; </strong></pre>
          </li>
          <li>Enter the following
            PHP code block inside the HTML input form below the code for the password input:
            <pre class="examplecode">Password: &lt;input type=&quot;password&quot; name=&quot;password&quot;/&gt;&lt;br/&gt;
<br>
<strong>&lt;?php
 if ($passwordIsEmpty) {
     echo (&quot;Enter the password, please!&quot;);
     echo (&quot;&lt;br/&gt;&quot;);
 }                
 ?&gt;</strong></pre>
          </li>
          <li>Enter the following  PHP code blocks inside the HTML input form below the code for password confirmation:
            <pre class="examplecode">Please confirm your password: &lt;input type=&quot;password&quot; name=&quot;password2&quot;/&gt;&lt;br/&gt;


<br>
<strong>&lt;?php
 if ($password2IsEmpty) {
     echo (&quot;Confirm your password, please&quot;);
     echo (&quot;&lt;br/&gt;&quot;);    
 }                
 if (!$password2IsEmpty &amp;&amp; !$passwordIsValid) {
     echo  (&quot;The passwords do not match!&quot;);
     echo (&quot;&lt;br/&gt;&quot;);  
 }                 
?&gt;</strong></pre>
          </li>
        </ol>
       <h3> <a name="testCreateNewWisherFunctionality"></a>Testing the Create New Wisher Functionality</h3>
        <ol>
          <li>Run the application. The index page opens.<br>
            <img src="../../../images_www/articles/72/php/wish-list-lesson3/index-php-3.png" alt="The main application page index.php with two options: Viewing the wish list of a person and creating a wish list" class="margin-around"></li>
          <li>On the index page, click the link next to   the text Still don't have a wish list? The following form opens:<br>
              <img src="../../../images_www/articles/72/php/wish-list-lesson3/create-new-wisher-empty-form.png" alt="An empty form for registering as a wisher" class="margin-around"></li>
          <li>Leave the fields empty and click Register. An error message displays.<br>
              <img src="../../../images_www/articles/72/php/wish-list-lesson3/create-new-wisher-name-empty.png" alt="The wisher registration form with an error message: the name is not filled in" class="margin-around"></li>
          <li>Enter the name of a registered wisher, for example, Tom  in the Your name field, fill in the other fields correctly, and click Register. An error message displays.</li>
          <li>Fill in the Password and Please confirm your password fields with different values and click Register. An error message displays.</li>
          <li>Enter Bob in the Your name field, specify the same password in both password fields and click Register. The page that opens is empty but the redirection passed correctly as the  URL ends with editWishList.php:<br>
            <img src="../../../images_www/articles/72/php/wish-list-lesson3/edit-wish-list-empty.png" alt="The editWishList.php page with a welcome greeting" class="margin-around"></li>
          <li>To check that the data is stored in the database, navigate to wishers on the Services window below the wislist1 node and from the context menu choose View Data <br><img src="../../../images_www/articles/72/php/wishlist/wishers.png" alt="Viewing the data in the database using the NetBeans IDE interface: the new wisher Bob has been added" class="margin-around b-all"></li>
        </ol>
<h2><a name="lessonResultSourceCode"></a>Application Source Code after the Current Lesson Is Completed </h2>
<p>MySQL users: Click <a target="_blank" href="https://netbeans.org/files/documents/4/1929/lesson3.zip">here</a> to download the source code that reflects the project state after the lesson is completed.</p>
<p>Oracle Database users: Click <a target="_blank" href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson3.zip">here</a> to download the source code that reflects the project state after the lesson is completed.</p>
<h2><a name="nextSteps"></a>Next Steps</h2>
        <p><a href="wish-list-lesson2.html">&lt;&lt; Previous lesson</a></p>
        <p><a href="wish-list-lesson4.html">Next lesson &gt;&gt;</a>    </p>
        <p><a href="wish-list-tutorial-main-page.html">Back to the Tutorial main page</a>
</p><br>
<div class="feedback-box" ><a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20PHP%20Wish%20List%20CRUD%203:%20Creating%20New%20User">Send Feedback on This Tutorial</a></div>
<br style="clear:both;" >
<p>To send comments and suggestions, get support, and keep informed on the latest
  developments on the NetBeans IDE PHP development features, <a href="../../../community/lists/top.html">join
  the users@php.netbeans.org mailing list</a>.</p>
<p><a href="../../trails/php.html">Back to the PHP Learning Trail</a><br>
</p>
</body>
</html>
