【问题标题】:Fatal error: Call to undefined function pg_connect()致命错误:调用未定义函数 pg_connect()
【发布时间】:2011-09-15 22:15:59
【问题描述】:

我正在尝试连接到安装了 PostgreSQL 的数据库(远程服务器)。我的 PHP 代码正在尝试使用 pg_connect() 连接到数据库,但我收到错误消息:-“致命错误:在第 82 行的 /var/www/website/functions.php 中调用未定义的函数 pg_connect()”。

第 82 行就是:

$db = pg_connect($conn_string);
where $conn_string = "host=".$hostname." port=5432 dbname=".$dbname." user=".$db_user." password=".$db_password.""

(之前定义的所有变量)

我检查了许多论坛,建议的唯一解决方案是找到包含一行的 php.ini 文件:- extension = pgsql.so(对于 UNIX)和 extension = php_pgsql.dll(对于 Windows)。

该语句应该被注释,解决方案是取消注释。我已经尝试过了,但仍然没有改变这种情况。远程服务器安装的版本高于 PostgreSQL v9.0.4。 然后我将 PostgreSQL v8.4.8 安装到我的笔记本电脑上,并使用 MAMP 在本地运行网站。起初,Apache 出于某种奇怪的原因崩溃了,我解决了这个问题,但我再次遇到了与以前相同的错误,即致命错误:调用未定义函数 pg_connect()....

我也跑了phpinfo(),显示php版本确实支持PostgreSQL模块。我花了一整天的时间寻找解决方案,但没有成功。这是我第一个开发网站的项目,我很无知。任何形式的帮助将不胜感激。

phpinfo() 在终端上给了我一个巨大的列表,但与 PostgreSQL 相关的列表如下:-

pdo_pgsql

PDO Driver for PostgreSQL => enabled
PostgreSQL(libpq) Version => 9.0.4
Module version => 1.0.2
Revision =>  $Id: pdo_pgsql.c 306939 2011-01-01 02:19:59Z felipe $ 

pgsql

PostgreSQL Support => enabled
PostgreSQL(libpq) Version => 9.0.4
Multibyte character support => enabled
SSL support => enabled
Active Persistent Links => 0
Active Links => 0

Directive => Local Value => Master Value
pgsql.allow_persistent => On => On
pgsql.auto_reset_persistent => Off => Off
pgsql.ignore_notice => Off => Off
pgsql.log_notice => Off => Off
pgsql.max_links => Unlimited => Unlimited
pgsql.max_persistent => Unlimited => Unlimited

我在每次编辑后都重新启动了 MAMP,因为到目前为止我读过的每篇文章都提到了它。我相信这会重置 Apache 和 php。

'pqsql.so'(在 UNIX 中相当于 Windows 中的 'php_pqsql.dll')存在于 'extension' 目录中。我还将“pqsql.so”文件复制粘贴到 Apache/bin 目录,但它没有给我任何更改。

我主要不是在命令行中运行 php。我只是想知道 phpinfo() 会给我什么与我在上面的回复中提到的 pgsql 相关的内容。

我仍在研究您提到的工具,并会在得到任何结果后立即回复。

谢谢, H

【问题讨论】:

  • 关于 PostreSQL,phpinfo() 到底显示了什么?您是否在两者之间重新启动了网络服务器?
  • +1 用于运行 phpinfo()。这无疑会表明 pgsql 扩展没有加载。您可能必须在 php.ini 中指定扩展的完整路径,然后重新启动 apache。

标签: php apache postgresql


【解决方案1】:

您需要安装 php-pgsql 包或为您的平台调用的任何包。顺便说一句,我不认为你说过。

在 Ubuntu 和 Debian 上:

sudo apt-get install php5-pgsql

【讨论】:

  • 这是我缺少的组件。谢谢!我通过打开下面的 apache 日志文件找到了这个解决方案:/var/log/apache/error.log 有问题的行说:缺少函数 pg_connect()
  • 谢谢。这在 ubuntu 上对我有用,但我还必须使用 sudo service apache2 restart 重新启动 apache。我希望这对其他人有所帮助。
  • 目前在 Mac 上使用 brew:brew install php56-pdo-pgsql
  • 在 ubuntu 18.04 上是:sudo apt install php-pgsql
  • 确实在 Ubuntu 衍生产品上sudo apt install php-pgsql 会为您安装的任何 PHP 版本安装它。
