Connecting to PostgreSQL with PHP | by Vahit Saglam | A Young Developer | Medium

PostgreSQL database parameters

Suppose you have the following PostgreSQL database parameters:

The following creates a new database configuration file named config.php that stores the PostgreSQL database parameters:

Enable PostgreSQL driver

The PDO_PGSQL is a driver that implements the PDO interface. It allows you to access PostgreSQL databases from PHP.

To check if the PDO_PGSQL driver is enabled, you open the php.ini file. Typically, the php.ini file is located under the php directory. For example, if you use XAMPP on Windows, you can find the php.ini file under the C:xamppphp directory.

in the php.ini file, you can find the following line:

;extension=php_pdo_pgsql.dll

If you see the comma(;) placed at the beginning of the line, it means that the line is commented and the database driver is not enabled.

To enable the driver, you need to uncomment the line by removing the comma (;) like this:

extension=php_pdo_pgsql.dll

%MINIFYHTML5e2f7a0644dbeff0c865ef173f3a3d8d13%

After that, you need to restart the web server to apply the change.

Connecting to database

The following PHP code shows how to connect to an existing database on a local machine and finally a database connection object will be returned.

Connecting to postgresql with php

Create a table

The following PHP program will be used to create a table in a previously created database −

Delete operation

The following PHP code shows how we can use the DELETE statement to delete any record and then fetch and display the remaining records from our COMPANY table −

Insert operation

The following PHP program shows how we can create records in our COMPANY table created in above example −

Php interface apis

The following are important PHP routines, which can suffice your requirement to work with PostgreSQL database from your PHP program. If you are looking for a more sophisticated application, then you can look into the PHP official documentation.

S. No.API & Description
1

resource pg_connect ( string $connection_string [, int $connect_type ] )

This opens a connection to a PostgreSQL database specified by the connection_string.

If PGSQL_CONNECT_FORCE_NEW is passed as connect_type, then a new connection is created in case of a second call to pg_connect(), even if the connection_string is identical to an existing connection.

2

bool pg_connection_reset ( resource $connection )

This routine resets the connection. It is useful for error recovery. Returns TRUE on success or FALSE on failure.

3

int pg_connection_status ( resource $connection )

This routine returns the status of the specified connection. Returns PGSQL_CONNECTION_OK or PGSQL_CONNECTION_BAD.

4

string pg_dbname ([ resource $connection ] )

This routine returns the name of the database that the given PostgreSQL connection resource.

5

resource pg_prepare ([ resource $connection ], string $stmtname, string $query )

This submits a request to create a prepared statement with the given parameters and waits for completion.

6

resource pg_execute ([ resource $connection ], string $stmtname, array $params )

This routine sends a request to execute a prepared statement with given parameters and waits for the result.

7

resource pg_query ([ resource $connection ], string $query )

This routine executes the query on the specified database connection.

8

array pg_fetch_row ( resource $result [, int $row ] )

This routine fetches one row of data from the result associated with the specified result resource.

9

array pg_fetch_all ( resource $result )

This routine returns an array that contains all rows (records) in the result resource.

10

int pg_affected_rows ( resource $result )

This routine returns the number of rows affected by INSERT, UPDATE, and DELETE queries.

11

int pg_num_rows ( resource $result )

This routine returns the number of rows in a PostgreSQL result resource for example number of rows returned by SELECT statement.

12

bool pg_close ([ resource $connection ] )

This routine closes the non-persistent connection to a PostgreSQL database associated with the given connection resource.

13

string pg_last_error ([ resource $connection ] )

This routine returns the last error message for a given connection.

14

string pg_escape_literal ([ resource $connection ], string $data )

This routine escapes a literal for insertion into a text field.

15

string pg_escape_string ([ resource $connection ], string $data )

This routine escapes a string for querying the database.

Php и postgresql | php

Продолжаю тему работы с базами данных.

