Backend Operations in PHP from 0 to Hero(Pt. 2 passing variables and user input)

In the last tutorial, we made a PHP script that performs simple backend operations.

In part 2, we’ll be making a PHP script that will perform customizable backend operations by getting user input and passing it to our backend script

Disclaimer

What I’m going to write about doesn’t consider security. The code in this article is meant to demonstrate the fundamentals of heavy backend operations, and is not meant to be used for public web services concerning others’ data without additional security measures.

Let’s get started!

First, let’s create a form that will accept a url and a tag parameter:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Simple operations</title>
</head>
<body>
<form method="post" action="results.php">
url: <input type="text" name="url"><br>
tag: <input type="text" name="tag"><br>
<button type="submit" >Submit</button>
</form>
</body>
</html>

Once these parameters are accepted, they will passed-on to results.php, here's how it will look like:

<?php
$url = $_POST["url"];
$tag = $_POST["tag"];
$output = exec("python3 op1.py $url $tag");
echo("<h1>$output</h1>");
?>

What’s going on here?

  • First, results.php defines the $url and $tag variables as the ones passed-on by the form we made earlier.
  • It then executes op1.py using the exec function and passes the $url and $tag variables to op1.py.
  • It finally echos the output of this exec function inside an <h1> tag.

Here’s where the magic happens

results.php passes the $url and $tag variables to op1.py, executes the python script and returns it's output.

One big question you might have is:
“How is python able to work with PHP variables?”

Answer: Using the sys library.
Let me show you:

import sys
import requests
from bs4 import BeautifulSoup
url=sys.argv[1]
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
element = soup.find('body').find(sys.argv[2])
print(element)

This is a python script which scrapes webpages for certain HTML tags such as h1 div and p, and outputs the text contents within the first occurrence of the specified HTML tag within the webpage.

As you might remember, results.php passed first the $url variable, then the $tag variable, therefor, when we define the url variable in our python script, we call sys.argv[1] to in turn get the first variable that was passed by the PHP script, which is the $url variable.

Next, when defining the tag which we want to scrape for text contents within the specified URL’s webpage, we call sys.argv[2] to get the second variable passed by results.php, which is the $tag variable.

The same can be done with Node.js like so:

results.php

<?php
$url = $_POST["url"];
$tag = $_POST["tag"];
$output = exec("url=$url tag=$tag node op1.js");
echo("<h1>$output</h1>");
?>

op1.js

console.log('URL: ' + process.env.url + ' | tag: ' + process.env.tag)

Result

Full code:

index.php

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Simple operations</title>
</head>
<body>
<form method="post" action="results.php">
url: <input type="text" name="url"><br>
tag: <input type="text" name="tag"><br>
<button type="submit" >Submit</button>
</form>
</body>
</html>

results.php

<?php
$url = $_POST["url"];
$tag = $_POST["tag"];
$output = exec("python3 op1.py $url $tag");
echo("<h1>$output</h1>");
?>

op1.py

import sys
import requests
from bs4 import BeautifulSoup
url=sys.argv[1]
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
element = soup.find('body').find(sys.argv[2])
print(element)

Now if you open a terminal in your project’s directory, run php -S localhost:8000 and open the respective url in your browser, here's how our code should work:

These form parameters are passed on to results.php which the user is then redirected to

results.php then takes those parameters, passes them to op1.py, executes the respective python script and returns it's output inside an <h1> tag which in this case is "PHP tutorial".

If you were to change the tag parameter to p:

op1.py will then scrape the first <p> tag within the specified URL:

You can now experiment!

You can now implement this method of performing user customizable backend operations into your projects and PHP scripts when trying to perform backend operations.

Stick around for part 3 to learn about more complex, memory and time intensive backend operations in PHP!

Byeeee👋

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store