PHP - 如何在 Windows 上从本地连接到 Heroku 的 PostGres 数据库

3
我正在尝试使用Heroku托管的PostGres数据库,并需要从本地计算机连接到它。以下是我使用的凭据示例:
params:
  driver: pdo_pgsql
  host: e5-31-281-414-28.compute-1.amazonaws.com
  dbname: b6m44bwjmaa41n
  user: sgjwiakskki
  password: e4ks28ajgs87
  port: 5432

我改变了这些凭据,但它们的格式是这样的。

当我尝试使用pg_connect连接时,就像这样:

$dbconn = pg_connect("e5-31-281-414-28.compute-1.amazonaws.com port=5432 dbname=b6m44bwjmaa41n user=sgjwiakskki password=e4ks28ajgs87") or die('Could not connect: ' . pg_last_error());

我收到了这个错误信息:
pg_connect(): Unable to connect to PostgreSQL server: could not translate host name "***.compute-1.amazonaws.com" to address: Unknown host 

当我尝试使用Doctrine的DBAL包进行连接时,我遇到了相同的错误:
Uncaught exception 'PDOException' with message 'SQLSTATE[08006] [7] could not translate host name "e5-31-281-414-28.compute-1.amazonaws.com" to address: Unknown host' in C:\wamp64\www\project\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\AbstractPostgreSQLDriver.php on line 85

我看了所有关于从外部连接Heroku的教程,但是我无法搞清楚这个问题。我可以使用Heroku工具包通过命令行连接。我可以使用pgAdmin 3连接。但好像无法连接像这样的Web应用程序。
2个回答

4
根据手册所述,您应该尝试以下步骤:http://php.net/manual/en/function.pg-connect.php
$dbconn = pg_connect("host=e5-31-281-414-28.compute-1.amazonaws.com port=5432 dbname=b6m44bwjmaa41n user=sgjwiakskki password=e4ks28ajgs87");

描述
资源 pg_connect ( string $connection_string [, int $connect_type ] )

连接字符串可以为空以使用所有默认参数,或者它可以包含一个或多个由空格分隔的参数设置。每个参数设置都采用关键字 = 值的形式。等号周围的空格是可选的。要写入空值或包含空格的值,请用单引号括起来,例如,关键字='a value'。在值内的单引号和反斜杠必须用反斜杠转义,即 \' 和 \。

更新:

我没有安装php。所以,我刚刚从旧的ubuntu存储库安装了php5.6和php5.6-pqsql软件包(我使用的是Linux Mint 18.1, 32位)

$ date
Tue Dec 27 00:49:11 +04 2016
$ grep install /var/log/dpkg.log

2016-12-27 00:05:11 install php-common:all <none> 1:47+deb.sury.org~xenial+1
...
2016-12-27 00:05:22 install php5.6:all <none> 5.6.29-1+deb.sury.org~xenial+1
...
2016-12-27 00:22:26 status installed php5.6-pgsql:i386 5.6.29-1+deb.sury.org~xenial+1
... 

然后在Heroku上创建了一个账户。设置了一个数据库,我正在添加连接凭据(因为我不需要它)。

Host
    ec2-54-217-212-8.eu-west-1.compute.amazonaws.com
Database
    d464heusrdn2k5
User
    mgtvhefjhzilai
Port
    5432
Password
    fd6aa97d31b25c26a41a8211008f1838abd76d7715dcac7c742bfc55f37bd50f

有了上述内容,

$ php -v
PHP 5.6.29-1+deb.sury.org~xenial+1 (cli) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

$ php -a
Interactive mode enabled

php > $dbconn = pg_connect("host=ec2-54-217-212-8.eu-west-1.compute.amazonaws.com port=5432 dbname=d464heusrdn2k5 user=mgtvhefjhzilai password=fd6aa97d31b25c26a41a8211008f1838abd76d7715dcac7c742bfc55f37bd50f");
php > $sql = "create table lorem (id int not null, foo varchar(15), primary key (id));";
php > $r = pg_query($dbconn, $sql);
php > $tbls = "select * from information_schema.tables";
php > $qr = pg_query($dbconn, $tbls);
php > while($r = pg_fetch_array($qr)) {
php { print_r($r);
php { }
Array
(
    [0] => d464heusrdn2k5
    [table_catalog] => d464heusrdn2k5
    [1] => public
    [table_schema] => public
    [2] => lorem
    [table_name] => lorem
    [3] => BASE TABLE
    [table_type] => BASE TABLE
    [4] => 
    [self_referencing_column_name] => 
    [5] => 
    [reference_generation] => 
    [6] => 
    [user_defined_type_catalog] => 
    [7] => 
    [user_defined_type_schema] => 
    [8] => 
    [user_defined_type_name] => 
    [9] => YES
    [is_insertable_into] => YES
    [10] => NO
    [is_typed] => NO
    [11] => 
    [commit_action] => 
)
Array

我尝试过用引号括起来并添加空格,但没有改变任何东西。我在帖子中提到我也尝试了DBAL,所以这不是我使用pg_connect的问题。 DBAL从我发布的YAML文件中获取参数。 - Horse O'Houlihan
让我创建并检查一个。 - marmeladze

2

感谢marmeladze!你的帮助让我看到问题可能是我使用了错误的凭据。结果发现有两个问题,错误的凭据是第一个问题。第二个问题是我需要将sslmode=require放入$connection_string中。因此字符串变成了这样:

$dbconn = pg_connect("host=ec2-**-***-***-45.compute-1.amazonaws.com port=5432 dbname=e4ngs3d4risaw9 user=s52mt674s3sjd password=p31mgss562sts7e3kebie3j sslmode=require")

在我尝试修复凭据时(请注意密码格式不同,我将错误的变量分配给了它),错误信息“无法解析主机”已消失,并被两个新错误所取代。第一个错误是:

Unable to connect to PostgreSQL server: FATAL: password authentication failed for user

第二个错误信息我忘记保存了,但它指出提供的主机(它给出了IP地址)在pg_hba.conf文件中没有出现。我尝试编辑pg_hba.conf文件,但后来发现了一篇关于常见错误消息及其含义的文章:https://devcenter.heroku.com/articles/postgres-logs-errors#fatal-no-pg_hba-conf-entry-for-host-user-u-database-d-ssl-off,它表示您正在尝试连接而没有使用SSL。

FATAL: no pg_hba.conf entry for host "…”, user “u…”, database “d…”, SSL off

您正在尝试建立一个未使用SSL的数据库连接。所有连接都需要SSL。请查看您的postgres驱动程序文档以了解如何建立加密连接。

因此,添加sslmode=require修复了此问题。然后身份验证问题很明显是密码的问题,我再次检查了一下,密码中缺失了一个字母。修复后解决了所有问题,现在我可以连接。再次感谢!

更新:只想添加另一个我遇到的错误和它的原因。我尝试使用DBAL连接时,出现了以下错误:

PDOException' with message 'SQLSTATE[08006] [7] FATAL: password authentication failed for user "SYSTEM"' in C:\wamp64\www\myproject\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\AbstractPostgreSQLDriver.php on line 85

它试图连接到SYSTEM用户。问题出在我的YAML文件上,它写成了username: hs62ksi62sj2,而实际应该是user: hs62ksi62sj2

因此正确的YAML文件应该是:

params:
  driver: pdo_pgsql
  host: ec2-**-***-***-45.compute-1.amazonaws.com
  dbname: e4ngs3d4risaw9 
  user: s52mt674s3sjd 
  password: p11mgss562sts7e3kebiesf
  port: 5432
  sslmode: require

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接