【问题标题】:Heroku Postgresql DB - Unable to update database once deployedHeroku Postgresql DB - 部署后无法更新数据库
【发布时间】:2018-10-10 20:20:40
【问题描述】:

我正在使用 Heroku 来部署我的 postgresql 数据库项目。我使用 PHP、HTML5 和 CSS 创建的站点在本地主机上使用 phpmyadmin 和等效的 MySQL 数据库运行良好。但是,当我将它转移到 Heroku 时,只有 SELECT 查询起作用(插入、更新和删除都不好)。

从我的 localhost 到 heroku 站点的唯一变化在于我的 .env 和文件,以创建我粘贴在下面的 php 数据对象。谁能告诉我下一步该去哪里解决这个问题? Heroku 错误日志不显示任何错误。我正在为 postgres 数据库使用 pgAdmin4。

.env 文件

DATABASE_URL="pgsql://postgres:mypassword@localhost:5432/dbname"

其他文件

require __DIR__ . '/vendor/autoload.php';

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

$dbopts["path"] = ltrim($dbopts["path"], "/");

$db = new PDO("pgsql:" . sprintf(
"host=%s;port=%s;user=%s;password=%s;dbname=%s",
$dbopts["host"],
$dbopts["port"],
$dbopts["user"],
$dbopts["pass"],
ltrim($dbopts["path"], "/")
));

【问题讨论】:

  • 我想知道是否值得使用另一个变量来存储sprintf() 的结果,以便您可以轻松地回显它。你能告诉我们里面有什么,减去任何安全敏感信息吗? (不要假设其中有什么 - 检查它在 PHP 中实际解析的内容)。
  • 嗯,你是从 config 中读取 URL,解析它,然后将它们重新组合在一起吗?您可以直接将getenv('DATABASE_URL') 输入连接字符串吗?
  • 看起来你也做了两次ltrim($dbopts["path"], "/") - 这是故意的吗?
  • 非常感谢您的帮助! @Chris 是正确的,问题在于数据库语言迁移。结果 Postgres 通过将属性名称全部设为小写来规范化属性名称,因此我的 php 函数(即 array_column)无法识别带有大写字母的表属性。菜鸟错误。
  • 如果你修好了那就太好了!如果您认为它可能对其他人有所帮助,请在下面的答案中发布解决方案的摘要(或询问@Chris,以便他们得到适当的记分)。

标签: php mysql postgresql heroku


【解决方案1】:

解决问题:

phpmyadmin 只支持 MySQL,而我使用 Heroku 的免费 Postgres 插件。从本地的 phpmyadmin 迁移到 Heroku,这两种语言的语法略有不同。

我的特殊错误与 MySQL 属性中的大写字母在 Postgres 中恢复为全小写有关。我的一项功能中的示例:

MySQL 版本:

$sql = "SELECT DISTINCT ID FROM Doctors";
$query = $db->prepare($sql); 
$query->execute(); 
$results = $query->fetchAll(\PDO::FETCH_ASSOC); 
$did = array_column($results, 'ID');
$docid = implode(",", $did); 

Postgres 版本:

$sql = "SELECT DISTINCT ID FROM Doctors";
$query = $db->prepare($sql); 
$query->execute(); 
$results = $query->fetchAll(\PDO::FETCH_ASSOC); 
$did = array_column($results, 'id');   // difference
$docid = implode(",", $did); 

如果不是 uni 项目,我会使用 phpPgAdmin 而不是 phpmyadmin 以避免迁移差异。谢谢@Chris 和@halfer!

【讨论】:

  • 稍微澄清一下:Heroku 默认使用 PostgreSQL,但也有兼容的 MySQL 提供程序。如果你有充分的理由在 Heroku 上运行 MySQL,你可以。见elements.heroku.com/addons
  • @Chris 真! PostgreSQL 是唯一可以在不提供信用卡信息的情况下使用的 RDBMS(很遗憾)。
猜你喜欢
  • 2019-05-31
  • 2021-09-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2013-06-23
  • 2021-08-05
  • 2014-03-30
  • 2013-04-19
相关资源
最近更新 更多