原文: http://zetcode.com/db/postgresqlphp/intro/

在 PostgreSQL PHP 教程的第一章中,我们将提供必要的定义。 我们将展示如何安装 PostgreSQL 数据库和所需的包。 这些示例将使用 PHP CLI 在命令行上运行。

为了运行示例,我们需要安装 PHP 语言(以 PHP CLI 的形式)和 PostgreSQL 数据库。 我们还需要php5-psql包。

关于 PostgreSQL 数据库

PostgreSQL 是一个功能强大的开源对象关系数据库系统。 它是一个多用户数据库管理系统。 它可以在多种平台上运行,包括 Linux,FreeBSD,Solaris,Microsoft Windows 和 Mac OS。 PostgreSQL 由 PostgreSQL 全球开发小组开发。

设置 PostgreSQL

我们必须安装 PostgreSQL 数据库。

  1. $ sudo apt-get install postgresql

在基于 Debian 的系统上,我们可以使用上述命令安装 PostgreSQL 数据库。

  1. $ sudo update-rc.d -f postgresql remove
  2. Removing any system startup links for /etc/init.d/postgresql ...
  3. /etc/rc0.d/K21postgresql
  4. /etc/rc1.d/K21postgresql
  5. /etc/rc2.d/S19postgresql
  6. /etc/rc3.d/S19postgresql
  7. /etc/rc4.d/S19postgresql
  8. /etc/rc5.d/S19postgresql
  9. /etc/rc6.d/K21postgresql

如果我们从包中安装 PostgreSQL 数据库,它将自动添加到操作系统的启动脚本中。 如果我们仅学习使用数据库,则不必在每次引导系统时都启动数据库。 上面的命令删除 PostgreSQL 数据库的所有系统启动链接。

  1. $ /etc/init.d/postgresql status
  2. Running clusters: 9.1/main
  3. $ service postgresql status
  4. Running clusters: 9.1/main

我们检查 PostgreSQL 服务器是否正在运行。 如果没有,我们需要启动服务器。

  1. $ sudo service postgresql start
  2. * Starting PostgreSQL 9.1 database server [ OK ]

在 Ubuntu Linux 上,我们可以使用service postgresql start命令启动服务器。

  1. $ sudo service postgresql stop
  2. [sudo] password for janbodnar:
  3. * Stopping PostgreSQL 9.1 database server [ OK ]

我们使用service postgresql stop命令停止 PostgreSQL 服务器。

  1. $ sudo -u postgres createuser janbodnar
  2. Shall the new role be a superuser? (y/n) n
  3. Shall the new role be allowed to create databases? (y/n) y
  4. Shall the new role be allowed to create more new roles? (y/n) n

我们在 PostgreSQL 系统中创建了一个新角色。 我们允许它具有创建新数据库的能力。 角色是数据库世界中的用户。 角色与操作系统用户是分开的。 我们创建了一个没有-W选项的新用户,例如我们尚未指定密码。 这使我们能够使用该用户连接到数据库,而无需密码验证。 请注意,这仅适用于本地主机。

  1. $ sudo -u postgres createdb testdb -O janbodnar

createdb命令使用所有者 janbodnar 创建一个新的 PostgreSQL 数据库。

PHP CLI

已知 PHP 语言可在 Web 服务器上运行。 但是它也可以在命令行上使用。 PHP 命令行界面(PHP CLI)是一个库,使程序员可以在命令行上使用 PHP。 使用 PHP CLI,我们可以使用 PHP-GTK 构建 GUI 应用,也可以创建简单的测试脚本。 在本教程中,我们将使用命令行 PHP 解释器连接到 PostgreSQL 数据库。

  1. $ sudo apt-get install php5-cli

我们在 Linux 系统上安装 PHP CLI 模块。

php5-pgsql 包

php5-pgsql 是一个使用 PHP 语言与 PostgreSQL 数据库一起使用的包。 在其他系统上,包名称可能不同。

  1. $ sudo apt-get install php5-pgsql

我们启动以上命令来安装包。

处理错误

我们对处理 PHP 中的错误有一个简短的评论。 PHP 具有对错误报告的内置支持。 细节可以在php.ini文件中控制。 请注意,PHP CLI 版本具有单独的 INI 文件。 它位于我们系统上的/etc/php5/cli/php.ini中。

display_errors指令控制是否显示内置错误消息。 在开发环境中,将显示这些错误消息。 在生产中,它们被抑制了。 没有理由向用户显示这些技术消息。 另外,这是潜在的安全风险。

通常,我们应该将更具体的错误消息记录到日志文件中。 log_errors指令控制是否记录错误。 error_log指定应该记录脚本错误的文件的名称。 如果未设置,则默认为 PHP CLI 的stderr

