无法通过PHP PDO访问Postgresql数据库

时间:2017-09-08 08:45:54

标签: postgresql pdo

我正在从MariaDB切换到Postgres,并遇到了一些意想不到的问题。

我在Ubuntu 16.04.4上安装了Postgres 9.5.8。

从shell开始,我将执行以下操作

su postgres
psql
password: //enter postgres password assigned at installation
CREATE USER test;
CREATE ROLE  //psql response
CREATE DATABASE test;
CREATE DATABASE //psql response
ALTER USER test WITH ENCRYPTED PASSWORD 'password';
ALTER ROLE //psql response
GRANT ALL PRIVILEGES ON DATABASE test TO test;
GRANT //psql response

在我运行PHP 7.0.22的Nginx 1.10.3服务器上,我以root用户(postgres)的身份参与Adminer 4.3.1并创建数据库表" test"

CREATE TABLE "public"."test" (
 "a" smallint NOT NULL,
 "b" integer NOT NULL,
 "c" bigint NOT NULL,
 "d" boolean NOT NULL,
 "e" double precision NOT NULL,
 "f" date NOT NULL,
 "g" character varying(1024) NOT NULL,
 "id" integer NOT NULL
) WITH (oids = false);

INSERT INTO "test" ("a","b","c","d","e","f","g","id") 
VALUES (1,2,3,'1',4.5,'2017-08-22','testing',1);

创建表" test"如预期的那样。

完成所有这些后,我写了一个简单的PHP脚本

<?php
 $dsn = "pgsql:host=localhost;port=5432;".
        "dbname=test;user=test;password=password";
 $dbh = new PDO($dsn);

 try
 {
  $count = $dbh->query("SELECT COUNT(*) FROM test")->fetchColumn();
 } catch (Exception $e){echo $e->getMessage();}
 echo "Count = $count"; 
?>

当我运行此脚本时,我收回错误

SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for 
relation test

这似乎表明GRANT ALL PRIVILEGES ON DATABASE test TO test;不足以授予用户test所有必要的权限以执行我在此处尝试执行的操作。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我准备删除这个问题,但后来认为如果我把它留在那里并给出正确答案,对社区可能更有用。

这里的一个简单事实是 - 当以 root 用户登录时通过Adminer创建的表,即postgres,将由该用户拥有。如果你通过PHP PDO作为另一个用户进入,你可能会遇到操作该表的困难! “解决方案”很简单 - 只需确保以SAME用户身份登录Adminer,最终通过PDO操作数据库。

我正在从MariaDB切换到Postgres的过程解释了为什么我遇到了这个问题 - MariaDB / MySQL没有对表所有权+可访问性施加这样的约束。但是,尽管如此,以root用户身份登录Adminer只不过是一个坏习惯。