В данном посте я рассмотрю работу из PHP с популярной OpenSource СУБД PostgreSQL.

Чаще всего для сайтов в связке с PHP используется база данных MySQL.

Но если для вашего проекта нужна повышенная надёжность и целостность данных, можно использовать PostgreSQL.

К PostgreSQL можно подключаться с помощью pg_connect либо с использованием PDO.

PDO – PHP Data Objects – это модуль PHP, которая дает возможность работы с несколькими базами данных (mysql, postgresql, sqlite, firebird и др.)

pdo 400x350 Как работать из PHP с базой данных PostgreSQL

Работа через PDO в качестве преимущества имеет несколько большую стабильность и возможность обработки исключений.

Сначала рассмотрим подключение с помощью pg_connect

<?
$host='localhost';
$db = 'database';
$username = 'user';
$password = 'password';

# Создаем соединение с базой PostgreSQL с указанными выше параметрами
$dbconn = pg_connect("host=$host port=5432 dbname=$db user=$username password=$password");

if (!$dbconn) {
die('Could not connect');
}
else {
echo ("Connected to local DB");
# Выполняем запрос на создание таблицы testtable

$sql = "CREATE TABLE IF NOT EXISTS testtable (
id serial PRIMARY KEY,
number character varying(20) NOT NULL UNIQUE,
name character varying(20) NOT NULL,
kol character varying(20) NOT NULL
)";

$res = pg_query($sql);
# Сделаем запрос на получение списка созданных таблиц
$res = pg_query($dbconn, "select table_name, column_name from information_schema.columns where table_schema='public'");
if (!$res) {
echo "Произошла ошибка.n";
}
# Выведем список таблиц и столбцов в каждой таблице

while ($row = pg_fetch_row($res)) {
echo "tableName: $row[0] ColumnName: $row[1]";
echo "<br />n";
}

# Добавим в созданную таблицу две строчки

$res = pg_query($dbconn, "INSERT INTO testtable (id,number,name,kol) VALUES(1,'2','Name1','4')");
$res = pg_query($dbconn, "INSERT INTO testtable (id,number,name,kol) VALUES(2,'3','Name2','4')");

# Сделаем запрос на получение строк с id=2
$res = pg_query($dbconn, "select name, kol from testtable where id=2");

# Выведем полученные строки
while ($row = pg_fetch_row($res)) {
echo "Name: $row[0] Kol: $row[1]";
echo "<br />n";
}
}
?>

Вариант подключения с помощью PDO будет выглядеть так:

<?

$host='localhost';
$db = 'database';
$username = 'user';
$password = 'password';


# Создаем соединение с базой PostgreSQL с указанными выше параметрами
$dsn = "pgsql:host=$host;port=5432;dbname=$db;user=$username;password=$password";
try{
$conn = new PDO($dsn);
if($conn){
echo "Connected to the <strong>$db</strong> database successfully!";

# Выполняем запрос на создание таблицы testtable

$sql = "CREATE TABLE IF NOT EXISTS testtable (
id serial PRIMARY KEY,
number character varying(20) NOT NULL UNIQUE,
name character varying(20) NOT NULL,
kol character varying(20) NOT NULL
)";
$conn->exec($sql);
print("Created $table Table.n");

# Сделаем запрос на получение списка созданных таблиц

$res = $conn->query("select table_name, column_name from information_schema.columns where table_schema='public'");

# Выведем список таблиц и столбцов в каждой таблице

while ($row = $res->fetch(PDO::FETCH_ASSOC)){
echo($row["table_name"].'-'.$row["column_name"]);
}

# Добавим в созданную таблицу две строчки
$conn->query("INSERT INTO testtable (id,number,name,kol) VALUES(1,'1', 'Name1','4')");
$conn->query("INSERT INTO testtable (id,number,name,kol) VALUES(2,'2', 'Name2','4')");

# Сделаем запрос на получение строк с id=2
$res = $conn->query("select name, kol from testtable where id=2");

# Выведем полученные строки
while ($row = $res->fetch(PDO::FETCH_ASSOC)){
echo($row["name"].'-'.$row["kol"]);
}

}
}catch (PDOException $e){
echo $e->getMessage();
}

