2017-07-07 72 views
1

所以很抱歉打擾大家,我是的新手PostgreSQL,但我的項目需要我建立一個自動化系統,連接到運行PostgreSQL服務器的服務器。長話短說,讓我們說我需要執行數據插入/操縱網絡表格到服務器通過PHPpg_connect()。 Web窗體在/var/www/html/web_form.html位於本地,並調用執行數據插入一個PHP腳本,「PHP警告:pg_connect():無法連接到PostgreSQL服務器:致命:密碼認證失敗的用戶...」在Raspberry Pi(Stretch)

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

因此數據插入完成到本地服務器。

我使用的是樹莓派3模擬「服務器」(爲不使這樣的早期發展過程中,以「擾亂」的真正運行的服務器)。樹莓丕正在運行Raspbian拉伸發行。嗯,這本來是傑西,但後來我決定從

deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi 

100優先涉及拉伸回購。它也有postgresql-9.6.3(從拉伸),php7.0.19-1(也來自拉伸),並apache2.4.25(官方Raspbian)。請你注意,拉伸回購做替換很多傑西的官方穩定的軟件包的,並且也被稱爲是「不太穩定」本身,因此它也可能是問題的根源。

我可以在服務器從遠程計算機訪問數據庫,無論是使用直接psql,巨蟒(psycopg2),或者甚至通過PHP完全相同的Web窗體(從遠程計算機試過),所以將主要贏」 t因爲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=localhosthost=127.0.0.1host=0.0.0.0。我確信錯誤來自於該代碼塊,因爲該代碼塊已經在我的PHP代碼中的第一行,而我提供的其他錯誤報告代碼每個都有不同的Error X:數字。

2. 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 

我已經嘗試過評論/取消註釋LINE 7,或兩者LINE 7和8更改爲md5trust,或password。我也嘗試從LINE 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,其餘保持不變。

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的,或服務器,所以請不要指望我真的知道我到目前爲止已經完成。請你分析的一切 ....另外,英語不是我的本地人,所以我可能會在這裏和那裏(如果有的話)圍繞一些「行話」混合......對不起......)

回答

1

pg_hba.conf這種特殊的聲明是不正確:

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

因爲當TYPElocal,該行必須有4場,而不是5:沒有ADDRESS領域,因爲它並不適用於Unix域套接字(這是什麼local的真正含義),只有TCP連接

當您與pg_hba.con重裝PostgreSQL的(這與TYPEhosthostssl聲明) f與這條線,它將失敗

LOG: invalid authentication method "127.0.0.1/32" 

但你會看到,只有在服務器日誌中看。由於失敗,它將忽略您的新版本pg_hba.conf

反正這在其他文件

host all    all    127.0.0.1/32   md5 

已經行可能你想要做什麼。在這種情況下,只需刪除違規行,重新加載,然後檢查服務器日誌中是否有指示重新加載成功的消息。

+0

好的,我會嘗試從下週一的LINE 7中刪除ADDRESS字段。出於好奇,不是host意味着啓用遠程訪問?因爲我的意圖是啓用本地訪問。如果我錯了,請糾正我。 –

+0

'主機'本身並沒有啓用它,因爲它與「ADDRESS」掩碼結合在一起(AND)。當ADRESS是127.0.0.1/32時,它表示這條線上的規則僅適用於來自該地址的連接。但請記住,這是一整套規則說明所發生的事情和被拒絕的事情,不僅僅是一條線,甚至更少的一條線。 'pg_hba.conf'在整體上被解釋爲一個大的IF ... ELSIF ... ELSIF ... ENDIF –

+0

我試圖從LINE 7中刪除'ADDRESS',腳本仍然無法工作。我也試圖將整個LINE 7評論爲無效。 –

相關問題