PHP-从本地主机(在Windows上)连接到heroku PostGres数据库

PHP-从本地主机(在Windows上)连接到heroku PostGres数据库,php,postgresql,heroku,dbal,Php,Postgresql,Heroku,Dbal,我正在尝试使用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_con

我正在尝试使用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());
$dbconn = pg_connect("host=ec2-**-***-***-45.compute-1.amazonaws.com port=5432 dbname=e4ngs3d4risaw9 user=s52mt674s3sjd password=p31mgss562sts7e3kebie3j sslmode=require")
我得到这个错误:

pg_connect(): Unable to connect to PostgreSQL server: could not translate host name "***.compute-1.amazonaws.com" to address: Unknown host 
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
当我尝试使用Doctrines 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应用程序连接

如手册所述,您应该尝试以下内容

说明
资源pg_connect(字符串$connection_字符串[,int $connect\U type])

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

更新:

我没有php。所以,我刚刚安装了来自旧ubuntu存储库的php5.6和php5.6-pqsql包(我使用的是LinuxMint18.132bit)

鉴于上述情况

$ 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

谢谢marmeladze!通过对你的方式这样做,并向我展示它对你有效,我可以看出问题很可能是我使用了错误的凭证。结果有两个问题,第一个是错误的凭证。第二个是我需要将
sslmode=require
放入
$connection\u字符串中。
所以字符串变成了这样:

$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());
$dbconn = pg_connect("host=ec2-**-***-***-45.compute-1.amazonaws.com port=5432 dbname=e4ngs3d4risaw9 user=s52mt674s3sjd password=p31mgss562sts7e3kebie3j sslmode=require")
在我“尝试”修复凭据后(注意,密码的格式不同,我为其分配了错误的变量),错误消息“无法解析主机”
错误消失,并被两个新错误取代。第一个oen是:

Unable to connect to PostgreSQL server: FATAL: password authentication failed for user
第二个我忘了保存,但它说提供的用户名没有出现在所提供主机的
pg_hba.conf
文件中(它为主机提供了IP)。我试图编辑pg_hba.conf文件,但后来发现了一篇关于常见错误消息及其含义的文章: 这意味着您正在尝试在没有SSL的情况下进行连接

致命:主机“…”、用户“u…”、数据库“d…”没有pg_hba.conf条目, SSL关闭

您正在尝试建立没有SSL的数据库连接。SSL 所有连接都需要。有关详细信息,请参阅文档 关于如何建立加密连接的postgres驱动程序

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

更新:只想添加我遇到的另一个错误及其原因。我尝试与DBAL连接,但出现了以下错误:

pg_connect(): Unable to connect to PostgreSQL server: could not translate host name "***.compute-1.amazonaws.com" to address: Unknown host 
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
它试图与
系统
用户连接。问题是我的YAML文件,它有
用户名:hs62ksi62sj2
,而它应该是
用户:hs62ksi62sj2

因此,工作YAML文件是:

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

我尝试用wrotes包装并添加空格,但没有改变任何东西。我在帖子中提到我也尝试使用DBAL,所以我使用
pg_connect
的方式没有问题。DBAL从我发布的YAML文件中获取参数。让我创建并检查一个