?>

Php: pg_connect – manual

Строка connection_string может быть пустой строкой или содержать
несколько параметров, разделённых пробелами. Каждый параметр указывается как
keyword = value. Пробелы вокруг знака “равно” необязательны.
Пустые строки в качестве значения или значения,
содержащие пробелы отделяются одинарными кавычками, как например, keyword = 'a value'.
Для записи одинарных кавычек и обратных слешей в качестве значений, их необходимо экранировать
обратным слешем, то есть ‘ и \.

Список основных ключевых слов:
host, hostaddr, port,
dbname (значение по умолчанию для параметра user),
user,
password, connect_timeout,
options, tty (игнорируется), sslmode,
requiressl (устарело в связи с использованием параметра sslmode), и
service. Какие из этих аргументов будут обработаны, зависит от версии PostgreSQL.

Параметр options служит для установки параметров командной строки, которые
обработаны сервером.

Postgresql data source name

The data source name or DSN holds database parameters that enable access to a database system. The data source name of the PostgreSQL consists of the following parameters:

  • pgsql: is the DNS prefix.
  • host: the host of the server where the PostgreSQL runs.
  • port: the port to which PostgreSQL listens. The default PostgreSQL’s port is 5432.
  • dbname: the database name that you want to connect to.
  • And other parameters.

The following shows a DSN that connects to dvdrental database in the local PostgreSQL Server, port 5432:

pgsql:host=localhost;port=5432;dbname=dvdrental;

Select operation

The following PHP program shows how we can fetch and display records from our COMPANY table created in above example −

Summary

  • Enable PostgreSQL extension in php.ini file by removing the semicolon (;) from the line extension=php_pdo_pgsql.dll
  • Create a new instance of PDO by passing the data source name (DSN) to its constructor to make a connection to the PostgreSQL database server.

Update operation

The following PHP code shows how we can use the UPDATE statement to update any record and then fetch and display updated records from our COMPANY table −

Зачем нужна авторизация в postgresql

Прежде чем углубиться в вопрос

как

, сделаем шаг назад и зададимся вопросом,

зачем

использовать авторизацию в PostgreSQL.

Для любого приложения или веб-сайта, где пользователи проходят аутентификацию и имеют доступ к различному контенту или могут выполнять отличные друг от друга действия, вам необходима авторизация. При использовании фреймворков, таких, как Rails и Django, документация и комьюнити, как правило, советуют следующее: использовать одного пользователя БД с правами суперпользователя (или правами произвольного чтения/записи).

Затем авторизация реализуется в виде логики и правил в кодовой базе Rails/Django. Если вы добавляете смежные службы, которые работают с одними и теми же данными (например, очереди, background workers, cronjobs, хранилища данных), вам может потребоваться дублировать некоторую логику авторизации в этих службах, или эти службы могут использовать логику авторизации через разделяемые библиотеки или прямое включение в их код (что усложняет разработку, развертывание, продумывание архитектуры и безопасности).

Реализация авторизации в PostgreSQL позволяет определять правила доступа с одном месте (в базе данных), и эти правила буду последовательно применяться ко всем службам и приложениям, которые обращаются к данным в БД. Изучение и использование инструментов авторизации в базе данных естественным образом побуждает использовать отдельные роли с минимальными привилегиями, что ограничивает масштабы и серьезность атак и ошибок.

Еще одно преимущество использования PostgreSQL для авторизации: это мощный, хорошо протестированный инструмент, которые вы уже используете. Вам не нужно самостоятельно внедрять механизмы авторизации (подверженные ошибкам и отнимающие много времени) или заморачиваться с аудитом, интеграцией и обновлениями сторонних библиотек.

