Programster's Blog

Tutorials focusing on Linux, programming, and open-source

Getting Started With Using PostgreSQL in PHP

The first thing you need to do is install PHP and support for PostgreSQL. For ubuntu 16.04 you would need to run:

sudo apt-get install php7.0 php7.0-pgsql -y

If you haven't already installed a PostgreSQL server and configured it with a password and to allow remote connections, then do that now.

The script below demonstrates how to:

  • connect to the PostgreSQL server.
  • insert some data
  • grab some data and loop over the results.

Copy and paste the script into a file called script.php before executing it with php script.php.

<?php

define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_PORT', '5432');
define('DB_USER', 'postgres');
define('DB_PASSWORD', 'my_password');

/**
 * Create a new PostgreSQL database connection
 * @param string $host - the IP or FQDN of where the postgreSQL database is hosted.
 * @param string $dbName - the name of the database.
 * @param string $user - the user to connect with
 * @param string $password - the password for that user.
 * @param int $port - the port to connect on (defaults to postgresql default port)
 * @param int $timeout - the number of seconds to wait for a connection before timing out.
 * @param bool $useUtf8 - whether to use UTF8 encoding (defaults to true)
 * @param bool $forceNew - whether to set connection type to PGSQL_CONNECT_FORCE_NEW, which if passed, then a new
 * connection is created, even if the connection_string is identical to an existing connection.
 * @param bool $useAsync - Whether to set PGSQL_CONNECT_ASYNC. If set then the connection is established
 * asynchronously. The state of the connection can then be checked via pg_connect_poll() or pg_connection_status().
 * @return \PgSql\Connection - the connection to the PostgreSQL database (object added in PHP 8.1)
 * @throws Exception - if there was an issue connecting to the database.
 */
function getConnection(
    string $host,
    string $dbName,
    string $user,
    string $password,
    int    $port = 5432,
    int    $timeout = 5,
    bool   $useUtf8 = true,
    bool   $forceNew = false,
    bool   $useAsync = false
)
{
    if ($forceNew && $useAsync)
    {
        $forceNew = false;
    }

    $connString = 
        "host={$host}" 
        . " dbname={$dbName}"
        . " user={$user}" 
        . " password={$password}" 
        . " port={$port}"
        . " connect_timeout={$timeout}";

    if ($useUtf8)
    {
        $connString .= " options='--client_encoding=UTF8'";
    }

    if ($useAsync)
    {
        $connection = pg_connect($connString, PGSQL_CONNECT_ASYNC);
    }
    elseif ($forceNew)
    {
        $connection = pg_connect($connString, PGSQL_CONNECT_FORCE_NEW);
    }
    else
    {
        $connection = pg_connect($connString);
    }

    if ($connection == false)
    {
        throw new \Exception("Failed to initialize database connection.");
    }

    return $connection;
}

$connection = getConnection(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);

$createTableQuery = "CREATE TABLE broker (
    id serial NOT NULL,
    name varchar(255) NOT NULL,
    redirect_url text NOT NULL,
    secret varchar(30) NOT NULL,
    modified_timestamp timestamp DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
)";

$result = pg_query($connection, $createTableQuery);

$insertBrokersQuery = 
    "INSERT INTO broker (name, redirect_url, secret) VALUES " . 
        "('google', 'www.google.com', 'fdg3rgdf3435fhgfvgdf')" . 
        ", ('yahoo', 'www.yahoo.com', 'dfdfweregf33434gdfdd')";

$result = pg_query($connection, $insertBrokersQuery);

$selectBrokersQuery = "SELECT * FROM broker";
$result = pg_query($connection, $selectBrokersQuery);

if (!$result) 
{
    echo "An error occurred.\n";
    print pg_last_error($connection);
    exit;
}

while ($row = pg_fetch_assoc($result)) 
{
    print "row: " . print_r($row, true) . PHP_EOL;
}

print "done" . PHP_EOL;

After reading and executing the script, you should see that it's very much like using mysqli with fetched rows having name/value form.

Last updated: 29th April 2024
First published: 16th August 2018

This blog is created by Stuart Page

I'm a freelance web developer and technology consultant based in Surrey, UK, with over 10 years experience in web development, DevOps, Linux Administration, and IT solutions.

Need support with your infrastructure or web services?

Get in touch