doubledee Posted December 19, 2011 Share Posted December 19, 2011 Where should my Form go once it is submitted? I am reading through some old code, and I was using some pretty convoluted programming to get everything (e.g. error and success messages after form submittal) to work. Basically what I would do was... HTML to Open Page PHP to Handle Form If Data Okay... Success Message (e.g. "Your account was created!") HTML to close out Page If Data Invalid... Failure Message (e.g. "A System Error occurred. Please contact the Administrator.") HTML to close out Page HTML Form HTML to Close Page I have heard that you should always put your PHP first in the script and then follow it up with your HTML Page and Form. But where should you go once the form is submitted? My second attempt at things - to fix the mess above - was to REDIRECT the user to a "Handling Page" which basically was a large case statement that would read a "processing code" and display the right message. But that seems kind of hokey too?! :-\ Can someone help me come up with a more professional and scalable solution?? Thanks, Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/ Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 Generally I like to just use the same page for form processing. That way each page is only responsible for and dependent on itself. So like for a contact page "contact.php": if (!empty($_POST)) { // process form } else { // display form } What you actually display depends on your app I guess. Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299158 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 Generally I like to just use the same page for form processing. That way each page is only responsible for and dependent on itself. So like for a contact page "contact.php": if (!empty($_POST)) { // process form } else { // display form } What you actually display depends on your app I guess. Sorry, but unless you are doing simplistic pages, that approach is a real PITA when it comes to your HTML because in //process form you need to insert HTML to display messages and close out the page so the HTML is like an ingrown toenail?! Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299173 Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 Can you show me what you mean? Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299174 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 Can you show me what you mean? Here is some stripped down code... <?php // Initialize a session. session_start(); // Access Constants require_once('config/config.inc.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body> <div id="wrapper" class="clearfix"> <div id="inner"> <?php // <!-- Include BODY HEADER --> require_once(ROOT . 'components/body_header.inc.php'); // Initialize Errors Array. $errors = array(); // Connect to the database. require_once(ROOT . 'private/mysqli_connect.php'); // ************************************************************* // HANDLE FORM. * // ************************************************************* if ($_SERVER['REQUEST_METHOD']=='POST'){ // Form was Submitted (Post). // Trim all form data. $trimmed = array_map('trim', $_POST); // ******************** // CHECK FORM DATA. * // ******************** // Check First Name. // Check Email. // Check for Data-Entry Errors. if (empty($errors)){ // Form data clean. // Create Activation Code. $activationCode = md5($email . uniqid(rand(), true)); // Create a new Member Account. $q = "INSERT INTO member(email, pass, first_name, activation_code, created_on) VALUES(?, ?, ?, ?, NOW())"; // Prepare statement. $stmt = mysqli_prepare($dbc, $q); // Bind variable. mysqli_stmt_bind_param($stmt, 'ssss', $email, $pass, $firstName, $activationCode); // Execute query. mysqli_stmt_execute($stmt); // Verify Insert. if (mysqli_stmt_affected_rows($stmt)==1){ // Insert Succeeded. echo '<div id="box_Content_700b">'; echo '<h1>Member Account Created</h1>'; echo '<p>Congratulations!</p> <p>Your account has been created, and a confirmation e-mail sent to: "' . $email . '"</p> <p>Please click on the link in that e-mail to activate your account.</p>'; echo '</div>'; // -------------------- // Create Email Content. // -------------------- }else{ // Insert Failed. echo '<div id="box_Content_700b">'; echo '<h1>Account Creation Failed</h1>'; echo '<p>You could not be registered due to a system error.</p>'; echo '<p>Please contact the System Administrator.</p>'; echo '</div>'; }// End of VERIFY INSERT. // Close prepared statement. mysqli_stmt_close($stmt); // Close the connection. mysqli_close($dbc); // Close-out HTML wrappers. echo ' </div>'; //<-- End of #INNER --> echo ' </div>'; //<!-- End of #WRAPPER --> // Include BODY FOOTER require_once(ROOT . 'components/body_footer.inc.php'); // Do *not* return to Create Account Form!!! exit(); }// End of CHECK FOR ERRORS. }else{ // Form NOT Submitted (Get). // Drop-through to Form to display data-entry errors. }// End of HANDLE FORM. ?> <!-- MIDDLE COLUMN --> <div id="middle_1col"> <div id="box_Content_zzz"> <form id="createAccount" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <!-- DISPLAY CREATE ACCOUNT FIELDS --> <fieldset> <legend>Create a Member Account</legend> </fieldset> </form> </div> </div><!-- End of #MIDDLE --> </div><!-- End of #INNER --> </div><!-- End of #WRAPPER --> <!-- Include BODY FOOTER --> <?php require_once(ROOT . 'components/body_footer.inc.php'); ?> </body> </html> This code works just fine, but it is a real PITA to code and maintain, and for situations where I have a more complicated page layout or messages, this is not the way to go. In fact, the code above is the perfect example of mixing BUSINESS LOGIC and PRESENTATION together, which is the mark of a junior coder... Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299185 Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 In fact, the code above is the perfect example of mixing BUSINESS LOGIC and PRESENTATION together, which is the mark of a junior coder... So don't do that. Use a template library, then you can have simple, elegant code that is separated. Crude example: class Template { public function view($file) { if (is_readable($file)) { require $file; } } } // contact.php $template = new Template if (!empty($_POST)) { // process stuff if ($success === true) { $template->view('success.php'); } else { $template->view('errors.php'); } } else { // view form $template->view('form.php'); } Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299187 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 In fact, the code above is the perfect example of mixing BUSINESS LOGIC and PRESENTATION together, which is the mark of a junior coder... So don't do that. Use a template library, then you can have simple, elegant code that is separated. Crude example: class Template { public function view($file) { if (is_readable($file)) { require $file; } } } // contact.php $template = new Template if (!empty($_POST)) { // process stuff if ($success === true) { $template->view('success.php'); } else { $template->view('errors.php'); } } else { // view form $template->view('form.php'); } Sorry, but I'm not ready for OOP. I need a better approach using traditional Procedural Programming in PHP. Thanks, Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299188 Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 So do it procedurally then... function loadTemplate($file) { if (is_readable($file)) { require $file; } } // contact.php $template = new Template if (!empty($_POST)) { // process stuff if ($success === true) { loadTemplate('success.php'); } else { loadTemplate('errors.php'); } } else { // view form loadTemplate('form.php'); } EDIT: I would also recommend splitting your template files into a header, a body, and a footer. Only use this function to get the body and for each body, just require the header at the top and the footer at the bottom. Otherwise, if you want to change the code in the header or footer you have to do it in every single file. Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299190 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 scootstah, What about my second approach using a Re-Direct and displaying the Outcome on another page? (It seems to me that one BIG benefit of this approach was that it eliminated the "double form submission" issue I had when people hit the Back button and then Forward again...) Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299198 Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 Well, you can always redirect after processing. Even if you want to end up on the same page, redirecting will make it so refreshes won't resend the form. As for a giant processing file, it just doesn't seem like a clean approach in my opinion. Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299201 Share on other sites More sharing options...
xyph Posted December 19, 2011 Share Posted December 19, 2011 Why do you keep asking questions only to disagree or 'correct' people? Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299210 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 Why do you keep asking questions only to disagree or 'correct' people? Because this isn't called a "lecture", it is called a "forum" where people exchange ideas... I said I don't know or want to learn OOP right now, so deal with it. Go fight with someone else. Honestly. Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299217 Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 Why do you keep asking questions only to disagree or 'correct' people? Because this isn't called a "lecture", it is called a "forum" where people exchange ideas... I said I don't know or want to learn OOP right now, so deal with it. Go fight with someone else. Honestly. Debbie You come off as arrogant when you say things like: Sorry, but unless you are doing simplistic pages, that approach is a real PITA when it comes to your HTML because in //process form you need to insert HTML to display messages and close out the page so the HTML is like an ingrown toenail?! You also suggest that my solution is the "mark of a junior coder". Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299221 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 You come off as arrogant when you say things like: Sorry, but unless you are doing simplistic pages, that approach is a real PITA when it comes to your HTML because in //process form you need to insert HTML to display messages and close out the page so the HTML is like an ingrown toenail?! You also suggest that my solution is the "mark of a junior coder". WTF?! I was implying that the way that "I" coded my page was a PITA... And I implied that doing things the way that "I" did in my first approach of having multiple sets of HTML in different PHP forks to create several page outcomes in one PHP file is the make of a junior coder - or in my case a "junior approach". I never said anything about your abilities or approach other than I didn't want to use OOP or MVC... Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299226 Share on other sites More sharing options...
doubledee Posted December 19, 2011 Author Share Posted December 19, 2011 Here is some stripped down code FROM DEBBIE... blah blah This code works just fine, but it is a real PITA to code and maintain, and for situations where I have a more complicated page layout or messages, this is not the way to go. In fact, the code above FROM DEBBIE is the perfect example of mixing BUSINESS LOGIC and PRESENTATION together, which is the mark of a junior coder... Debbie Can I not be critical of my own former code???? Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299227 Share on other sites More sharing options...
scootstah Posted December 19, 2011 Share Posted December 19, 2011 Well then I offer my apologies; I misinterpreted you. Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299235 Share on other sites More sharing options...
doubledee Posted December 20, 2011 Author Share Posted December 20, 2011 Well then I offer my apologies; I misinterpreted you. It's okay, but after xyph looking for a fight, that is what you brought out in me! Debbie Quote Link to comment https://forums.phpfreaks.com/topic/253454-where-to-go-after-form-submission/#findComment-1299551 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.