Несмотря на приведенные выше аргументы, использование авторизации PostgreSQL подходит не для всех и каждого проекта! Если у вас простое приложение с ограниченной областью действия или у вас аллергия на SQL или его (относительно примитивный) инструментарий, реализовать авторизацию в одном месте на удобном для вас языке, скорее всего, будет быстрее и проще.

Если вам нужна авторизация, которая охватывает множество источников данных и сервисов, вам может понадобиться что-то вроде Zanzibar. Создание авторизации с помощью PostgreSQL — это не панацея, но подход, который стоит рассмотреть в контексте вашего конкретного проекта и команды.

Привилегии

Права доступа на работу с объектами базы данных контролируются привилегиями, управляемыми с помощью команд

GRANTREVOKE

. Мы можем проверить привилегии в psql с помощью команды

dp

=> dp
                                      Access privileges
 Schema |         Name          |   Type   | Access privileges | Column privileges | Policies 
-------- ----------------------- ---------- ------------------- ------------------- ----------
 public | albums                | table    |                   |                   | 
 public | albums_album_id_seq   | sequence |                   |                   | 
 public | artists               | table    |                   |                   | 
 public | artists_artist_id_seq | sequence |                   |                   | 
 public | fan_follows           | table    |                   |                   | 
 public | fans                  | table    |                   |                   | 
 public | fans_fan_id_seq       | sequence |                   |                   |

dt

, мы видим, что «postgres» является владельцем всех таблиц:

=> dt
            List of relations
 Schema |    Name     | Type  |  Owner   
-------- ------------- ------- ----------
 public | albums      | table | postgres
 public | artists     | table | postgres
 public | fan_follows | table | postgres
 public | fans        | table | postgres


Давайте разрешим роли «artist» делать выборку из таблицы с исполнителями, а затем снова проверим привилегии:

Создание регистрации и управления пользователями на сайте с помощью php postgresql

Кстати вот sql код ток почему то мне говарят что он не правильный

/*————————————————————————————————————-

ТАБЛИЦА ПОЛЬЗОВАТЕЛИ

————————————————————————————————————-*/

CREATE TABLE USERS

(

U_LOGIN CHARACTER VARYING(35) PRIMARY KEY,

U_SURN CHARACTER VARYING(45) NOT NULL,

U_NAME CHARACTER VARYING(35) NOT NULL,

U_PATR CHARACTER VARYING(35) NOT NULL,

U_MAIL CHARACTER VARYING(35) UNIQUE,

U_PAS CHARACTER VARYING(16) NOT NULL,

U_FLOOR CHAR(1) NOT NULL,

U_HB DATE NOT NULL,

);

/*————————————————————————————————————-

ТАБЛИЦА РОЛИ

————————————————————————————————————-*/

CREATE TABLE ROLES

(

R_ROLES SERIAL PRIMARY KEY,

R_TITLE CHARACTER VARYING(20) NOT NULL

);

/*————————————————————————————————————-

ТАБЛИЦА ПРИСОВЕНИЯ ПОЛЬЗОВАТЕЛЮ РОЛИ

————————————————————————————————————-*/

CREATE TABLE PPR

(

P_PPR SERIAL PRIMARY KEY,

U_USER INTEGER NOT NULL,

R_ROLES INTEGER NOT NULL,

CONSTRAINT USERS_FKEY FOREIGN KEY (U_USER) REFERENCES USERS,

CONSTRAINT ROLES_FKEY FOREIGN KEY (R_ROLES) REFERENCES ROLES

);

/*————————————————————————————————————-

ТАБЛИЦА ДЕЙСТВИЙ ДОПУТИМЫХ В СИСТЕМЕ

————————————————————————————————————-*/

CREATE TABLE DDVS

(

D_DDVS SERIAL PRIMARY KEY,

D_ACTION CHARACTER VARYING(10) UNIQUE

);

