PostgreSQL PHP: Querying Data
Summary: in this tutorial, you will learn to query data from the PostgreSQL database in PHP using PDO.
Querying all rows in a table
To query all rows from a table in the PostgreSQL database, you use the following steps:
- First, connect to the PostgreSQL database by creating a new PDO object.
- Second, call the query() method of the PDO object. The query() method accepts a SELECT statement as the argument. The query method returns a PDOStatement object.
- Third, fetch the next rows from the result by calling the fetch() method of the PDOstatement object. The fetch_style argument of the fetch() method controls how the result returned. For example, the PDO::FETCH_ASSOC instructs the fetch() method to return the result set as an array indexed by column name.
We will use the stocks table created in the creating table tutorial for the demonstration. Let’s create a new class StockDB for storing all the methods that select data from the stocks table.
The following all() method selects all rows in the stocks table.
/** * Return all rows in the stocks table * @return array */ public function all() < $stmt = $this->pdo->query('SELECT id, symbol, company ' . 'FROM stocks ' . 'ORDER BY symbol'); $stocks = []; while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) < $stocks[] = [ 'id' => $row['id'], 'symbol' => $row['symbol'], 'company' => $row['company'] ]; > return $stocks; >
Code language: PHP (php)
To test the all() method, we use the following code in the index.php file.
use PostgreSQLTutorial\Connection as Connection; use PostgreSQLTutorial\StockDB as StockDB; try < // connect to the PostgreSQL database $pdo = Connection::get()->connect(); // $stockDB = new StockDB($pdo); // get all stocks data $stocks = $stockDB->all(); > catch (\PDOException $e) < echo $e->getMessage(); > ?>Stock List
Code language: SQL (Structured Query Language) (sql) ID Symbol Company
The first part of the index.php is to connect to the PostgreSQL database and get all rows in the stocks table. The second part shows the data in HTML format.
The following screenshot illustrates the output of the index.php file.
Querying a specific row in a table
To query a specific row in a table, you use the following steps:
- First, connect to the PostgreSQL database by creating a new PDO object.
- Next, prepare the SELECT statement for execution by calling the prepare() method of the PDO object. The prepare() method returns an instance of the PDOStatement class.
- Then, bind the values to the statement by using the bindValue() method.
- After that, execute the SELECT statement by calling the execute() method of the PDOStatement object.
- Finally, fetch the next row in the result using the fetch() method. If the SELECT statement returns 1 row, you can use the fetchObject() method to return an object.
The following findByPK() method selects a row in the stocks table based on a specified id and returns a Stock object.
/** * Find stock by id * @param int $id * @return a stock object */ public function findByPK($id) < // prepare SELECT statement $stmt = $this->pdo->prepare('SELECT id, symbol, company FROM stocks WHERE // bind value to the :id parameter $stmt->bindValue(':id', $id); // execute the statement $stmt->execute(); // return the result set as an object return $stmt->fetchObject(); >
Code language: PHP (php)
To test the findByPK() method, we create a new PHP file named stock.php .
require 'vendor/autoload.php'; use PostgreSQLTutorial\Connection as Connection; use PostgreSQLTutorial\StockDB as StockDB; try < // connect to the PostgreSQL database $pdo = Connection::get()->connect(); // $stockDB = new StockDB($pdo); // get all stocks data $stock = $stockDB->findByPK(1); var_dump($stock); > catch (\PDOException $e) < echo $e->getMessage(); >
Code language: PHP (php)
Run the stock.php file, we get the following result.
object(stdClass)[6] public 'id' => int 1 public 'symbol' => string 'MSFT' (length=4) public 'company' => string 'Microsoft Corporation' (length=21)
Code language: PHP (php)
In this tutorial, you have learned various ways to query data from the tables in the PostgreSQL database using PHP PDO.
pg_query
pg_query() выполняет query к указанной в connection базе данных. pg_query_params() должна быть предпочтительнее в большинстве случаев.
В случае возникновения ошибки функция возвращает false , детали ошибки можно получить с помощью функции pg_last_error() , если соединение с БД не нарушено.
Замечание: Несмотря на то, что параметр connection может быть опущен, делать так не рекомендуется, так как это может привести к трудно находимым ошибкам в скриптах.
Замечание:
Ранее данная функция называлась pg_exec() . pg_exec() всё ещё доступна в целях обеспечения совместимости, но лучше использовать новое имя.
Список параметров
Экземпляр PgSql\Connection . Если connection не указано, используется соединение по умолчанию. Соединение по умолчанию — это последнее соединение, выполненное с помощью функций pg_connect() или pg_pconnect() .
Начиная с версии PHP 8.1.0, использование соединения по умолчанию устарело.
Выражение или выражения SQL для выполнения. Если передано несколько выражений они автоматически выполняются, как одна транзакция если явно не указаны команды BEGIN/COMMIT внутри выражения. Тем не менее, использовать несколько транзакций в одном вызове функции не рекомендуется.
Строковое представление пользовательских данных очень опасно и часто приводит к возможности SQL инъекции. В большинстве случаев лучше передавать пользовательские данные параметром в pg_query_params() , а не подставлять их в строку запроса.
Любые данные передаваемые от пользователя непосредственно в строку запроса должны быть хорошо экранированы.
Возвращаемые значения
Экземпляр PgSql\Result в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
8.1.0 | Возвращает экземпляр PgSql\Result ; ранее возвращался ресурс (resource). |
8.1.0 | Параметр connection теперь ожидает экземпляр PgSql\Connection ; ранее ожидался ресурс (resource). |
Примеры
Пример #1 Пример использования pg_query()
$conn = pg_pconnect ( «dbname=publisher» );
if (! $conn ) echo «Произошла ошибка.\n» ;
exit;
>
$result = pg_query ( $conn , «SELECT author, email FROM authors» );
if (! $result ) echo «Произошла ошибка.\n» ;
exit;
>
while ( $row = pg_fetch_row ( $result )) echo «Автор: $row [ 0 ] E-mail: $row [ 1 ] » ;
echo «
\n» ;
>
Пример #2 Использование нескольких выражений в pg_query()
$conn = pg_pconnect ( «dbname=publisher» );
// эти выражения будут исполнены в одной транзакции
$query = «UPDATE authors SET author=UPPER(author) WHERE > ;
$query .= «UPDATE authors SET author=LOWER(author) WHERE > ;
$query .= «UPDATE authors SET author=NULL WHERE > ;
Смотрите также
- pg_connect() — Открывает соединение с базой данных PostgreSQL
- pg_pconnect() — Открывает постоянное соединение с сервером PostgreSQL
- pg_fetch_array() — Возвращает строку результата в виде массива
- pg_fetch_object() — Выбирает строку результата запроса и возвращает данные в виде объекта
- pg_num_rows() — Возвращает количество строк в выборке
- pg_affected_rows() — Возвращает количество затронутых запросом записей (кортежей)
Выполнение SQL-запросов в БД PostgreSQL на PHP
Краткое руководство по выполнению SQL-запросов с использованием языка PHP в базе данных PostgreSQL.
За основу берём скрипт подключения PHP к СУБД PostgreSQL, так как в нём прописано условие, которое при ошибке подключения выводит соответствующее сообщение.
Само по себе успешное подключение предполагает дальнейшую работу с базой данных. Поэтому вместо строчки
echo "Подключение к БД прошло успешно…";
можно начинать писать скрипт.
Запрос может быть любым. В нашем примере запрос будет выбирать все колонки и строки из таблицы shop_goods:
Для начала необходимо сформировать начальную структуру документа при помощи конструкции echo()
echo(' ');
Определим необходимый нам запрос и объявим для него переменную $query
$query = pg_query($db_connect, "SELECT * FROM shop_goods");
Далее проверим условием if, выполняется ли запрос — если не выполняется, выводим соответствующую ошибку:
Затем циклом while обходим строки таблицы:
while ($result = pg_fetch_array($query)) < echo ". - - рублей - штук
"; >
Этот цикл позволит вывести результаты запроса.
После этого закрываем теги документа:
чистим результаты запроса и закрываем соединение с базой данных:
pg_free_result($query); pg_close();
Полностью рабочий скрипт будет выглядеть примерно так:
echo(' '); $query = pg_query($db_connect, "SELECT * FROM shop_goods"); if (!$query) < die ("Ошибка выполнения запроса"); >while ($result = pg_fetch_array($query)) < echo ". - - рублей - штук
"; > echo(' '); pg_free_result($query); pg_close(); ?>
Результат выполнения данного скрипта будет выглядеть так:
1. Ноутбук ASUS VivoBook A540L - Ноутбуки - 15000.00 рублей - 10 штук 2. МФУ Kyocera Ecosys M2535fdn - МФУ - 22000.00 рублей - 5 штук 3. Сумка для ноутбука 15-дюймов, серая - Сумки и чехлы - 3500.00 рублей - 6 штук 4. Картридж Cactus CS-CE285A - Картриджи - 950.00 рублей - 15 штук 5. SSD диск GIGABYTE 2.5" 256 Гб SATA III NAND TLC (GP-GSTFS31256GTND) - SSD-диски - 3000.00 рублей - 18 штук 6. USB флешка 64Gb Kingston DTX/64Gb USB 3.2 Gen 1 (USB 3.0) - USB-диски, флешки - 750.00 рублей - 35 штук 7. USB флешка 128Gb Kingston DTX/128Gb USB 3.2 Gen 1 (USB 3.0) - USB-диски, флешки - 1300.00 рублей - 25 штук 8. Телевизор Samsung UE50TU8000UX, 4K Ultra HD, черный - Телевизоры - 46800.00 рублей - 3 штук 9. Кронштейн ONKRON M15, для LCD телевизора 32"-75", черный - Кронштейны - 4100.00 рублей - 8 штук 10. Телевизор LG 43LM5700PLA, черный - Телевизоры - 32000.00 рублей - 7 штук