pg_last_error()函数获取连接的最后一条错误消息字符串。 它与内置错误报告中生成的错误消息相同。

在本教程的示例中,我们不使用pg_last_error()函数,因为它复制了内置错误消息。 我们有以下设置:

  1. ...
  2. display_errors = On
  3. ...
  4. log_errors = On
  5. ; Our own custom based log file
  6. error_log = /home/janbodnar/.phpcli_log
  7. ...

我们显示内置错误; 它们显示在命令行上。 错误消息还将记录到指定的日志文件中。 如果我们不想在控制台上显示错误消息,只需关闭display_errors指令即可。

  1. $rs = pg_query($con, $query) or die("Cannot execute query: $query\n");

在脚本中,我们使用die()函数显示一条简单的错误消息,该消息易于理解。 更具体的详细信息将保存到日志文件中。 die()函数也会终止脚本。

版本

在第一个代码示例中,我们将获取 PostgreSQL 数据库的版本。

  1. <?php
  2. $host = "localhost";
  3. $user = "user12";
  4. $pass = "34klq*";
  5. $db = "testdb";
  6. $con = pg_connect("host=$host dbname=$db user=$user password=$pass")
  7. or die ("Could not connect to server\n");
  8. $query = "SELECT VERSION()";
  9. $rs = pg_query($con, $query) or die("Cannot execute query: $query\n");
  10. $row = pg_fetch_row($rs);
  11. echo $row[0] . "\n";
  12. pg_close($con);
  13. ?>

在上面的 PHP 脚本中,我们连接到先前创建的testdb数据库。 我们执行一条 SQL 语句,该语句返回 PostgreSQL 数据库的版本。

  1. $host = "localhost";
  2. $user = "user12";
  3. $pass = "34klq*";
  4. $db = "testdb";

这些是连接字符串变量。 要创建到 PostgreSQL 数据库的连接,我们必须提供主机名,用户名和密码以及数据库名。

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

我们连接到数据库服务器。 如果无法创建连接,则die()函数将终止脚本并将错误消息打印到控制台。 pg_connect()函数返回连接资源,该资源将在以后与其他模块功能一起使用。

  1. $query = "SELECT VERSION()";

该 SQL 语句选择 PostgreSQL 数据库的版本。

  1. $rs = pg_query($con, $query) or die("Cannot execute query: $query\n");

使用pg_query()函数执行查询。

  1. $row = pg_fetch_row($rs);

我们从返回的结果中获取数据。

  1. echo $row[0] . "\n";

我们将检索到的数据打印到控制台。 数据以 PHP 数组的形式返回。 数组的第一个元素是我们要查找的字符串。

  1. pg_close($con);

