很抱歉打扰大家,我是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的许多官方稳定包,而且众所周知,它本身“不太稳定”,所以它也可能是问题的根源。我可以从远程计算机访问服务器中的数据库,无论是使用direct
psql
、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.1
或host=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行都更改为
md5
、trust
或password
。我还尝试从第7行删除127.0.0.1/32
,或将其更改为127.0.0.0/24
或0.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连接(声明TYPE
为host
或hostssl
)当您用这一行的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/