无法将PHP连接到Postgres

无法将PHP连接到Postgres,php,postgresql,pdo,Php,Postgresql,Pdo,我在让PHP与Postgres SQL对话时遇到了最困难的问题。以下是我的设置: Ubunu桌面13.10 PHP 5.5.3 博士后9.1.10 Apache 2.4.6 带有xdebug的Netbeans 7.4 一切正常。我可以从命令行输入和检索Postgres数据库中的数据,但不能用PHP。以下是我用来连接的代码行: $dbConn = new softwareDB('localhost', 'postgres', 'root', 'softwareuitest'); ... $re

我在让PHP与Postgres SQL对话时遇到了最困难的问题。以下是我的设置:

Ubunu桌面13.10
PHP 5.5.3
博士后9.1.10
Apache 2.4.6
带有xdebug的Netbeans 7.4

一切正常。我可以从命令行输入和检索Postgres数据库中的数据,但不能用PHP。以下是我用来连接的代码行:

$dbConn = new softwareDB('localhost', 'postgres', 'root', 'softwareuitest');
...
  $results = $dbConn.getClients();
    while($client = pg_fetch_result($results)){
        echo '<option value=\"'.$client.'\">'.$client.'</option>';
    }
运行代码时,不会发生任何事情。。。我在Apache日志文件中没有看到任何内容,在postgres日志中没有看到任何内容,在调试器中没有看到任何内容,在输出中只有HTML(没有查询数据)

我还不能发布图片,但以下是关于phpInfo()中Postgres的详细信息:

PDO
PDO驱动程序| pgsql

pdo_pgsql
版本9.1.9
模块1.0.2
修订版$id$

pgsql
PostgreSQL(libpq)| x86_64-unknown-linux-gnu上的PostgreSQL 9.1.9,由gcc(Ubuntu/Linaro 4.8.1-10ubuntu1)4.8.1编译,64位
allow_persistent(允许持久化)处于启用状态,您有两个主要问题。第一个是打字错误;PHP类实例方法通过箭头操作符调用。应该是

$results = $dbConn->getClients();
第二个是使用
global$conn
。您没有名为
$conn
的变量,无论是否为全局变量。您拥有的是一个成员属性
$conn
,您可以通过在其前面加上
$this
来引用它,例如

public function getClients() {
    return pg_query($this->conn, 'SELECT * FROM clients');
}

进一步看,我建议,如果您要在
softwareDB
类中抽象数据库细节,那么您最好完全这样做。我会选择这样的

class softwareDB {
    private $conn;

    public function __construct($host, $user, $password, $dbname) {
        $this->conn = pg_connect(sprintf('host=%s port=5432 user=%s password=%s dbname=%s',
            $host, $user, $password, $dbname));
        if ($this->conn === false) {
            throw new Exception(pg_last_error());
        }
    }

    public function getClients() {
        $result = pg_query($this->conn, 'SELECT * FROM clients');
        return pg_fetch_all($result);            
    }
}

我对PostgreSQL函数不太熟悉,因此您可能需要对此进行调整,但一般的想法是,使用
softwareDB
类的代码不需要了解任何有关postgres或其他DB操作的信息。

Gah,为什么要使用
global$conn
?只需使用
$this->conn
。此外,PHP使用箭头操作符(
->
)引用类实例方法,而不是点,因此这里的
$dbConn->getClients()
对PHP来说应该是新的。我完全同意。将立即更改!另外,连接失败的错误检查在哪里?我在调用softwareDB的下面有以下几行:
如果(!$dbConn){die(pg_last_error())}
另一件事,
pg_query
只接受2个参数(而不是3个),并且
pg_fetch_结果
接受2或3个参数(当然不是1个)。我建议您阅读手册,了解您正在使用的功能所有好的建议。为了从Postgres获取任何心跳信号,许多错误报告功能都被匆忙添加。我已经纠正了错误(点运算符和导入全局),但我没有得到任何消息,说有一个连接到数据库。调试器只是传递函数,不返回任何值,就好像没有异常一样。
class softwareDB {
    private $conn;

    public function __construct($host, $user, $password, $dbname) {
        $this->conn = pg_connect(sprintf('host=%s port=5432 user=%s password=%s dbname=%s',
            $host, $user, $password, $dbname));
        if ($this->conn === false) {
            throw new Exception(pg_last_error());
        }
    }

    public function getClients() {
        $result = pg_query($this->conn, 'SELECT * FROM clients');
        return pg_fetch_all($result);            
    }
}