我正在尝试将我的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在某种程度上没有使用正确的主机参数。
任何想法出了什么问题?任何帮助将不胜感激。
答案 0 :(得分:0)
尝试使用
resources.db.params.host = myprocess.db
答案 1 :(得分:0)
db config中的主机必须指向数据库服务器。 localhost
或127.0.0.1
是与应用程序位于同一服务器上的数据库的引用。在托管环境中,您通常在远程服务器上安装服务器,因此主机必须是主机的IP地址或DNS名称。
检查FAQ中的第二个问题。
<强>更新强>
我的坏,这是关于DSN而不是DNS。不过,这就是问题所在。配置中的resources.db.params.host
指令需要引用数据库服务器,而myprocess.db
既不是DNS名称也不是IP地址。你可能需要localhost,但是你仍然会错过DSN。我目前看不到你如何在PHP中为MySQL设置DSN,因此Zend。请进一步查看此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"
答案 2 :(得分:0)
我在这里发布我的最终解决方案以供将来参考:
事实证明,数据库连接已经在运行。但是,我对mysql_real_escape_string()
的调用失败,并且生成的错误消息表明整个数据库连接都失败了。
解决方案只是用Zend_DB_Adapter的quote()
替换上面的调用,突然一切正常。
为什么这适用于LAMP机器而不是共享服务器,我不知道。但就目前而言,这是一个足够好的解决方案!