- Designing the Database Tables
- Creating an Include File for Common Functions
- Creating the Input Forms and Scripts
Creating the Input Forms and Scripts
Before you can add any posts, you must add a topic to the forum. It is common practice in forum creation to add the topic and the first post in that topic at the same time. From a user’s point of view, it doesn’t make much sense to add a topic and then go back, select the topic, and add a reply. You want the process to be as smooth as possible. Listing 21.2 shows the form for a new topic creation, which includes a space for the first post in the topic.
Listing 21.2 Form for Adding a Topic
1: <html> 2: <head> 3: <title>Add a Topic</title> 4: </head> 5: <body> 6: <h1>Add a Topic</h1> 7: <form method="post" action="do_addtopic.php"> 8: <p><strong>Your E-Mail Address:</strong><br/> 9: <input type="text" name="topic_owner" size="40" maxlength="150"/></p> 10: <p><strong>Topic Title:</strong><br/> 11: <input type="text" name="topic_title" size="40" maxlength="150"/></p> 12: <p><strong>Post Text:</strong><br/> 13: <textarea name="post_text" rows="8" cols="40" wrap="virtual"></textarea></p> 14: <p><input type="submit" name="submit" value="Add Topic"/></p> 15: </form> 16: </body> 17: </html>
Seems simple enough—the three fields shown in the form, which you can see in Figure 21.1, are all you need to complete both tables; your script and database can fill in the rest. Save Listing 21.2 as something like addtopic.html and put it in your web server document root so that you can follow along.
Figure 21.1 The topic creation form.
To create the entry in the forum_topics table, you use the values from the $_POST["topic_title"] and $_POST["topic_owner"] variables from the input form. The topic_id and topic_create_time fields will be automatically incremented and added via the now() MySQL function, respectively.
Similarly, in the forum_posts table, you use the values of $_POST["post_text"] and $_POST["topic_owner"] from the input form, and the post_id, post_create_time, and the topic_id fields will be automatically incremented or otherwise supplied. Because you need a value for the topic_id field to be able to complete the entry in the forum_posts table, you know that query must happen after the query to insert the record in the forum_topics table. Listing 21.3 creates the script to add these records to the table.
Listing 21.3 Script for Adding a Topic
1: <?php 2: include("ch21_include.php"); 3: doDB(); 4: 5: //check for required fields from the form 6: if ((!$_POST["topic_owner"]) || (!$_POST["topic_title"]) || 7: (!$_POST["post_text"])) { 8: header("Location: addtopic.html"); 9: exit; 10: } 11: //create and issue the first query 12: $add_topic = "INSERT INTO forum_topics (topic_title, topic_create_ 13: time, topic_owner) VALUES (‘".$_POST["topic_title"]."’,now(), 14: ‘".$_POST["topic_owner"]."’)"; 15: $add_topic_res = mysqli_query($mysqli, $add_topic_sql) 16: or die(mysqli_error($mysqli)); 17: 18: //get the id of the last query 19: $topic_id = mysqli_insert_id($mysqli); 20: 21: //create and issue the second query 22: $add_post_sql = "INSERT INTO forum_posts (topic_id,post_text, 23: post_create_time, post_owner) VALUES (‘".$topic_id."’, 24: ‘".$_POST["post_text"]."’, now(), 25: ‘".$_POST["topic_owner"]."’)"; 26: $add_post_res = mysqli_query($mysqli, $add_post_sql) 27: or die(mysqli_error($mysqli)); 28: 29: //close connection to MySQL 30: mysqli_close($mysqli); 31: 32: //create nice message for user 33: $display_block = "<P>The <strong>".$_POST["topic_title"]."</strong> 34: topic has been created.</p>"; 35: ?> 36: <html> 37: <head> 38: <title>New Topic Added</title> 39: </head> 40: <body> 41: <h1>New Topic Added</h1> 42: <?php echo $display_block; ?> 43: </body> 44: </html>
Lines 2–3 include the file of user-created functions and call the database connection function. Next, lines 6–10 check for the three required fields needed to complete both tables—the topic owner, a topic title, and some text for the post. If any one of these fields is not present, the user is redirected to the original form.
Lines 12–16 create and insert the first query, which adds the topic to the forum_topics table. Note that the first field is left blank, so the automatically incrementing value is added by the system per the original table definition. The MySQL now() function is used to timestamp the record with the current time, at insertion. The other fields in the record are completed using values from the form.
Line 19 shows the use of a handy function: mysqli_insert_id(). This function retrieves the primary key ID of the last record inserted into the database by this script. In this case, mysqli_insert_id() gets the id value from the forum_topics table, which will become the entry for the topic_id field in the forum_posts table.
Lines 22–27 create and insert the second query, again using a mixture of information known and supplied by the system. The second query adds the text of the user’s post to the forum_posts table. Lines 33–34 simply create a display string for the user, and the rest of the script rounds out the display.
Save this listing as do_addtopic.php—the name of the action in the previous script—and place it in the document root of your web server. Complete the form and then submit it, and you should see the New Topic Added message. Figures 21.2 and 21.3 show the sequence of events.
Figure 21.2 Adding a topic and first post.
Figure 21.3 Successful addition of a topic and first post.
In the next section, you’ll put together two more pieces of the puzzle: displaying the topics and posts, and replying to a topic.