php - “PHP警告:pg_connect():无法连接到PostgreSQL服务器:致命:用户…的密码身份验证失败”,Raspberry Pi(拉伸(stretch))

标签 php postgresql raspbian php-7 raspberry-pi3

很抱歉打扰大家,我是PostgreSQL的新手,但是我的项目需要我建立一个自动系统,连接到运行PostgreSQL服务器的服务器。长话短说,假设需要我通过PHPpg_connect()执行从Web表单到服务器的数据插入/操作。Web表单位于/var/www/html/web_form.html本地,并调用执行数据插入的PHP脚本,

    <form name="some_name" action="script.php" method="POST">

所以数据插入是在本地服务器上完成的。
我使用一个树莓Pi 3来模拟“服务器”(这样在早期开发期间就不会“打扰”真正运行的服务器)。覆盆子皮正在运行一个覆盆子伸展发行版。原来是杰西,但后来我决定把
    deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi

优先级为100。它还有postgresql-9.6.3(来自Stretch)、php7.0.19-1(也来自Stretch)和apache2.4.25(来自官方Raspbian)。请注意,Stretch repo确实取代了Jessie的许多官方稳定包,而且众所周知,它本身“不太稳定”,所以它也可能是问题的根源。
我可以从远程计算机访问服务器中的数据库,无论是使用directpsql、Python(psycopg2),甚至是通过PHP访问完全相同的Web表单(从远程计算机尝试),所以这绝不会是因为PDO问题(我已经检查过了phpinfo(),但可以随意对此给出建议,因为我自己并不真正了解PDO)。在本地,我可以通过psql访问数据库,但不能通过PHP(pg_connect)进行本地访问。
我花了好几个小时来处理这个问题,但都白费了。请帮帮我。
这是我的覆盆子皮的配置:

PHP代码片段:
    $conn_str="host=localhost port=5432 dbname=my_db_name user=my_user_name password=my_password";
    $db = pg_connect($conn_str);
    if(!$db){
        $errormessage=pg_last_error();
        echo "Error 0: " . $errormessage;
        exit();
    }

请注意,同样的代码在另一台计算机上运行得很好。当Web表单位于访问所述服务器的远程计算机中,或者Web表单正在访问远程计算机自己的本地PostgreSQL服务器时,我已经成功地执行了数据插入,但在这个特定的问题服务器中没有执行。在浏览器中运行时,仅显示:
    Error 0:

在控制台中运行时的结果:
PHP Warning:  pg_connect(): Unable to connect to PostgreSQL server: FATAL:  password authentication failed for user "raspiserver"

FATAL:  password authentication failed for user "raspiserver" in php shell code on line 1

我还试图将host=localhost更改为host=127.0.0.1host=0.0.0.0。我确信错误来自该代码块,因为该块已经在我的PHP代码的第一行,而我放置的其他错误报告代码,每个都有不同的Error X:编号。

PostgreSQL配置:
对于pg_hba.conf内容:
    # Database administrative login by Unix domain socket
    local   all             postgres                                peer

    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    # "local" is for Unix domain socket connections only
    local   my_db_name     my_user_name     127.0.0.1/32            md5
    local   all     all                                             md5
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            md5

    # IPv6 local connections:
    host    all             all             ::1/128                 md5
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    # local   replication     postgres                                peer
    #host    replication     postgres        127.0.0.1/32            md5
    #host    replication     postgres        ::1/128                 md5

    #host   all             all             0.0.0.0/0               md5
    host    another_db_name      my_user_name             192.168.52.0/24         trust
    host    my_db_name     my_user_name             192.168.52.0/24         trust

我已经尝试注释/取消注释第7行,或者将第7行和第8行都更改为md5trustpassword。我还尝试从第7行删除127.0.0.1/32,或将其更改为127.0.0.0/240.0.0.0/0。是的,我确实表演过
    sudo /etc/init.d/postgresql reload
    sudo /etc/init.d/postgresql restart

(甚至sudo reboot)我所做的每一个改变。
对于postgresql.conf内容:
我已经设置了listen_addresses = '*'password_encryption = on,其余的保持不变。
三。
防火墙:
sudo iptables -L -n不显示任何条目:
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         

    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         

    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination  

我的配置有什么问题?
是伸展运动的原因吗?
还是因为PostgreSQL-9.6的实现?
我已经到处搜索过了,但大多数解决方案只建议将pg_hba.conf改为trust,或者假设user名称不存在。
我很绝望,请帮忙。
(请注意,我对PHP、PostgreSQL、Apache或服务器一无所知,所以请不要指望我真的知道到目前为止我做了什么。请分析每件事。。。。另外,英语不是我的母语,所以我可能会在这里和那里混合一些“行话”(如果有的话)。。。。对不起……)

最佳答案

pg_hba.conf中的此特定声明不正确:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   my_db_name     my_user_name     127.0.0.1/32            md5

因为当TYPE字段是local时,该行必须有4个字段,而不是5个:没有ADDRESS字段,因为它不适用于Unix域套接字(这就是local的真正含义),只适用于TCP连接(声明TYPEhosthostssl
当您用这一行的pg_hba.conf重新加载PostgreSQL时,它将失败
LOG:  invalid authentication method "127.0.0.1/32"

但只有在服务器日志中才能看到。由于失败,它将忽略您的新版本pg_hba.conf
不管怎样,另一行已经在你的文件中了
host    all             all             127.0.0.1/32            md5

可能是你想要的。在这种情况下,只需删除有问题的行,重新加载,并检查服务器日志中指示重新加载成功的消息。

关于php - “PHP警告:pg_connect():无法连接到PostgreSQL服务器:致命:用户…的密码身份验证失败”,Raspberry Pi(拉伸(stretch)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44967826/

相关文章:

php - Yii 动态下拉列表 - 昂贵的查询

php - CodeIgniter + jQuery Ajax 运行错误但成功调用回调

python - SQLAlchemy:按 JSON 列中的键过滤

postgresql - 有没有办法将两种情况指向一个代码块?

postgresql - 每个更新具有不同随机值的 PSQL 行

opencv - 通过Raspberry PI使用OpenCV捕获1920x1080视频

linux - Linux上如何区分手动安装的包和依赖项

php - 如何在codeigniter中获取多个插入的id

java - 为什么 Open 和 Oracle JDK 在 Raspberry pi 上的性能差异如此之大?

javascript - 值没有从一个动态下拉框传递到 php 中的另一个动态下拉框