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

元数据是有关数据库中数据的信息。 PostgreSQL 中的元数据包含有关表和列的信息,我们在其中存储数据。 受 SQL 语句影响的行数是元数据。 结果集中返回的行数和列数也属于元数据。

有一个实验性函数pg_meta_data(),它以表的形式返回表名的表定义。

列和行

如前所述,结果集中的列数和行数被视为元数据。

  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 Name, Price FROM Cars LIMIT 4";
  9. $rs = pg_query($con, $query) or die (pg_last_error($con));
  10. $num_rows = pg_num_rows($rs);
  11. $num_cols = pg_num_fields($rs);
  12. echo "There are $num_rows rows and $num_cols columns in the query\n";
  13. pg_close($con);
  14. ?>

在上面的示例中,我们获取查询返回的行数和列数。

  1. $query = "SELECT Name, Price FROM Cars LIMIT 4";

从 SQL 查询中可以看到我们选择了 2 列和 4 行。 该查询也可以动态创建。

  1. $num_rows = pg_num_rows($rs);
  2. $num_cols = pg_num_fields($rs);

pg_num_rows()函数返回 PostgreSQL 结果资源中的行数。 pg_num_rows()函数返回 PostgreSQL 结果资源中的列数(字段)。

  1. $ php colsrows.php
  2. There are 4 rows and 2 columns in the query.

示例输出。

列标题

接下来,我们将展示如何使用数据库表中的数据打印列标题。

  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 id, name, price FROM cars LIMIT 5";
  9. $rs = pg_query($con, $query) or die (pg_last_error($con));
  10. $fname1 = pg_field_name($rs, 0);
  11. $fname2 = pg_field_name($rs, 1);
  12. $fname3 = pg_field_name($rs, 2);
  13. printf("%3s %-10s %8s\n", $fname1, $fname2, $fname3);
  14. while ($row = pg_fetch_row($rs)) {
  15. printf("%3s %-10s %8s\n", $row[0], $row[1], $row[2]);
  16. }
  17. pg_close($con);
  18. ?>

在此程序中,我们从cars表中选择 5 行,并带有列名。

  1. $fname1 = pg_field_name($rs, 0);
  2. $fname2 = pg_field_name($rs, 1);
  3. $fname3 = pg_field_name($rs, 2);

pg_field_name()函数返回指定列号的列(字段)名称。

  1. printf("%3s %-10s %8s\n", $fname1, $fname2, $fname3);

我们打印列标题。 我们使用printf函数进行一些格式化。

  1. $ php column_headers.php
  2. id name price
  3. 1 Audi 52642
  4. 2 Mercedes 57127
  5. 3 Skoda 9000
  6. 4 Volvo 29000
  7. 5 Bentley 350000

该程序的输出。

受影响的行

在下面的示例中,我们将发现特定的 SQL 命令已进行了多少更改。

  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 friends";
  9. pg_query($con, $query) or die("Cannot execute query: $query\n");
  10. $query = "CREATE TABLE friends(id INT, name TEXT)";
  11. pg_query($con, $query) or die("Cannot execute query: $query\n");
  12. $query = "INSERT INTO friends VALUES (1, 'Jane'), (2, 'Thomas')"
  13. . ", (3, 'Beky'), (4, 'Robert'), (5, 'Lucy')";
  14. $res = pg_query($con, $query) or die("Cannot execute query: $query\n");
  15. $ar = pg_affected_rows($res);
  16. echo "The query has affected $ar rows\n";
  17. $query = "DELETE FROM friends WHERE id IN (3, 4, 5)";
  18. $res = pg_query($con, $query) or die("Cannot execute query: $query\n");
  19. $ar = pg_affected_rows($res);
  20. echo "The query has affected $ar rows\n";
  21. pg_close($con);
  22. ?>

我们创建一个好友表。 在最后一个 SQL 命令中,我们删除三行。 我们有一个INSERT和一个DELETE语句,我们可以对其调用pg_affected_rows()以获取受影响的行数。

  1. $query = "INSERT INTO friends VALUES (1, 'Jane'), (2, 'Thomas')"
  2. . ", (3, 'Beky'), (4, 'Robert'), (5, 'Lucy')";

我们在friends表中插入五行。

  1. $ar = pg_affected_rows($res);
  2. echo "The query has affected $ar rows\n";

pg_affected_rows()函数返回受最后一条 SQL 语句影响的行数。

  1. $ php affected_rows.php
  2. The query has affected 5 rows
  3. The query has affected 3 rows

INSERT语句创建了五行,DELETE语句删除了三行。

表元数据

有一个实验pg_meta_data()。 它为数据库表的每一列返回元数据。

  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. $ary = pg_meta_data($con, 'cars');
  9. var_dump($ary);
  10. pg_close($con);
  11. ?>

该示例打印有关cars表的表列的元数据。

  1. $ary = pg_meta_data($con, 'cars');

pg_meta_data()返回汽车表的元数据信息。 它返回一个数组。

  1. var_dump($ary);

var_dump()函数转储有关变量的信息。 在我们的例子中,它是返回的元数据信息数组。

  1. $ php metadata.php
  2. array(3) {
  3. ["id"]=>
  4. array(6) {
  5. ["num"]=>
  6. int(1)
  7. ["type"]=>
  8. string(4) "int4"
  9. ["len"]=>
  10. int(4)
  11. ["not null"]=>
  12. bool(true)
  13. ...

摘自示例输出。

在 PostgreSQL PHP 教程的这一部分中,我们使用了数据库元数据。