Server-Side Scripting/Document Databases/PHP

index.php edit

<?php

// This program creates and displays a temperature database
// with options to insert, update, and delete records.
//
// Assumes MongoDB is installed locally. If you have MongoDB running
// separately (such as in a Docker container), replace localhost below
// with your MongoDB server's IP address.
//
// References:
//  https://en.wikibooks.org/wiki/PHP_Programming
//  https://www.php.net/manual/en/class.mongodb-driver-manager.php
//  http://zetcode.com/db/mongodbphp/

$HOST = "mongodb://localhost";
$DATABASE = "temperature";
$COLLECTION = "countries";

$FORM = '
<h1>Temperature Data Entry</h1>
<p>Enter country and temperature. Enter again to update.</p>
<p>Enter country without temperature to delete.</p>
<form method="POST">
<p><label for="country">Country:</label>
<input type="text" id="country" name="country" required></p>
<p><label for="stop">Temperature:</label>
<input type="text" id="temperature" name="temperature"></p>
<p><input type="submit" name="submit" value="Submit"></p>
</form>
<hr>
';

main();

function main() {
    switch($_SERVER["REQUEST_METHOD"]) {
        case "GET":
            try {
                echo $GLOBALS["FORM"];
                echo get_data();
            } catch (Exception $exception) {
                echo $exception->getMessage();
            }
            break;
        case "POST":
            try {
                $country = $_POST["country"];
                $temperature = $_POST["temperature"];
                if (!country_exists($country)) {
                    insert_country($country, $temperature);
                } else if ($temperature != "") {
                    update_country($country, $temperature);
                }
                else {
                    delete_country($country);
                }

                echo $GLOBALS["FORM"];
                echo get_data();
            } catch (Exception $exception) {
                echo $exception->getMessage();
            }
            break;
        default:
            echo "Unexpected request method:" . $_SERVER["REQUEST_METHOD"];
            break;
    } 
}

function get_data() {
    $filter = [];
    $manager = new MongoDB\Driver\Manager($GLOBALS["HOST"]);
    $query = new MongoDB\Driver\Query($filter);
    $cursor = $manager->executeQuery(
        $GLOBALS["DATABASE"] . "." . $GLOBALS["COLLECTION"], 
        $query);
    
    $result = "<table><tr><th>ID</th>";
    $result = $result . "<th>Country</th>";
    $result = $result . "<th>Temperature</th></tr>";
    foreach ($cursor as $document) {
        $result = $result . "<tr><td>" . $document->_id . "</td>";
        $result = $result . "<td>" . $document->country . "</td>";
        $result = $result . "<td>" . $document->temperature . "</td></tr>";
    }
    $result = $result . "</table>";
    return $result;
}

function country_exists($country) {
    $manager = new MongoDB\Driver\Manager($GLOBALS["HOST"]);
    $query = [
        "country" => $country
    ];
    $count = [
        "count" => $GLOBALS["COLLECTION"],
        "query" => $query
    ];
    $command = new MongoDB\Driver\Command($count);
    $cursor = $manager->executeReadCommand(
        $GLOBALS["DATABASE"],
        $command);
    $result = current($cursor->toArray())->n;
    return !!$result;
}

function insert_country($country, $temperature) {
    $manager = new MongoDB\Driver\Manager($GLOBALS["HOST"]);
    $bulk = new MongoDB\Driver\BulkWrite;
    $document = [
        "country" => $country,
        "temperature" => $temperature
    ];
    $bulk->insert($document);
    $manager->executeBulkWrite(
        $GLOBALS["DATABASE"] . "." . $GLOBALS["COLLECTION"], 
        $bulk);
}

function update_country($country, $temperature) {
    $manager = new MongoDB\Driver\Manager($GLOBALS["HOST"]);
    $bulk = new MongoDB\Driver\BulkWrite;
    $filter = [
        "country" => $country
    ];
    $update = [
        '$set' => [ "temperature" => $temperature ]
    ];
    $bulk->update($filter, $update);
    $manager->executeBulkWrite(
        $GLOBALS["DATABASE"] . "." . $GLOBALS["COLLECTION"], 
        $bulk);
}

function delete_country($country) {
    $manager = new MongoDB\Driver\Manager($GLOBALS["HOST"]);
    $bulk = new MongoDB\Driver\BulkWrite;
    $filter = [
        "country" => $country
    ];
    $bulk->delete($filter);
    $manager->executeBulkWrite(
        $GLOBALS["DATABASE"] . "." . $GLOBALS["COLLECTION"], 
        $bulk);
}

?>

Try It edit

  1. Use Docker/MongoDB to run a MongoDB server.
  2. Use Docker/PHP and copy and paste the code above to run as the PHP application. Be sure to modify the MongoDB host address to match the address received by your MongoDB server.