在 VirtualBox Ubuntu 中连接到 MySQL

在 VirtualBox Ubuntu 中连接到 MySQL

我的 PC (Windows) 上有此代码,它使用仅主机网络从 Ubuntu 虚拟机调用数据库。我在 Ubuntu 机器上使用 VirtualBox

$ipHost = "xxx.xxx.x.xxx";
$nombreUsuario = "rootpi";
$passUsuario = "rootpi";
$bddNombre = "tienda";

$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);

if ($conexion->connect_error) {
    die("Conexión fallida: " .$conexion->connect_error);
}

$sql = "SELECT id, name, address, image FROM people";
$result = $conexion->query($sql);

if ($result->num_rows > 0 ) {
    //Stuff...
}

此代码运行良好。连接已建立,并在 Apache 服务器中的 PHP 页面上显示结果。我的主要目标是/var/www/html使用 WinSCP 将文件传递到目录中的 Ubuntu 14.04 虚拟机并从那里调用它们。

我认为唯一需要更改的行是将 $ipHost 变量从 ip 更改为 localhost:

$ipHost = "xxx.xxx.x.xxx"; -> $ipHost = "localhost";

但它不起作用。我尝试在以下之后进行回应:

$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);

但它并没有显示其后的回声。

我在 Ubuntu 中安装了 MySQL,还有该php5 php5-mcrypt软件包。

我的 PHP 版本是:

Windows:PHP 版本 5.6.3 - Ubuntu:PHP 版本 5.5.9-1ubuntu4.5

答案1

所以你基本上是说当你通过 IP 地址连接到 Ubuntu MySQL 时你可以连接,但是当你打开时localhost你无法更正?

这可能是 MySQL 授权与 IP 地址绑定的问题。但不清楚。我将执行以下操作进行调试。

首先,基础知识。

首先,您说您已经安装php5php5-mcrypt。但是 呢php5-mysql?这么简单的事情可能会让您头疼。只需运行此行:

sudo aptitude install php5-mysql

安装完成后,请像这样重新启动 Apache:

sudo service apache2 restart

如果一切顺利,那么这只是一个简单的软件安装问题。除此之外的任何问题都应由接下来的两项内容解决。

接下来检查MySQL网络是如何绑定的。

如果您已经nmap在 Ubuntu 系统上安装,请登录 Ubuntu 上的命令行并运行此命令:

nmap localhost -p 3306

如果您尚未安装nmap,只需运行以下命令进行安装;这是一个很好的简单的网络调试工具,所有设置都应该默认安装:

sudo aptitude install nmap

这将告诉您计算机上的 MySQL 端口 (3306) 是否打开。例如,我刚刚在测试的 Ubuntu 12.04 设置上执行了此操作,这是我得到的响应:

Starting Nmap 5.21 ( http://nmap.org ) at 2014-11-30 01:29 EST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000070s latency).
PORT     STATE SERVICE
3306/tcp open  mysql

这告诉我我的 MySL 端口 (3306)localhost已打开。如果显示已关闭,则可能存在问题,我会在 Ubuntu 系统上打开my.cnf并查找bind-address。我喜欢使用nano,因此这是我将使用的命令:

sudo nano /etc/mysql/my.cnf

在非网络安装的 MySQL 中,bind-address设置如下:

bind-address            = 127.0.0.1

这将强制绑定仅为localhost(127.0.0.1)。但是,如果您说可以从 Windows 主机连接到 MySQL 数据库,则可以将其设置为 VirtualBox IP 地址,如下所示;使用带有虚假 IP 地址的伪示例:

bind-address            = 123.456.789.0

这肯定会允许 Windows 主机连接,但是——这很关键——但它只允许通过 进行连接123.456.789.0

因此,允许 Windows 和 Ubuntu 在 VirtualBox 设置上使用 MySQL 服务器的更好方法是注释掉如下bind-address行:

# bind-address            = 123.456.789.0

然后像这样重新启动 MySQL:

sudo service mysql restart

完成此操作后,您的 MySQL 将可通过 Ubuntulocalhost以及 Windows 计算机通过 IP 连接进行访问。这基本上允许世界上的任何网络连接连接到该计算机。这对于现实世界的生产服务器来说不是一件好事,但对于本地化的测试/开发设置来说应该没问题。

现在,检查如何为数据库用户设置 MySQL 授权。

现在,如果第一部分基本上向您展示了您成功地在 Ubuntu 和 Windows 世界之间建立了网络连接但仍然无法连接,那么下一个问题可能与 MySQL 有关,GRANTS而 MySQL 基本上是 MySQL 中的用户权限。

要检查用户的授权,您首先应该以特权用户身份登录 MySQL,并运行此命令连接到mysql核心数据库:

CONNECT `mysql`;

然后运行此命令查看您已设置的用户/主机:

SELECT `user`, `host` from `user`;

root如果您仅进行了设置,则基本 MySQL 安装的输出应如下所示:

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | 127.0.0.1 |
| root             | ::1       |
| debian-sys-maint | localhost |
| root             | localhost |
+------------------+-----------+

当然,您的列表可能与我的不同,所以请记住这一点。但关键是您应该看到类似这样的内容。请注意root中有三个不同的条目user:一个用于127.0.0.1(IPv4 地址)、::1(IPv6 地址)和localhost(人类可读的主机名)。这是这里的关键。

问题是,如果您的用户仅绑定到网络地址(例如123.456.789.0),那么该用户将无法通过 进行连接localhost。因此,您需要为 单独设置授权localhost

做这样的事情相当容易。有些人喜欢在开发环境中将所有授权都抛给用户,如下所示:

GRANT ALL PRIVILEGES ON `some_database`.* TO 'some_user'@'localhost';

但我不喜欢这样做,原因有很多。我更喜欢为 MySQL 用户使用一套相当安全、可靠且标准的授权,允许他们在数据库中执行他们必须执行的操作,但不允许 root 权限,如下所示:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `some_database`.* TO 'some_user'@'localhost';

当然要更改,some_databasesome_user匹配您的特定设置。但在执行其中一个GRANT命令后,您需要告诉 MySQL 重新加载权限,如下所示:

FLUSH PRIVILEGES;

现在,如果您SHOW GRANTS以该用户身份运行,您可以看到您设置的所有权限:

SHOW GRANTS FOR 'some_user'@'localhost';

当我调试类似这样的 MySQL 网络/连接问题时,这些基本上是我所寻找和采取的两件事。

最后,从命令行测试连接。

现在要从 Ubuntu 14.04 命令行测试连接,只需输入以下命令:

mysql -u some_user -p

当然,请更改some_user为与您的用户匹配,然后输入您的密码。您现在应该通过该用户连接到 MySQL。如果您可以通过命令行成功连接,那么您就知道 MySQL 网络/连接工作正常。因此,任何过去的事情都可能与您的 PHP 编码本身有关。这确实超出了本网站简单答案的范围;您需要自己调试本地 PHP 代码来解决这个问题。

相关内容