【问题标题】:Cannot connect PHP to Postgres无法将 PHP 连接到 Postgres
【发布时间】:2013-11-13 02:11:51
【问题描述】:

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

Ubunu 桌面版 13.10
PHP 5.5.3
Postgres 9.1.10
阿帕奇 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>';
    }

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 开启

【问题讨论】:

  • 呸,你为什么要使用global $conn?只需使用$this-&gt;conn。此外,PHP 使用箭头运算符 (-&gt;) 来引用类实例方法,而不是点,所以它应该是 $dbConn-&gt;getClients()
  • 这里对 PHP 有点陌生。我完全同意。将立即更改!
  • 另外,您在哪里检查连接失败的错误?
  • 我在 softwareDB 的调用下方有这些行:if(!$dbConn){ die(pg_last_error()); }
  • 另一件事,pg_query 只需要 2 个参数(不是 3 个),pg_fetch_result 需要 2 或 3 个(当然不是 1)。我建议您阅读您正在使用的功能的手册页

标签: php postgresql pdo


【解决方案1】:

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

$results = $dbConn->getClients();

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

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

进一步看,我建议如果您要在 softwareDB 类中抽象出 DB 详细信息,您不妨完全做到这一点。我会选择这样的东西

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 或其他数据库操作的任何信息。

【讨论】:

  • 所有好的建议。许多错误报告的东西都被匆忙添加,试图从 Postgres 获得任何心跳。我已经纠正了错误(点运算符和导入全局),但我什么也没得到,说有与数据库的连接。调试器只是传递函数并且不为它返回任何值,就好像没有什么异常一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多