我正在尝试将我的Zend应用程序连接到运行在共享服务器上的MySQL进程。基本配置应该没问题,因为它与LAMP服务器一起工作。
问题是,我需要指定主机为sql进程:myprocess.db
,而不是localhost
:
resources.db.adapter = PDO_MYSQL
resources.db.params.charset = "utf8"
resources.db.params.host = mysqlprocess.db
resources.db.params.username = username
resources.db.params.password = password
resources.db.params.dbname = dbname
然而,当我这样做时,我得到这个:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]:
Can't connect to local MySQL server through socket 'please_see_the_faq' (2)
in /f5/metamusic/protected/application/controllers/SearchController.php on line 418
我使用的主机是NearlyFreeSpeech,这条消息显然是在试图连接到SQL而没有指定你感兴趣的进程时触发的:http://faq.nearlyfreespeech.net/section/mysql/mysqllocalhost mysqllocalhost
使用相同的细节和mysql_connect($server, $user)
工作没有问题,所以看起来Zend不知何故没有使用正确的主机参数。
你知道出了什么问题吗?
尝试使用
resources.db.params。
db配置中的主机必须指向数据库服务器。localhost
或127.0.0.1
是与应用程序在同一台服务器上的数据库的引用。在托管环境中,您通常将服务器放在远程服务器上,因此主机必须是主机的IP地址或DNS名称。
查看FAQ中的第二个问题。
我的错,这是关于DSN而不是DNS。不过,这就是问题所在。配置中的resources.db.params.host
指令期望对数据库服务器的引用,而myprocess.db
既不是DNS名称也不是IP地址。为此您可能需要localhost,但是您仍然会缺少DSN。我目前不知道如何在PHP中为MySQL和Zend设置DSN。请进一步查看此MYSQL DSN。
更新2 你对插座的理解是正确的,这是相关的。我认为问题是Zend PDO_MYSQL适配器。Zend将其直接传递给PDO()。我上面提到的这个额外的配置选项(MYSQL DSN)在Zend实现中是缺失的。虽然PDO_MYSQL适配器覆盖了connect()方法,但它不会查找这些选项。
然而,还有另一个适配器mysqli
直接连接到MySQL,实际上与您使用mysql_connect()
进行测试的方式相同。它使用mysqli_real_connect()
,并且该连接可以理解套接字的进程名。因此,您可以在配置中尝试以下操作:
resources.db.adapter = "mysqli"
我把我的最终解决方案贴在这里供将来参考:
结果是,数据库连接已经在工作。但是,我对mysql_real_escape_string()
的调用失败了,由此产生的错误消息表明整个数据库连接失败了。
解决方案是简单地将上面的调用替换为Zend_DB_Adapter的quote()
,然后突然一切都工作了。
为什么这在LAMP机器上工作而不是在共享服务器上,我不知道。但现在,这是一个足够好的解决方案!