Php Heroku Postgresql DB-部署后无法更新数据库
我正在使用Heroku部署我的postgresql数据库项目。我使用PHP、HTML5和CSS创建的站点在带有phpmyadmin和等效MySQL数据库的localhost上运行良好。但是,当我将其转移到Heroku时,只有选择查询起作用(插入、更新和删除都不好) 从我的localhost到heroku站点的唯一变化在于我的.env和文件,用于创建我粘贴在下面的php数据对象。有人能告诉我下一步该去哪里解决这个问题吗?Heroku错误日志不显示任何错误。我在postgres数据库中使用pgAdmin4 .env文件Php Heroku Postgresql DB-部署后无法更新数据库,php,mysql,postgresql,heroku,Php,Mysql,Postgresql,Heroku,我正在使用Heroku部署我的postgresql数据库项目。我使用PHP、HTML5和CSS创建的站点在带有phpmyadmin和等效MySQL数据库的localhost上运行良好。但是,当我将其转移到Heroku时,只有选择查询起作用(插入、更新和删除都不好) 从我的localhost到heroku站点的唯一变化在于我的.env和文件,用于创建我粘贴在下面的php数据对象。有人能告诉我下一步该去哪里解决这个问题吗?Heroku错误日志不显示任何错误。我在postgres数据库中使用pgAdm
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"], "/")
));
DATABASE\u 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"], "/")
));
问题的解决办法:
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);
博士后版本:
$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 我想知道是否值得使用另一个变量来存储
sprintf()
的结果,这样您就可以轻松地回显它了。你能给我们看看里面有什么,不包括任何安全敏感信息吗?(不要假设其中包含什么-检查它在PHP中实际解析为什么)。嗯,您是否从配置中读取URL,对其进行解析,然后将其重新组合在一起?你能直接将getenv('DATABASE_URL')
输入到连接字符串中吗?看起来你也在做ltrim($dbopts[“path”],“/”)
两次-这是故意的吗?非常感谢你的帮助@Chris是正确的,因为问题在于数据库语言迁移。结果表明,Postgres通过将属性名称全部改为小写来规范化属性名称,因此我的php函数(即array_column)无法识别带有大写字母的表属性。没有错,如果你能修好就好了!如果您认为这可能对其他人有所帮助,请在下面以正确的答案发布解决方案的摘要(或询问@Chris to,以便他们得到适当的信任)。稍微澄清一下:Heroku默认使用PostgreSQL,但也有兼容的MySQL提供程序。如果你有理由在Heroku上运行MySQL,你可以。见@Chris True!PostgreSQL只是唯一一个可以在不提供信用卡信息的情况下使用的RDBMS(不幸的是)。