-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

2 つの主な問題があります。最初はタイプミスです。PHP クラスのインスタンス メソッドは、矢印演算子を介して呼び出されます。そのはず...

$results = $dbConn->getClients();

2 つ目は、 の使用です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 やその他の DB 操作について何も知る必要がないということです。

于 2013-11-13T02:34:04.743 に答える