Hướng dẫn php check postgresql connection

Việc kết nối tới PostgreSQL Database để lấy dữ liệu là rất dễ dàng. Với PHP có 2 cách để kết nối như sau:

Nội dung chính

  • 1. Sử dụng hàm pg_connect() của PHP
  • Kích hoạt Extension pgsql của PHP
  • Kết nối tới PostgreSQL Database sử dụng hàm pg_connect()
  • 2. Sử dụng class PDO của PHP
  • Kết nối tới PostgreSQL Database sử dụng hàm PDO

1. Sử dụng hàm pg_connect() của PHP

Kích hoạt Extension pgsql của PHP

Để sử dụng hàm được hàm pg_connect() của PHP chúng ta cần kích hoạt 1 extension của PHP là: pgsql

Sửa file php.ini và mở comment của dòng sau:

– Trên Windows:

extension=php_pgsql.dll

– Trên Linux:

extension=pgsql.so

Sau đó restart lại php-fpm hoặc apache để cập nhật config.

Kiểm tra php đã có kích hoạt module pgsql chưa? Chúng ta sử dụng command sau:

php -m | grep pgsql

Nếu kết quả như sau tức là module pgsql của PHP đã hoạt động.

Kết nối tới PostgreSQL Database sử dụng hàm pg_connect()

Tham khảo đoạn code sau:

 port= dbname= user= password=");
if (!$dbConn) {
    echo "An error occurred.\n";
    exit;
}

// Query data
$result = pg_query($dbConn, 'SELECT * FROM hr_employee');
if (!$result) {
    echo "An error occurred.\n";
    exit;
}

// Show value
while ($row = pg_fetch_assoc($result)) {
    var_dump($row);
}

Với:

  • : Là hostname hoặc địa chỉ IP của PostgreSQL Databasee
  • : PostgreSQL Port, mặc định là 5432
  • : Database name
  • : Database Username
  • : Mật khẩu của Database Username

2. Sử dụng class PDO của PHP

Hãy chắc chắn rằng PDO module của PHP đã được kích hoạt. Nếu không hãy sửa fle php.ini và bỏ comment dòng sau:

– Trên Windows:

extension=php_pdo_pgsql.dll

– Trên Linux là mặc định được kích hoạt

Kết nối tới PostgreSQL Database sử dụng hàm PDO

Tham khảo đoạn code sau:

 \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];

// Query string
$dsn = "pgsql:host=;dbname=";

