Jump to content

Stop php script running on page load


Recommended Posts

Hi,

I'm struggling to get a simple example to work (with really no experience in php and just enough to make things work in html).

My problem is this simple web page runs the php script when the page is loaded, writing to a file.  I don't want the script to run until the submit button is pressed.

What am I doing wrong?

Thanks,

Dave

test.php.txt

Link to comment
Share on other sites

Posted (edited)

On this site, we do not normally open attachments. In order to post code, use the <> button located in the toolbar.

As for your issue, the PHP script will be read by the server when loading the webpage.

It is currently doing what you have directed it to do (and has proven that it functions adequately).

If you want to change your instructions to not run unless the submit button is clicked, then you have created a new CONDITION that needs to be added to the code.

There are several ways to handle this:

//let's say this is your button
<input type="submit" name="my_submit" value="runPHP">

//Assuming the button is inside a <form method="POST"> tag, you now have several alternatives or combinations to use as conditions 
  <?php if(isset($_POST['my_submit'])){
  //code to run if the CONDITION is met hours here
  } else {
  //what to do if condition is NOT met
  echo "Sorry, the button was not clicked";
  }  //end the condition

  //OR do this if you want to meet a greater condition 
  if(isset($_POST['my_submit']) && $_POST['my_submit'] == "runPHP"){
  //code to run if ALL the CONDITIONs are met
  } else {
  //what to do if conditionS are NOT met
  echo "Sorry, the button was not clicked";
  }  //end the conditions statement 
  
  ?>

Hope this helps.

You can research ISSET and see other examples online.

Edited by phppup
  • Great Answer 1
Link to comment
Share on other sites

Oops!  Sorry, I won't make that mistake again!

OK, I understand your hint.  I've seen similar examples and just didn't understand until now.

Thanks for your help (and for correcting me about uploading code).

Dave

Link to comment
Share on other sites

This is a common pattern, where you have a script that renders a form and also processes it. 

phppup provided a few great examples of how to handle it.  Sometimes people will also choose to use the ability of PHP to provide you the HTTP method, given that you only want to process the form when the HTTP method was a POST.

 

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  
   // This was a POST request. 

}

 

However, with all that said, looking at your actual code, which I have put in the code block below, your code already  should have been working, because it already evidently did what phppup demonstrated:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>
</head>

<body>

<form method="post">
      <input type="text" name="firstName" placeholder="First Name" value="first name"> <br>
      <input type="text" name="lastName" placeholder="Last Name" value="last name"> <br>
      <input type="submit" name="submit" value="Submit">
</form>

<?php
echo "running script";
  
if(isset($_POST['submit'])){
    $firstName = "First Name:" . $_POST['firstName']. "";
    $lastName = "Last Name:".$_POST['lastName'] . "";
    $file = fopen("file.txt", "a");
    fwrite($file, $firstName);
    fwrite($file, $lastName);
    fclose($file);
}
?>

 

The ONLY issue here, is that your script echos out "running script" regardless.  If you moved that echo statement inside the if loop, you would perhaps not be fooled into thinking the code that you did not want to be run was running.  In summary, your code already worked, but your debugging statement displayed even when the processing was not being run.

 

One thing I would like to suggest to you, is that you can take advantage of variable interpolation.  It is one of the things that makes PHP very nice to work with, not unlike the introduction of template literals in javascript.  

You have this concatenation:

$firstName = "First Name:".$_POST['firstName']."";

 

But with interpolation, you can use the much more natural and simpler to read, debug and modify:

$firstName = "First Name:{$_POST['firstName']}";

 

Interpolation is done anytime you utilize double quotes.  It's good practice (although a micro optimization) to use single quotes anytime you want a string constant.  When PHP sees double quotes around a string it will try to interpolate.  With single quotes, it will not.

 

$name = 'Gizmola';

echo "Hello $name <br>";
\\ output:  Hello Gizmola <br>

echo 'Hello $name <br>';
\\ output:  Hello $name <br>

 

I'm not sure why you originally had the extra  "", which essentially does nothing, as the code is saying "add nothing to the end of this string."  You can add things like newlines using escape characters.  A newline character can be added using "\n".

$firstName = "First Name:{$_POST['firstName']}\n";

Similar escape characters like tab can be inserted using this technique (in an interpolated string).

 

