很抱歉打扰大家,我是PostgreSQL的新手,但我的项目需要我构建一个连接到运行PostgreSQL服务器的服务器的自动化系统。长话短说,假设我需要通过PHPpg_connect()
从Web 窗体将数据插入/操作到服务器中。Web 窗体位于本地/var/www/html/web_form.html
,并调用执行数据插入的 PHP 脚本,
<form name="some_name" action="script.php" method="POST">
因此,数据插入是在本地服务器完成的。
我正在使用Raspberry Pi 3来模拟"服务器"(因此在如此早期的开发过程中不会"干扰"真正正在运行的服务器(。Raspberry Pi正在运行Raspbian Stretch发行版。好吧,它最初是杰西,但后来我决定让 Stretch 存储库参与进来
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 存储库确实替换了很多 Jessie 的官方稳定包,并且众所周知,它本身"不太稳定">,所以它也可能是问题的根源。
我可以从远程计算机访问服务器中的数据库,无论是使用直接psql
,Python(psycopg2
(,甚至是通过PHP完全相同的Web表单(从远程计算机尝试(,所以这通常不会是因为PDO问题(我已经检查过phpinfo()
,但请随时就此提供建议,因为我自己并不真正了解PDO(。在本地,我可以通过psql
访问数据库,但不能通过PHP(pg_connect
(进行本地访问。
我已经干预这个问题几个小时了,但徒劳无功。请帮助我。
这是我的树莓派的配置:
1. 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
,其余的保持不变。
3. 防火墙:
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
可能做你想做的事。在这种情况下,只需删除有问题的行,再次重新加载,然后检查服务器日志中是否有指示重新加载成功的消息。