/*————————————————————————————————————-

ТАБЛИЦА ПРИСВОЕНИЕ ДЕЙСТВИЙ РОЛИ

————————————————————————————————————-*/

CREATE TABLE PDR

(

N_PDR SERIAL PRIMARY KEY,

R_ROLES INTEGER NOT NULL,

D_DDVS INTEGER NOT NULL,

CONSTRAINT ROLES_FKEY FOREIGN KEY (R_ROLES)

REFERENCES ROLES (R_ROLES),

CONSTRAINT DDVS_FKEY FOREIGN KEY (D_DDVS)

REFERENCES DDVS (D_DDVS)

);

/*————————————————————————————————————-

ТАБЛИЦА ОБЪЕКТЫ

————————————————————————————————————-*/

CREATE TABLE OBJECTS

(

O_OBJECTS SERIAL PRIMARY KEY,

NAME_O NOT NULL,

CONSTRAINT OBJECTS_PKEY PRIMARY KEY (O_OBJECTS)

);

/*————————————————————————————————————-

ТАБЛИЦА ДЕЙСТВИЙ СВЕРШЕННЫХ НАД ОБЪЕКТОМ

————————————————————————————————————-*/

CREATE TABLE DSNO

(

N_DSNO SERIAL PRIMARY KEY,

O_OBJECTS INTEGER NOT NULL,

N_PDR INTEGER NOT NULL,

CONSTRAINT PDR_FKEY FOREIGN KEY (N_PDR)

REFERENCES PDR (N_PDR),

CONSTRAINT OBJECTS_FKEY FOREIGN KEY (O_OBJECTS)

REFERENCES OBJECTS (O_OBJECTS)

);

/*————————————————————————————————————-
ТАБЛИЦА ЖУРНАЛ
————————————————————————————————————-*/
CREATE TABLE LOG
(
L_LOG SERIAL PRIMARY KEY,
O_OBJECTS INTEGER NOT NULL,
N_DSNO INTEGER NOT NULL,
U_USER INTEGER NOT NULL,
L_DATE DATE,
CONSTRAINT OBJECTS_FKEY FOREIGN KEY (O_OBJECTS)
REFERENCES OBJECTS (O_OBJECTS),
CONSTRAINT USERS_FKEY FOREIGN KEY (U_USER)
REFERENCES USERS (U_USER),
CONSTRAINT DSNO_FKEY FOREIGN KEY (N_DSNO)
REFERENCES DSNO (N_DSNO)
);
скажите где я не так мыслю? пожалуйста

§

Кстати вот sql код ток почему то мне говарят что он не правильный

/*————————————————————————————————————-

ТАБЛИЦА ПОЛЬЗОВАТЕЛИ

————————————————————————————————————-*/

CREATE TABLE USERS

(

U_LOGIN CHARACTER VARYING(35) PRIMARY KEY,

U_SURN CHARACTER VARYING(45) NOT NULL,

U_NAME CHARACTER VARYING(35) NOT NULL,

U_PATR CHARACTER VARYING(35) NOT NULL,

U_MAIL CHARACTER VARYING(35) UNIQUE,

U_PAS CHARACTER VARYING(16) NOT NULL,

U_FLOOR CHAR(1) NOT NULL,

U_HB DATE NOT NULL,

);

/*————————————————————————————————————-

ТАБЛИЦА РОЛИ

————————————————————————————————————-*/

CREATE TABLE ROLES

(

R_ROLES SERIAL PRIMARY KEY,

R_TITLE CHARACTER VARYING(20) NOT NULL

);

/*————————————————————————————————————-

ТАБЛИЦА ПРИСОВЕНИЯ ПОЛЬЗОВАТЕЛЮ РОЛИ

————————————————————————————————————-*/

CREATE TABLE PPR

