Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Heroku Postgresql DB-部署后无法更新数据库_Php_Mysql_Postgresql_Heroku - Fatal编程技术网

Php Heroku Postgresql DB-部署后无法更新数据库

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

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

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

.env文件

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(不幸的是)。