PHP - MYSQL - 测试数据库服务器

5
我正在学习PHP MYSQL并尝试创建数据库。
我正在按照这个教程进行操作:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 到目前为止,我正在测试服务器是否可以访问MySQL。当我使用以下代码时。
?php

class RedeemAPI {
   private $db;

   // Constructor - open DB connection
   function __construct() {
       $this->db = new mysqli('localhost', 'username', 'password', 'promos');
    $this->db->autocommit(FALSE);
}

// Destructor - close DB connection
function __destruct() {
    $this->db->close();
}

// Main method to redeem a code
function redeem() {
    // Print all codes in database
    $stmt = $this->db->prepare('SELECT id, code, unlock_code, uses_remaining FROM rw_promo_code');
    $stmt->execute();
    $stmt->bind_result($id, $code, $unlock_code, $uses_remaining);
    while ($stmt->fetch()) {
        echo "$code has $uses_remaining uses remaining!";
    }
    $stmt->close();
   }
} 
// This is the first thing that gets called when this page is loaded
// Creates a new instance of the RedeemAPI class and calls the redeem method
$api = new RedeemAPI;
$api->redeem();

?

我得到以下错误:
Warning: mysqli::mysqli() [mysqli.mysqli]: [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) in /Users/user/Sites/promos/index.php on line 8

Warning: mysqli::mysqli() [mysqli.mysqli]: (HY000/2002): No such file or directory in /Users/user/Sites/promos/index.php on line 8

Warning: mysqli::autocommit() [mysqli.autocommit]: Couldn't fetch mysqli in /Users/user/Sites/promos/index.php on line 9

Warning: mysqli::prepare() [mysqli.prepare]: Couldn't fetch mysqli in /Users/user/Sites/promos/index.php on line 20

Fatal error: Call to a member function execute() on a non-object in /Users/user/Sites/promos/index.php on line 21

我可能忘记启用某些东西了吗?

这可能解释了为什么我不能通过我的IP地址连接到Sequel Pro,只能连接到127.0.0.1?


1
你是否已经安装了mysqli?并且它是否已经启动? - bobthyasian
我会从一个更基础的例子开始。 - j08691
本地托管?在Linux上设置服务器可能会有一些挑战。 - bobthyasian
我已经安装了MySQL,但是我只能通过本地地址连接到Sequel Pro。 - nimbus
我知道对于mysql来说,它可能与php.ini文件中的mysql.default_socket行有关。你应该检查此文件中类似的条目。 - epsilones
我已经将我的UNIX套接字更改为/tmp/mysql.sock。 - nimbus
3个回答

17

Apache服务器使用'127.0.0.1'代替'localhost'


这个可以运行,但您能否详细解释一下为什么呢?我只是想更好地理解这一切。 - Sammio2
正如 @mingos 所解释的那样,这是一个常见问题。 'localhost' 似乎没有指向 Apache 服务器中正确的套接字。使用 127.0.0.1 可以纠正这个问题。 - Jonathan
这与apache无关。Mysql通过“UNIX socket”使用“localhost”,通过“TCP/IP”使用“127.0.0.1”。因此,如果您使用“localhost”,请指定正确的“mysql.sock”路径。https://dev.mysql.com/doc/refman/5.6/en/connecting.html#id471316 - ahuigo

10

为使此功能起作用(假设您已安装MySQL服务器),您需要检查两个设置:

检查PHP配置中mysql.default_socket的值。

检查MySQL配置文件中[mysqld]下的socket的值。

这些值必须相同;如果不同,请更改其中一个以匹配另一个并重新启动相应的服务。


1
mysqli 使用 mysqli.default_socket 替代。而 pdo 使用 pdo_mysql.default_socket。我们可以通过 php -i | grep -F .default_socket 来进行检查。 - ahuigo

2
这似乎是一个常见问题,因为在谷歌搜索中可以得到很多结果。我在我的两台Linux机器上也遇到了这个问题(但从未在Windows下遇到),最终我决定在所有开发服务器上只使用127.0.0.1。基本上,localhost使连接到MySQL服务器使用套接字,但您的配置没有正确指向套接字文件。
以下是您可能会发现有用的一些资源: http://westsworld.dk/blog/2011/03/problems-connecting-to-unixvarmysqlmysql-sock/ - 基本上就像@Jack建议的那样,但更详细 Can't connect to MySQL on Mac -- missing mysql.sock file - 这里是如何定位您的套接字文件(出于某种原因,我的 php.ini 路径是错误的,我想您的情况可能类似)。
希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接