try {
    // Create pdo connection
    $myPdo = new \PDO($dsn, , , $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

// Query
$result = $myPdo->query("SELECT * FROM hr_employee");

// Loop query
foreach ($result as $key => $row) {
    print "{$row['name']}: {$row['gender']}
"; }

Nguồn: vinasupport.com

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_connectOpen a PostgreSQL connection

Description

pg_connect(string $connection_string, int $flags = 0): PgSql\Connection|false

If a second call is made to pg_connect() with the same connection_string as an existing connection, the existing connection will be returned unless you pass PGSQL_CONNECT_FORCE_NEW as flags.

The old syntax with multiple parameters $conn = pg_connect("host", "port", "options", "tty", "dbname") has been deprecated.

Parameters

connection_string

The connection_string can be empty to use all default parameters, or it can contain one or more parameter settings separated by whitespace. Each parameter setting is in the form keyword = value. Spaces around the equal sign are optional. To write an empty value or a value containing spaces, surround it with single quotes, e.g., keyword = 'a value'. Single quotes and backslashes within the value must be escaped with a backslash, i.e., \' and \\.

The currently recognized parameter keywords are: host, hostaddr, port, dbname (defaults to value of user), user, password, connect_timeout, options, tty (ignored), sslmode, requiressl (deprecated in favor of sslmode), and service. Which of these arguments exist depends on your PostgreSQL version.

The options parameter can be used to set command line parameters to be invoked by the server.

flags

If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection is created, even if the connection_string is identical to an existing connection.

If PGSQL_CONNECT_ASYNC is given, then the connection is established asynchronously. The state of the connection can then be checked via pg_connect_poll() or pg_connection_status().

Return Values

Returns an PgSql\Connection instance on success, or false on failure.

Examples

Example #1 Using pg_connect()

$dbconn pg_connect("dbname=mary");
//connect to a database named "mary"$dbconn2 pg_connect("host=localhost port=5432 dbname=mary");
// connect to a database named "mary" on "localhost" at port "5432"$dbconn3 pg_connect("host=sheep port=5432 dbname=mary user=lamb password=foo");
//connect to a database named "mary" on the host "sheep" with a username and password$conn_string "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 pg_connect($conn_string);
//connect to a database named "test" on the host "sheep" with a username and password$dbconn5 pg_connect("host=localhost options='--client_encoding=UTF8'");
//connect to a database on "localhost" and set the command line parameter which tells the encoding is in UTF-8
?>

See Also

  • pg_pconnect() - Open a persistent PostgreSQL connection
  • pg_close() - Closes a PostgreSQL connection
  • pg_host() - Returns the host name associated with the connection
  • pg_port() - Return the port number associated with the connection
  • pg_tty() - Return the TTY name associated with the connection
  • pg_options() - Get the options associated with the connection
  • pg_dbname() - Get the database name

tim at buttersideup dot com

14 years ago

It's not explicitly stated here, but you can also connect to PostgreSQL via a UNIX domain socket by leaving the host empty.  This should have less overhead than using TCP e.g.:

$dbh = new PDO('pgsql:user=exampleuser dbname=exampledb password=examplepass');

In fact as the C library call PQconnectdb underlies this implementation, you can supply anything that this library call would take - the "pgsql:" prefix gets stripped off before PQconnectdb is called, and if you supply any of the optional arguments (e.g. user), then these arguments will be added to the string that you supplied...  Check the docs for your relevant PostgreSQL client library: e.g.

http://www.postgresql.org/docs/8.3/static/libpq-connect.html

If you really want, you can use ';'s to separate your arguments - these will just be converted to spaces before PQconnectdb is called.

Tim.

lukasz dot wolczak at gmail dot com

6 years ago

It is worth to know, that you can set application_name in connection string, consider this simple example:

$appName = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$connStr = "host=localhost port=5432 dbname=postgres user=postgres options='--application_name=$appName'";//simple check
$conn = pg_connect($connStr);
$result = pg_query($conn, "select * from pg_stat_activity");
var_dump(pg_fetch_all($result));?>

By doing this move on cli or cgi you can see in pgAdmin what scripts are running or what requests are running on database. You can extend configuration of postgres to track slow queries and print application name to logs. It was very usuful to me to find out what and where should I optimize.

matias at nospam dot projectcast dot com

20 years ago

At least with Postgres 7.2, connecting to local postgresdatabase requires a user in the database with the same name as the user running apache, or the connection fails.

Anonymous

7 years ago

Getting md5 passwords was confusing because of a lack of documentation:

- set up your pg_hba.conf in order to use md5 password instead of 'trust' or 'ident'
- check if your postgres.conf has 'password_encryption=on' (depending on the version this might already be 'on').
- make sure to restart your postgres process.
- in PHP you just supply the username and password in _plain_ text:
'host=localhost port=5432 dbname=megadb user=megauser password=holyhandbagsbatmanthispasswordisinplaintext'
The postgres PHP library will automagically do the md5 encoding for you, no need to do it yourself.

thakur at corexprts dot com

11 years ago

One thing is to remember, whenever trying to use pg_connect, add the timeout parameter with it

$d=pg_connect('host=example.com user=pgsql dbname=postgres connect_timeout=5');
?>

Dave

9 years ago

If you use pgbouncer and unix socket
and you pgbouncer.ini looks like this
listen_port = 6432
unix_socket_dir = /tmp

you connect like this

pg_connect('host=/tmp port=6432 dbname=DB user=USER password=PASS');

Anonymous

17 years ago

The values accepted by pg_connect's sslmode argument are: disable, allow, prefer, require

VLroyrenn

3 years ago

For what it's worth, it should be noted that, while PHP will generally handle connection-reuse for you so long as you keep using the same connection strings, as in the following example:

$before_conn1 = microtime(true);
$db1 = pg_connect($conn_string);$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(

$before_conn2 - $before_conn1); // Takes ~0.03s
echo("\n");
echo(
$after_conn2 - $before_conn2); // Takes 0s
?>

...as nice as it would have been, this does not hold true for async connections; you have to manage those yourself and you can't follow up an async connection with a blocking one later on as an easy way to wait for the connection process to complete before sending queries.

$before_conn1 = microtime(true);
$db1 = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
sleep(1);$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(

$before_conn2 - $before_conn1); // Takes ~1s
echo("\n");
echo(
$after_conn2 - $before_conn2); // Takes ~0.025s
?>

gutostraube at gmail dot com

12 years ago

It's possible connect to a PostgreSQL database via Unix socket using the pg_connect() function by the following two ways:

1) Using the socket path:

$conn = pg_connect('host=/var/run/postgresql user=username dbname=databasename');
?>

2) Omitting the host name/path:

$conn = pg_connect('user=username dbname=databasename');
?>

Note: in this case (omitting the host value), the default socket path will be used.

bgalloway at citycarshare dot org

14 years ago

Beware about writing something like
function getdb_FAILS() {
    return
pg_connect("...") or die('connection failed');
}
?>

It will return a boolean.  This will appear to be fine if you don't use the return value as a db connection handle, but will fail if you do.

Instead, use:
function getdb() {
   
$db = pg_connect("...") or die('connection failed');
    return
$db;
}
?>

which actually returns a handle.

phpnet at benjamin dot schulz dot name

18 years ago

if you need to open a new connection handle (i.e. for multiple pg_send_query()) use PGSQL_CONNECT_FORCE_NEW as second parameter to pg_connect()

kayotix at yahoo dot com

21 years ago

Little note that is buried in the install somewhere.  In Php 3, PostgreSQL support was activated by adding --with-postgresql=[DIR] to the options passed to ./configure.  With Php 4.0.2 (on Linux) the parameter was --with-pgsql.  The only place I found this was in the installing PHP on Unix section of the manual.

leace at post dot cz

22 years ago

If you use PostgreSQL users for authenticating into your pg database rather than using your own authentication, always specify host directive in pg_connect and edit pg_hba.conf to authenticate from this host accordingly. Otherwise, PHP will connect as 'local' using UNIX domain sockets, which is set in pg_hba.conf to 'trust' by default (so you can connect using psql on console without specifying password) and everyone can connect to db _without password_ .

floriparob at gmail dot com

6 years ago

Using the "service" parameter as the connection string -- we found that the following functions:-

putenv("PGSERVICEFILE=/path/to/your/service/file/pg_service.conf");
$connect_string = ("service=testdb");
try {
   $pgconn_handle = pg_connect($connect_string);
   . . . . . etc.

Note:-
1) the environment variable has to point to the path AND file name.
2) the file has to be readable by Apache.