【解决方案2】:

ubuntu 安装简单:

只要运行:

sudo apt-get install php5-pgsql

然后

sudo service apache2 restart //restart apache

通过删除 ; 取消注释 php.ini 中的以下内容

;extension=php_pgsql.dll

然后重启apache

【讨论】:

  • 我确信对于 Debian/Ubuntu 我们不需要重启 apache2。
  • 在我的情况下仍然需要取消注释以下行:extension = php_pdo_pgsql.dll
  • 我取消了该行的注释,但我不知道我必须重新启动 Apache。我在 Windows 上使用 XAMPP,我必须重新启动 Apache 服务器才能使其工作。感谢您的解决方案。
  • extension=pgsql.so 用于 Arch
【解决方案3】:

您必须按照以下步骤操作:

打开php配置文件,位于如下目录

C: \ xampp \ php \ php.ini

在该文件中搜索扩展部分并取消注释以下行

extension = php_pdo_pgsql.dll  
extension = php_pgsql.dll

然后重启你的 apache

【讨论】:

    【解决方案4】:

    致命错误:调用未定义函数 pg_connect()...

    我在 Archlinux 中安装 Lampp 或 xampp 时遇到了这个错误,

    解决办法是编辑php.ini,它位于/opt/lampp/etc/php.ini

    然后找到这一行并取消注释

    extension="pgsql.so"
    

    然后用 xampp 重启服务器 apache 并测试...

    【讨论】:

    【解决方案5】:

    安装所需的软件包。 如果你使用 yum:

    yum search pgsql
    

    然后查看结果并找到任何类似于“php-pgsql”或类似的东西。复制名称,然后:

    yum install *paste the name of the package here*
    

    【讨论】:

      【解决方案6】:

      我在win7也有同样的症状。我得到了这个脚本:

      <?php
          phpinfo();
          pg_connect("blah");
      

      当我通过 apache (http://localhost/phpinfo.php) 执行 phpinfo.php 脚本时,我收到了错误消息: 在...中调用未定义的函数 pg_connect()

      当我从命令行 (php phpinfo.php) 执行 same 脚本时,我得到了预期的消息: PHP 警告:pg_connect():无法连接到 PostgreSQL 服务器:在“blah”之后缺少“=”

      在这两种情况下都使用了预期的 php.ini:

      Loaded Configuration File   C:\Program Files (x86)\php\php.ini 
      

      但在基于 apache 的执行情况下,phpinfo 中完全缺少 pgsql 部分,并且它存在于基于命令行的执行中。

      解决方案是我在 apache httpd.conf 中添加了以下行:

      LoadFile "C:/Program Files (x86)/php/libpq.dll"
      

      似乎由于某种原因,当 apache 运行 php 脚本时,该文件没有自动加载,但如果我从命令行运行 php 脚本,它就会被加载。

      我希望它有所帮助。

      【讨论】:

        【解决方案7】:

        对于 Centos 6.10 上的 php 5.4,我们将这些行包含在 php.ini 中

        extension=/opt/remi/php54/root/usr/lib64/php/modules/pdo.so
        extension=/opt/remi/php54/root/usr/lib64/php/modules/pgsql.so
        extension=/opt/remi/php54/root/usr/lib64/php/modules/pdo_pgsql.so
        

        有效。

        【讨论】:

          【解决方案8】:
          1. 在 httpd.conf 文件中添加 'PHPIniDir "C:/php"'。(提供 您将 PHP 保存在 C: 中,或者给出 PHP 所在的位置 已保存。)
          2. 在 'extension=php_pgsql.dll' 之后取消注释 php.ini 文件
          3. 在 php.ini 中取消注释 ';extension_dir = "ext"' 目录

          【讨论】:

          • 请不要添加“谢谢”作为答案。一旦你有足够的reputation,你就可以vote up questions and answers你觉得有帮助。
          • 但我尝试通过为已经存在的先前解决方案添加额外步骤来提供解决方案
          • 啊好吧。你会考虑改进你的答案吗,因为对我来说还不清楚是否有额外的步骤;)
          【解决方案9】:

          编辑。我刚刚注意到你提到了 MAMP。我的建议适用于 Windows,但如果您知道要使用哪些相应的工具,可能会有用。

          要尝试的事情

          • 您在编辑 php.ini 后是否重新启动了 PHP 和 Apache?

          • php_pgsql.dll 是否在您的 php\ext 目录中找到?

          • 您是否将 php 作为模块运行?如果是这样,请尝试复制 php_pgsql.dll Apache\bin 目录中的文件。

          • 您是否从命令行运行 PHP 并带有指定 不同的 php.ini 文件?

          • 您可以尝试使用诸如 Sysinternals 的 Filemon 之类的工具来查看 运行 PHP 时试图访问文件。

          • 您可以尝试使用 Dependency Walker 等工具来查看 postgreSQL DLL 的依赖项,以防缺少依赖项。快速搜索为 Unix 找到了 ldd

          【讨论】:

          • 在我的情况下,将 php_pgsql.dll 复制到 apache/bin 修复了它!
          【解决方案10】:

          我在 OSX 上也遇到过这个问题。解决方案是取消注释php.ini.default 中的extension = pgsql.so 并删除.default 后缀,因为文件php.ini 不存在。

          如果您使用 XAMPP,则 php.ini 文件位于 /XAMPP/xampfiles/etc 中

          【讨论】:

            【解决方案11】:

            我遇到了这个错误,它最终与 PHP 的 extension_dir 的加载方式有关。

            如果在打印出 phpinfo() 时,您发现在 PDO 标题下 PDO 驱动程序 设置为 no value,您可能需要检查您是否成功加载了您的扩展目录,详见这篇文章:

            https://stackoverflow.com/a/14786808/2578505

            【讨论】:

              【解决方案12】:

              在 Gentoo 上,在 /etc/portage/make.conf 中使用 USE flag postgres 并重新emerge "emerge php"

              【讨论】:

                【解决方案13】:

                php.ini 配置文件中取消注释extension=php_pgsql.dll 确实有效,但您可能还必须重新启动您的XAMPP 服务器才能最终使其正常工作。我不得不这样做。

                【讨论】:

                  【解决方案14】:

                  解决方案与保存 php 配置的文件有关。即 php.ini 通过放置“;”取消注释了负责充当 php 和 postgres 之间的中间人的扩展。在语句“extension=pdo_pgsql”之前

                  快速修复

                  1. 在您喜欢的编辑器中打开 php.ini 文件。 (原子?)
                  2. 在“动态扩展”部分下搜索“extension=pdo_pgsql”行。 (一个简单的 ctrl + f)会让你快速到达那里。
                  3. 删除“;”在“;extension=pdo_pgsql”行前面。
                  4. 重新启动服务器。
                  5. 像摇滚明星一样修复更多错误。 ?

                  【讨论】:

                    【解决方案15】:

                    如果您使用 ppa 存储库http://ppa.launchpad.net/ondrej/php/ubuntu 获得了 php5.6,

                    那么您应该使用以下方式安装软件包:

                    sudo apt install php5.6-pgsql

                    最后,如果你用的是apache2,重启一下:

                    sudo service apache2 restart

                    【讨论】:

                      【解决方案16】:

                      对于 PHP 5.6 遇到此问题的人,可以使用以下命令:

                      yum install php56w-pgsql
                      

                      有关 PHP 5.6 的更多包名称列表,请打开以下链接并向下滚动到包:

                      PHP 5.6 on CentOS/RHEL 7.0 and 6.6 via Yum

                      【讨论】:

                        【解决方案17】:

                        在 windows 操作系统中,在 php.ini "php_pgsql.dll" 中找到它并删除 ";"在扩展中就是这样:) 干杯!

                        【讨论】:

                          猜你喜欢
                          • 2013-01-28
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-10-02
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多