使用pg_close()函数关闭与数据库的连接。

  1. $ php version.php
  2. PostgreSQL 9.1.3 on i686-pc-linux-gnu, compiled by gcc-4.6.real
  3. (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1, 32-bit

运行version.php脚本。

插入数据

我们将创建一个cars表并在其中插入几行。

  1. <?php
  2. $host = "localhost";
  3. $user = "user12";
  4. $pass = "34klq*";
  5. $db = "testdb";
  6. $con = pg_connect("host=$host dbname=$db user=$user password=$pass")
  7. or die ("Could not connect to server\n");
  8. $query = "DROP TABLE IF EXISTS cars";
  9. pg_query($con, $query) or die("Cannot execute query: $query\n");
  10. $query = "CREATE TABLE cars(id INTEGER PRIMARY KEY, mame VARCHAR(25), price INT)";
  11. pg_query($con, $query) or die("Cannot execute query: $query\n");
  12. $query = "INSERT INTO cars VALUES(1,'Audi',52642)";
  13. pg_query($con, $query) or die("Cannot execute query: $query\n");
  14. $query = "INSERT INTO cars VALUES(2,'Mercedes',57127)";
  15. pg_query($con, $query) or die("Cannot execute query: $query\n");
  16. $query = "INSERT INTO cars VALUES(3,'Skoda',9000)";
  17. pg_query($con, $query) or die("Cannot execute query: $query\n");
  18. $query = "INSERT INTO cars VALUES(4,'Volvo',29000)";
  19. pg_query($con, $query) or die("Cannot execute query: $query\n");
  20. $query = "INSERT INTO cars VALUES(5,'Bentley',350000)";
  21. pg_query($con, $query) or die("Cannot execute query: $query\n");
  22. $query = "INSERT INTO cars VALUES(6,'Citroen',21000)";
  23. pg_query($con, $query) or die("Cannot execute query: $query\n");
  24. $query = "INSERT INTO cars VALUES(7,'Hummer',41400)";
  25. pg_query($con, $query) or die("Cannot execute query: $query\n");
  26. $query = "INSERT INTO cars VALUES(8,'Volkswagen',21606)";
  27. pg_query($con, $query) or die("Cannot execute query: $query\n");
  28. pg_close($con);
  29. ?>

上面的脚本创建一个Cars表,并将 8 行插入到该表中。

  1. $query = "DROP TABLE IF EXISTS cars";
  2. pg_query($con, $query) or die("Cannot execute query: $query\n");

如果汽车表已经存在,我们将其删除。 pg_query()函数在指定的数据库连接上执行给定查询。

  1. $query = "CREATE TABLE cars(id INTEGER PRIMARY KEY, mame VARCHAR(25), price INT)";

该 SQL 语句创建一个新的 cars 表。 该表有三列。

  1. $query = "INSERT INTO cars VALUES(1,'Audi',52642)";
  2. pg_query($con, $query) or die("Cannot execute query: $query\n");
  3. $query = "INSERT INTO cars VALUES(2,'Mercedes',57127)";
  4. pg_query($con, $query) or die("Cannot execute query: $query\n");

我们要把两辆车插入表。

  1. pg_close($con);

与数据库的连接已关闭。

  1. $ psql testdb
  2. psql (9.1.3)
  3. Type "help" for help.
  4. testdb=# SELECT * FROM cars;
  5. id | name | price
  6. ----+------------+--------
  7. 1 | Audi | 52642
  8. 2 | Mercedes | 57127
  9. 3 | Skoda | 9000
  10. 4 | Volvo | 29000
  11. 5 | Bentley | 350000
  12. 6 | Citroen | 21000
  13. 7 | Hummer | 41400
  14. 8 | Volkswagen | 21606
  15. 9 | BMW | 36000
  16. (9 rows)

我们使用psql工具验证写入的数据。

预备语句

现在,我们将以预备语句来关注自己。 在编写预备语句时,我们使用占位符,而不是直接将值写入语句中。 预准备的语句可提高安全性和性能。

预备语句是可用于优化性能的服务器端对象。 准备查询后,将对其进行解析,重写和计划。 以后只需要执行预备语句。 因此,解析,重写和计划阶段仅执行一次,而不是每次执行语句时。 准备的语句仅在当前数据库会话期间持续。 会话结束时,预备语句将被遗忘,因此必须在重新使用之前重新创建它。

  1. $host = "localhost";
  2. $user = "user12";
  3. $pass = "34klq*";
  4. $db = "testdb";
  5. $id = 9;
  6. $name = "BMW";
  7. $price = 36000;
  8. $con = pg_connect("host=$host dbname=$db user=$user password=$pass")
  9. or die ("Could not connect to server\n");
  10. $query = "INSERT INTO cars VALUES($1, $2, $3)";
  11. pg_prepare($con, "prepare1", $query)
  12. or die ("Cannot prepare statement\n");
  13. pg_execute($con, "prepare1", array($id, $name, $price))
  14. or die ("Cannot execute statement\n");
  15. echo "Row successfully inserted\n";
  16. pg_close($con);

我们向汽车表添加一行。 我们使用预备查询。

  1. $id = 9;
  2. $name = "BMW";
  3. $price = 36000;

我们有三个变量将用于构建查询。 这些值可以例如来自网络表单。

  1. $query = "INSERT INTO cars VALUES($1, $2, $3)";

这是带有$1$2$3占位符的 SQL 查询。 占位符将在以后填充。

  1. pg_prepare($con, "prepare1", $query)
  2. or die ("Cannot prepare statement\n");

在这里,我们通过调用pg_prepare()函数准备查询。 函数的第二个参数是预备语句的名称。 每个连接必须唯一。 预备语句更快,并且可以防止 SQL 注入攻击。

  1. pg_execute($con, "prepare1", array($id, $name, $price))
  2. or die ("Cannot execute statement\n");

pg_execute()函数发送一个请求,以执行带有给定参数的预备语句,并等待结果。 这些值绑定到占位符。

  1. $ php prepared.php
  2. Row successfully inserted
  3. testdb=# SELECT * FROM cars;
  4. id | name | price
  5. ----+------------+--------
  6. 1 | Audi | 52642
  7. 2 | Mercedes | 57127
  8. 3 | Skoda | 9000
  9. 4 | Volvo | 29000
  10. 5 | Bentley | 350000
  11. 6 | Citroen | 21000
  12. 7 | Hummer | 41400
  13. 8 | Volkswagen | 21606
  14. 9 | BMW | 36000
  15. (9 rows)

我们在表上放了一辆新车。

数据来源

创建本教程时,请参考 PostgreSQL PHP 手册PostgreSQL 文档

这是 PostgreSQL PHP 教程的介绍性章节。