# 在 PostgreSQL 中使用 PHP 处理图像

> 原文： [http://zetcode.com/db/postgresqlpimg/](http://zetcode.com/db/postgresqlpimg/)

在 PostgreSQL PHP 教程的这一章中，我们将使用图像文件。 有些人不同意将图像放入数据库。 在这里，我们只展示如何做。 我们不讨论是否将图像保存在数据库中的技术问题。

```php
testdb=> CREATE TABLE images(id INT PRIMARY KEY, data BYTEA);

```

对于此示例，我们创建一个名为`images`的新表。 对于图像，我们使用`BYTEA`数据类型。 它允许存储二进制字符串。

## 插入图像

在第一个示例中，我们将图像插入 PostgreSQL 数据库。

```php
<?php 

$host = "localhost"; 
$user = "user12"; 
$pass = "34klq*"; 
$db = "testdb"; 

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
    or die ("Could not connect to server\n");

$file_name = "woman.jpg";

$img = fopen($file_name, 'r') or die("cannot read image\n");
$data = fread($img, filesize($file_name));

$es_data = pg_escape_bytea($data);
fclose($img);

$query = "INSERT INTO images(id, data) Values(1, '$es_data')";
pg_query($con, $query); 

pg_close($con); 

?>

```

我们从当前工作目录中读取图像，并将其写入 PostgreSQL `testdb`数据库的图像表中。

```php
$file_name = "woman.jpg";

```

这是我们将插入数据库的图像文件的名称。 该图像位于当前工作目录中。

```php
$img = fopen($file_name, 'r') or die("cannot read image\n");
$data = fread($img, filesize($file_name));

```

我们从文件系统读取二进制数据。

```php
$es_data = pg_escape_bytea($data);

```

二进制数据可能包含一些字符，这些字符可能在将它们插入数据库表时引起问题。 `pg_escape_bytea()`函数对要插入到`bytea field`中的字符串进行转义。 以后，当从数据库中读取二进制数据时，必须对数据进行转义。

```php
fclose($img);

```

指向图像文件的句柄已关闭。

```php
$query = "INSERT INTO images(id, data) Values(1, '$es_data')";
pg_query($con, $query); 

```

图像已插入数据库。

## 读取图像

在本节中，我们将执行相反的操作。 我们将从数据库表中读取图像。

```php
<?php 

$host = "localhost"; 
$user = "user12"; 
$pass = "34klq*"; 
$db = "testdb"; 

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
    or die ("Could not connect to server\n");

$query = "SELECT data FROM images WHERE id=1";
$res = pg_query($con, $query) or die (pg_last_error($con)); 

$data = pg_fetch_result($res, 'data');
$unes_image = pg_unescape_bytea($data);

$file_name = "woman2.jpg";
$img = fopen($file_name, 'wb') or die("cannot open image\n");
fwrite($img, $unes_image) or die("cannot write image data\n");
fclose($img);

pg_close($con); 

?>

```

我们从图像表中读取图像数据并将其写入另一个文件，我们称为`woman2.jpg`。

```php
$query = "SELECT data FROM images WHERE id=1";

```

这行是一条 SQL `SELECT`语句，用于从表中检索图像数据。

```php
$data = pg_fetch_result($res, 'data');

```

我们从`images`表的 data 列中获取数据。

```php
$unes_image = pg_unescape_bytea($data);

```

当我们将图像数据插入数据库时​​，我们对其进行了转义。 现在我们必须将其转义回原始状态。

```php
$file_name = "woman2.jpg";
$img = fopen($file_name, 'wb') or die("cannot open image\n");

```

我们打开一个文件进行写入。 新文件名将为`woman2.jpg`。

```php
fwrite($img, $unes_image) or die("cannot write image data\n");

```

数据被写入文件系统。

PostgreSQL PHP 教程的这一部分专门用于读取和写入图像。