See:-

https://www.postgresql.org/docs/9.6/static/libpq-pgservice.html

for how to create your pg_service.conf

xzilla at users dot sourceforge dot net

18 years ago

regarding the note from  matias at nospam dot projectcast dot com
on 12-Feb-2002 01:16, you do not need a user in the database with the same name a your web user with ANY version of postgresql.  The only time that would be a requirement ifs if you set your postgresql server to only allow IDENT based authentication  (which IIRC is the default on Red Hat systems, which might be what lead to the confusion).  For more info on the various authentication methods allowed by postgresql, check out http://www.postgresql.org/docs/7.4/static/client-authentication.html

Cybertinus

18 years ago

If you use pg_connect('host=localhost port=5432 user=my_username password=my_password dbname=my_dbname') and you get the following error:
"Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Connection refused Is the server running on host localhost and accepting TCP/IP connections on port 5432?"
then you should try to leave the host= and port= parts out of the connection string. This sounds strange, but this is an "option" of Postgre. If you have not activated the TCP/IP port in postgresql.conf then postgresql doesn't accept any incoming requests from an TCP/IP port. If you use host= in your connection string you are going to connect to Postgre via TCP/IP, so that's not going to work. If you leave the host= part out of your connection string you connect to Postgre via the Unix domain sockets, which is faster and more secure, but you can't connect with the database via any other PC as the localhost.