Last but not least, you only need to enclose the variable inside a block ie,  {variable}, when the variable is an array element, as in the case of the $_POST.  Without putting the { .. } around the array variable, PHP is not able to parse the string properly, and you get a syntax error.  Putting the block around array variables solves the problem.  With simple php variables like "$name" you can just use them inside the double quoted string, and PHP will interpolate them into the resulting string variable.

 

One of the strengths of PHP for web development is its HTML/PHP block modality, which you are using here.  Before long, however, you likely want to have something like a header.php you include in scripts, so you aren't cutting/pasting the same HTML block into each script.  Along these lines, PHP also has HEREDOCS which support interpolation.

 

So you could move all of the your HTML boilerplate into a PHP script.  In your case, at least trivially, you would want to have the page title be a variable, in this case $title.

 

//htmlHead.php
<?php
$htmlHead = <<<HEADER
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>$title</title>
</head>
HEADER;

 

Note a few things here:  You do not ever need to have an ending PHP tag in your scripts, class files or function collections.  The only time you need to use a php end tag (?>) is if you are dropping in and out of PHP mode.

 

So now we can rewrite your original script this way:

<?php
$title = 'Name File Processing';
require_once('htmlHead.php');
echo $htmlHead;
?>
<body>

<form method="post">
      <input type="text" name="firstName" placeholder="First Name" value="first name"> <br>
      <input type="text" name="lastName" placeholder="Last Name" value="last name"> <br>
      <input type="submit" name="submit" value="Submit">
</form>

<?php

  
if(isset($_POST['submit'])){
    echo "running script<br>";
  
    $firstName = "First Name: {$_POST['firstName']}";
    $lastName = "Last Name: {$_POST['lastName']}";
    $file = fopen("file.txt", "a");
    fwrite($file, $firstName);
    fwrite($file, $lastName);
    fclose($file);
}
?>
</body>

 

  • Like 1
Link to comment
Share on other sites

One last very opinionated take, but in my experience, the best practice for HTML element naming is to use all lower case names, rather than camel case.  It also helps to differentiate between php variables in camelcase and corresponding html elements.

If you feel strongly you want to have a separator in your html names, then use underscore between words.  It's best not to use dashes, as this will interfere/complicate using the very useful data-* feature of html/javascript integration, where data-* names will be turned into javascript camelcase equivalent values.

I'm also a believer in using BEM when integrating your css.  

I find that, by following conventions, it gives you underlying best practices to guide you in variable naming.

PHP has a community coding standard PSR-12 that is a best practice to follow.

So your html form, would be translated to:

<form method="post">
      <input type="text" name="first_name" placeholder="First Name"><br>
      <input type="text" name="last_name" placeholder="Last Name"><br>
      <input type="submit" name="submit" value="Submit">
</form>

Notice that I removed your value assignments.  It's a bad idea to set the values of the form fields in advance like that, as submitting the form will have those values unless the user enters something into them.

 

 

Then your processing becomes:

function postTrim($formVariables) {
    foreach ($formVariables as $name) {
       if (isset($_POST[$name]) {
           $_POST[$name] = trim($_POST[$name]);
       }
    }
}


if(isset($_POST['submit'])){

    $formVariables = ['first_name', 'last_name'];
    postTrim($formVariables);

    $message = '';
    foreach ($formVariables as $name) {
    	if (empty($_POST[$name]) { 
            $message .= 'You must provide a value for ' . implode(array_map('ucfirst', explode('_', $name))) . '<br>';
        }
    }
    if ($message) {
        // Invalid Form Post
        echo $message;
        exit;
    }
    echo "running script<br>";
    
    $firstName = "First Name: {$_POST['firstname']}";
    $lastName = "Last Name: {$_POST['lastname']}";
    $file = fopen("file.txt", "a");
    fwrite($file, $firstName);
    fwrite($file, $lastName);
    fclose($file);
}

 

So I added a quick helper function that will use a whitelist of your form element names, to make sure that each element has been trimmed of whitespace before/after the variable.  It also will eliminate a field that just has spaces in it, but is otherwise empty.

Then I added a check loop that goes through the whitelist and makes sure there were actual values posted.  If not it displays an error message, and does not add to the file.

I hope these examples will help you on your way to PHP based web development mastery.  These are just simple examples, and I often don't actually check that the code is entirely valid, so there might be some bugs in there, but I encourage you to experiment, and read about any of the functions or things I've tried to demonstrate.

Link to comment
Share on other sites

Wow Gizmola.  <insert exploding head emoji here>  Thanks!  You've given me some really good ideas and a lot of information for me to investigate and learn.

Greatly appreciated!

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.