(

P_PPR SERIAL PRIMARY KEY,

U_USER INTEGER NOT NULL,

R_ROLES INTEGER NOT NULL,

CONSTRAINT USERS_FKEY FOREIGN KEY (U_USER) REFERENCES USERS,

CONSTRAINT ROLES_FKEY FOREIGN KEY (R_ROLES) REFERENCES ROLES

);

/*————————————————————————————————————-

ТАБЛИЦА ДЕЙСТВИЙ ДОПУТИМЫХ В СИСТЕМЕ

————————————————————————————————————-*/

CREATE TABLE DDVS

(

D_DDVS SERIAL PRIMARY KEY,

D_ACTION CHARACTER VARYING(10) UNIQUE

);

/*————————————————————————————————————-

ТАБЛИЦА ПРИСВОЕНИЕ ДЕЙСТВИЙ РОЛИ

————————————————————————————————————-*/

CREATE TABLE PDR

(

N_PDR SERIAL PRIMARY KEY,

R_ROLES INTEGER NOT NULL,

D_DDVS INTEGER NOT NULL,

CONSTRAINT ROLES_FKEY FOREIGN KEY (R_ROLES)

REFERENCES ROLES (R_ROLES),

CONSTRAINT DDVS_FKEY FOREIGN KEY (D_DDVS)

REFERENCES DDVS (D_DDVS)

);

/*————————————————————————————————————-

ТАБЛИЦА ОБЪЕКТЫ

————————————————————————————————————-*/

CREATE TABLE OBJECTS

(

O_OBJECTS SERIAL PRIMARY KEY,

NAME_O NOT NULL,

CONSTRAINT OBJECTS_PKEY PRIMARY KEY (O_OBJECTS)

);

/*————————————————————————————————————-

ТАБЛИЦА ДЕЙСТВИЙ СВЕРШЕННЫХ НАД ОБЪЕКТОМ

————————————————————————————————————-*/

CREATE TABLE DSNO

(

N_DSNO SERIAL PRIMARY KEY,

O_OBJECTS INTEGER NOT NULL,

N_PDR INTEGER NOT NULL,

CONSTRAINT PDR_FKEY FOREIGN KEY (N_PDR)

REFERENCES PDR (N_PDR),

CONSTRAINT OBJECTS_FKEY FOREIGN KEY (O_OBJECTS)

REFERENCES OBJECTS (O_OBJECTS)

);

/*————————————————————————————————————-
ТАБЛИЦА ЖУРНАЛ
————————————————————————————————————-*/
CREATE TABLE LOG
(
L_LOG SERIAL PRIMARY KEY,
O_OBJECTS INTEGER NOT NULL,
N_DSNO INTEGER NOT NULL,
U_USER INTEGER NOT NULL,
L_DATE DATE,
CONSTRAINT OBJECTS_FKEY FOREIGN KEY (O_OBJECTS)
REFERENCES OBJECTS (O_OBJECTS),
CONSTRAINT USERS_FKEY FOREIGN KEY (U_USER)
REFERENCES USERS (U_USER),
CONSTRAINT DSNO_FKEY FOREIGN KEY (N_DSNO)
REFERENCES DSNO (N_DSNO)
);
скажите где я не так мыслю? пожалуйста

Тестовая схема

Теперь, когда мы понимаем, почему мы можем захотеть использовать PostgreSQL для авторизации, рассмотрим, как нам это реализовать. В качестве примера возьмем приложение, похожие на

, где музыкальные исполнители могут публиковать альбомы, а фанаты — находить исполнителей и следить за ними. Возьмем схему «музыкальные исполнители и альбомы» из предыдущей

и немного скорректируем ее, добавив другой тип пользователя (фанаты) и удалив таблицы с «жанрами», чтобы сохранить схему простой и доступной.

Пример схемы с музыкальным исполнителям, альбомам и подписчикам (фанатам).

Похожее:  Перенос публичной части сайта на более новую версию ядра - БагБД

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *