为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 查询在 MySQL 到 Postgres 转换后不起作用 + 奇怪的错误

PHP 查询在 MySQL 到 Postgres 转换后不起作用 + 奇怪的错误

PHP
慕莱坞森 2021-10-22 14:24:52
设置 - PHP 7 应用程序。- Postgres 在 Heroku Hobby v11.x 上 - MySQL 版本是 v5.5.56 和协议 10 - 我对 PHP 不太了解 - 我对低级 Postgres 转换不太了解。我使用 pgloader 从 MySQL 迁移到 Postgres。pgloader --dry-run --with 'create indexes' --with 'create indexes' --with 'foreign keys' --with 'downcase identifiers'  --with 'create tables' --with 'include drop' mysql://<<hidden>>@us-cdbr-iron-east-03.cleardb.net/heroku_509e1e230baf4be postgres://<<hidden>>@ec2-23-21-177-102.compute-1.amazonaws.com:5432/dflfjbhhq18cav?sslmode=require我知道连接正常。在用 Postgres 交换 MySQL 函数后,一些查询正在工作 - 我知道这一点,因为我可以看到数据填充。我还必须进行一些调整才能使查询正常工作。复制字段的查询具有有效的 SQL 语句,但出现以下错误。我知道查询是好的,因为我已经将它回显并将其粘贴到我的 Navicat SQL 窗口中,它会产生正确的结果。pg_query(): Query failed: ERROR:  permission denied for table campaignsDB 用户似乎拥有访问该campaigns表并获取所需内容的所有适当权限。我继续寻找另一个非常奇怪的问题。无论我使用什么尝试使用有效的 SQL 语句使用 PHP 运行查询,我都没有得到任何数据。-pg_pquery -pg_fetch_array -pg_query_params -pg_fetch_array请参阅下面的代码示例。//Get the existing number of quota_deducted    $q = 'SELECT app, quota_deducted FROM campaigns WHERE id = '.$campaign_id;    $r = pg_query($mysqli, $q);    if ($r)     {        while($row = pg_fetch_array($r))         {            $app = $row['app'];            $current_quota_deducted = $row['quota_deducted']=='' ? 0 : $row['quota_deducted'];        }        //Check if monthly quota needs to be updated        $q2 = 'SELECT allocated_quota, current_quota FROM apps WHERE id = '.$app;        $r2 = pg_query($mysqli, $q2);        if($r2)         {            while($row2 = pg_fetch_array($r2))             {                $allocated_quota = $row2['allocated_quota'];                $current_quota = $row2['current_quota'];            }        }
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您的问题包含大量问题,并没有足够的信息来完全解决其中任何一个问题,因此我将尝试提供一些故障排除步骤,以帮助您找到解决方案。


问题#1

命令:


INSERT INTO campaigns (userid, app, from_name, from_email, reply_to, title, label, plain_text, html_text, query_string, bounce_setup, complaint_setup, wysiwyg, opens_tracking, links_tracking) VALUES (2, 152, 'Person Name', 'campaignsupport@company.com', 'campaignsupport@company.com', 'Test', '', 'Test plain text.', 'asdf', '', 0, 0, 1, 1, 1)

失败并出现错误:


pg_query(): Query failed: ERROR:  permission denied for table campaigns

但是,当您在 Navicat 中运行它时,您可以执行此 SQL 命令。


在您描述的上下文中,发生此错误的原因只有几个:


您没有使用具有所需权限的用户(可能不是您认为连接的用户)连接到数据库。要检查您与问题查询连接的用户:


SELECT current_user;

使用与失败查询相同的连接,从您的应用程序内部发出此问题,紧接在失败查询之前。将输出记录在您可以看到的地方 - 例如。apache 错误日志。


从 Navicat 发出相同的查询以查看在那里使用的用户。如果与正在使用的应用程序不同,则与同一用户重新连接并查看查询是否仍然失败。


该表没有您认为的权限授予。


我不熟悉 Navicat:它可能提供检查表权限的方法。如果没有(或者如果它不起作用,请参见下文),那么您可以使用psql命令行工具进行连接并使用命令\z campaigns 查看表上的一组授权。


您并没有访问您认为自己访问的表,可能需要与您认为正在访问的表不同的权限。如果架构路径导致选择了不同架构中的同名表,则可能会发生这种情况。但是我认为这不会发生,因为您提到您已尝试指定完全限定名称public.campaigns。


您没有连接到正确的数据库。您声明您已经检查了这一点 - 如果您已经达到这一点但仍然没有找到原因,我建议再次检查!


问题#2

无论我使用什么尝试使用有效的 SQL 语句使用 PHP 运行查询,我都没有得到任何数据。


简化后,您的代码如下所示:


$r = pg_query($mysqli, $q);

if ($r) 

{

    // do something

}

我不是 php 专家,但检查文档pg_query我发现它说:


如果发生错误,并且返回 FALSE,则可以在连接有效的情况下使用 pg_last_error() 函数检索错误的详细信息。


您没有检查任何错误情况。我猜查询失败了,可能是上面提到的权限问题。我建议else在调用pg_last_error()和显示结果的代码中添加一个子句。


问题 #3

Navicat 显示此错误:


ERROR: Column "proisagg" doe snot exist

LINE 1: ...e JOIN pg_language lng ON lng.oid=p.prolang WHERE proisagg = .. 

HINT: Perhaps you meant to reference the column "p.prolang".

直到 postgresql 11,内部 postgresql 表pg_proc包含一个列 proisagg,如果该行表示聚合函数,则该列为真。


从 Postgresql 11 开始,此列被替换为prokind具有不同值的列,以描述该行是否表示聚合函数、窗口函数、普通函数或过程。


如上所述,我不熟悉 Navicat,但我猜您使用的版本尚未更新以考虑此更改。


查看完整回答
反对 回复 2021-10-22
  • 1 回答
  • 0 关注
  • 456 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信