-1

我最难让 PHP 与 Postgres SQL 对话。这是我的设置:

Ubunu 桌面 13.10
PHP 5.5.3
Postgres 9.1.10
Apache 2.4.6
Netbeans 7.4 和 xdebug

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

$dbConn = new softwareDB('localhost', 'postgres', 'root', 'softwareuitest');
...
  $results = $dbConn.getClients();
    while($client = pg_fetch_result($results)){
        echo '<option value=\"'.$client.'\">'.$client.'</option>';
    }

softwareDB类构造函数如下:

Class softwareDB {

private $conn;

function _construct($host, $user, $password, $dbname) {
    $connectString = 
            'host=' . $host .
            ' port=5432' . 
            ' user=' . $user .
            ' password=' . $password .
            ' dbname' . $dbname;

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

运行代码时没有任何反应......我在 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 开启

4

1 回答 1

1

你有两个主要问题。第一个是错字;PHP 类实例方法通过箭头运算符调用。它应该是...

$results = $dbConn->getClients();

第二个是你的使用global $conn。你没有一个名为$conn, global 的变量。您所拥有的是一个成员属性$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 或其他数据库操作的任何信息。

于 2013-11-13T02:34:04.743 回答