【问题标题】:How to remotely connect to HEROKU PostgreSQL database using如何使用远程连接到 HEROKU PostgreSQL 数据库
【发布时间】:2018-03-22 14:33:45
【问题描述】:

我有一个 PHP 应用程序需要远程连接到 HEROKU 应用程序的 postgresql 数据库并运行数据库查询(最好使用 pg_query,尽管 PDO 也可以)。我一直在尝试 1.) 使用 Heroku DATABASE_URL 获取实时数据库凭据(正如他们推荐的那样),以及 2) 即使提供了硬编码凭据,也可以生成任何类型的数据库连接。我还没有找到建立连接的正确步骤顺序。 (应用在 GoDaddy 主机上运行 - 为清楚起见而提及。)

我正在尝试连接到数据库,运行选择查询并将结果集中的值分配给 PHP 变量。我可以使用 PGAdmin3 连接到数据库,因此远程访问不是问题。

到目前为止我所拥有的(编辑评论的行来自原始帖子):

//$DATABASE_URL='$({heroku CLI string, pasted from Heroku db credentials page})';
//$db = parse_url(getenv($DATABASE_URL));

$db_url = getenv("DATABASE_URL") ?: "postgres://user:pass@host:port/dbname";
$db = pg_connect($db_url);

if($db) {echo "connected";} else {echo "not connected";}

$selectSql = "SELECT id, name FROM companies ORDER BY id";   
$result =  pg_query($db, $selectSql);

while ($row = pg_fetch_row($result)) {
    $id = $row["id"];
    $name = $row["name"];
    echo "<br>id: ".$id;
    echo "<br>name: ".$name;
}

连接数据库和运行查询缺少什么?

【问题讨论】:

    标签: php postgresql heroku connection remote-access


    【解决方案1】:

    我看到至少 3 个问题:

    1) 删除或注释掉这个:

    $DATABASE_URL='$({heroku CLI string, pasted from Heroku db credentials page})';
    

    2) 更改此行以获取环境变量(看起来像这样)。您必须在启动 PHP 之前设置环境变量。您也可以对值进行硬编码,但不推荐:

    $db = parse_url(getenv('DATABASE_URL'));
    

    3) 看起来您实际上并没有连接到数据库,您只是开始查询。您必须先连接。见heroku docs for PDOPHP docs for pg_query

    2018 年 3 月 23 日更新

    这是一个独立的程序,可以确保它正在连接:

    #!/usr/bin/env php
    <?php
    $db_url = getenv("DATABASE_URL") ?: "postgres://user:pass@host:port/dbname";
    echo "$db_url\n";
    
    $db = pg_connect($db_url);
    if($db) {echo "connected";} else {echo "not connected";}
    
    $selectSql = "SELECT 1";
    $result =  pg_query($db, $selectSql);
    
    while ($row = pg_fetch_row($result)) {
        var_dump($row);
    }
    ?>
    

    【讨论】:

    • 这有助于指出调用环境变量的正确方法。由于我在共享托管平台上并且无法访问 conf.d 文件夹以添加 DATABASE_URL 环境变量,因此我可能必须在没有该变量的情况下构建 pg_connect 连接字符串。无法找到解决此问题的方法以解析 URL 并构建连接字符串。
    • 这里是我在运行更新代码之前设置的相关环境变量:DATABASE_URL=postgres://postgres:password@localhost:5432/postgres
    【解决方案2】:

    您需要使用正确的连接字符串调用pg_connect。我不认为它与通过 Heroku 给出的 URL 相同; refer to the documentation for that one.

    您还错误地使用了getenv

    $db_url = getenv("DATABASE_URL") ?: "some default value here";
    $db = pg_connect($db_url);
    

    【讨论】:

    • 你说得对,我确实需要正确调用 pg_connect。此外,我将 Heroku URL 传递到 DATABASE_URL 环境变量中,如上面编辑的代码中所示。我无法让 pg_connect() 将其识别为连接字符串,我认为必须有另一个步骤才能做到这一点。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2012-04-07
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多