Anonymous

7 years ago

If you get the following warning :
"Warning: pg_connect(): Unable to connect to PostgreSQL server: could not translate host name "server.your.trying.to.connect.to" to address:"
and the server you are trying to connect to is fine and the connecting itself should be working fine,
it might be the case that the postgres extension for PHP might be confused about something.
Try to restart your Apache to reinitialize the extension.

derry at siliconriver.com dot au

19 years ago

pg_connect seems to support SSL connections, on systems where Postgres has been compiled with ssl, i'm assuming this is since psql uses libpq to connect.
pg_connect can successfully connect, and use the "requiressl" argument.

Sohel Taslim

15 years ago

I got the same problem but I have to solve that in different way.
In my postgresql.conf file the following was commented.
So, I active that under Connection Settings-

# - Connection Settings –
tcpip_socket = true

rolf at sir-wum dot de

20 years ago

pg_connect() won't work with the authentication method 'crypt' in the pg_hba.conf. Took me an hour to figure that out till I remeberd some other issues with windows missing the crypt() call.

borovik -at- gmail

15 years ago

"If you use pg_connect('host=localhost port=5432 user=my_username password=my_password dbname=my_dbname') and you get the following error:
"Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Connection refused Is the server running on host localhost and accepting TCP/IP connections on port 5432?"
"
I solved this error just by setting listen_addresses = '*' in the postgresql.conf file. This error occurs probably despite of a name resolution to localhost, given in the "host" parameter. So you can set the host in the pg_connect() function.

xourge

15 years ago

remember that when you use a blank password there will be an error because of:
password= dbname= (...)
to fix this problem use '' in your $options variable
example:

$options = " host='localhost' port='5432' user='postgres' password='' dbname='test' ";
pg_connect($options);

*** careful: I used double ' after password=, not "

dreamsoundaudio at gmail dot com

11 years ago

Ubuntu/Debian users, specifically server versions: If you used Tasksel to build PostgreSQL, and you're banging your head against the wall with the "Fatal error: Call to undefined function pg_connect()" error, check that php5-pgsql is installed.

Tasksel apparently doesn't install it.

Anonymous

4 years ago

class Baza {
    const
DNS='mysql:host=localhost;dbname=news;charset=utf8';
    const
UZYTKOWNIK='root';
    const
HASLO='';

        public

$klient;

        function

__construct(){
       
$this->polacz();
    }
    public function
polacz(){
    try{
       
$this->klient=new PDO(
           
self::DNS,
           
self::UZYTKOWNIK,
           
self::HASLO
       
);
    }
    catch (
PDOException $e){
        die(
'Wystąpił następujący błąd bazy danych: '.$e->getMessage());
    }
    return
true;
    }
}

infotirona at yahoo dot com

12 years ago

It's strange how this "Fatal error: Call to undefined function pg_connect()" happens(when everything else is OK) in PHP version 5.3.3.

I was trying to connect to my db when I got that error message the firs time. My extensions path was OK, pgsql extension  should have been loaded from php.ini(i had enabled it before), Apache started-up without errors, but i still had the "Fatal error: Call to undefined function pg_connect()" message when i tried to connect.
Seaching a bit around i found something about dll libraries not working as they should, so deleted the new 5.3.3 version, downloaded the PHP 5.2.5 and configured it.

I'm using Windows XP Home SP3, Apache 2.2, PHP 5.2.5 and everything works fine now... ;)