在 VirtualBox Ubuntu 中连接到 MySQL

nih*_*hCC 5 mysql php ubuntu

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

\n\n
$ipHost = "xxx.xxx.x.xxx";\n$nombreUsuario = "rootpi";\n$passUsuario = "rootpi";\n$bddNombre = "tienda";\n\n$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);\n\nif ($conexion->connect_error) {\n    die("Conexi\xc3\xb3n fallida: " .$conexion->connect_error);\n}\n\n$sql = "SELECT id, name, address, image FROM people";\n$result = $conexion->query($sql);\n\nif ($result->num_rows > 0 ) {\n    //Stuff...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
$ipHost = "xxx.xxx.x.xxx"; -> $ipHost = "localhost";\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这不起作用。我尝试回显后:

\n\n
$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它不显示其后的回声。

\n\n

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

\n\n

我的 PHP 版本是:

\n\n

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

\n

Gia*_*968 2

所以你基本上是说当你通过IP地址连接到Ubuntu MySQL时你可以连接,但是当你打开时localhost你可以\xe2\x80\x99t正确吗?

\n

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

\n

首先,基础知识。

\n

在做任何事情之前,你说你已经php5php5-mcrypt安装了。但是关于php5-mysql?这么简单的事情可能会让你头疼。只需运行这一行:

\n
sudo aptitude install php5-mysql\n
Run Code Online (Sandbox Code Playgroud)\n

安装完成后,重新启动 Apache,如下所示:

\n
sudo service apache2 restart\n
Run Code Online (Sandbox Code Playgroud)\n

现在,如果一切都清楚了,那就是一个简单的软件安装问题。任何其他内容都应该包含在接下来的两项中。

\n

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

\n

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

\n
nmap localhost -p 3306\n
Run Code Online (Sandbox Code Playgroud)\n

如果你还没有nmap安装\xe2\x80\x99,只需运行以下命令即可安装;it\xe2\x80\x99s 是一个很好的简单网络调试工具,所有设置都应该默认安装:

\n
sudo aptitude install nmap\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Starting Nmap 5.21 ( http://nmap.org ) at 2014-11-30 01:29 EST\nNmap scan report for localhost (127.0.0.1)\nHost is up (0.000070s latency).\nPORT     STATE SERVICE\n3306/tcp open  mysql\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
sudo nano /etc/mysql/my.cnf\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
bind-address            = 127.0.0.1\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
bind-address            = 123.456.789.0\n
Run Code Online (Sandbox Code Playgroud)\n

这肯定会允许 Windows 主机连接,但是\xe2\x80\x94,这很关键\xe2\x80\x94,但它只允许通过123.456.789.0.

\n

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

\n
# bind-address            = 123.456.789.0\n
Run Code Online (Sandbox Code Playgroud)\n

然后像这样重新启动MySQL:

\n
sudo service mysql restart\n
Run Code Online (Sandbox Code Playgroud)\n

完成后,您的 MySQL 将可以在 Ubuntu 中通过 IP 连接访问localhost,也可以在 Windows 机器上通过 IP 连接访问。它\xe2\x80\x99s 基本上允许世界上的任何网络连接连接到该机器。这对于现实世界的生产服务器来说不是一件好事,但对于本地化的测试/开发设置来说应该没问题。

\n

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

\n

现在,如果第一部分基本上表明您成功地在 Ubuntu 和 Windows 世界之间建立了网络,但仍然可以\xe2\x80\x99t 连接,那么下一个问题可能与 MySQL 相关GRANTS这基本上是 MySQL 中的用户权限。

\n

要检查您的 user\xe2\x80\x99s 是否授予您权限,您首先应以特权用户身份登录 MySQL 并运行此命令以连接到mysql核心数据库:

\n
CONNECT `mysql`;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
SELECT `user`, `host` from `user`;\n
Run Code Online (Sandbox Code Playgroud)\n

如果你只安装了 MySQL,那么基本 MySQL 安装的输出应该是这样的root

\n
+------------------+-----------+\n| user             | host      |\n+------------------+-----------+\n| root             | 127.0.0.1 |\n| root             | ::1       |\n| debian-sys-maint | localhost |\n| root             | localhost |\n+------------------+-----------+\n
Run Code Online (Sandbox Code Playgroud)\n

当然,您的列表可能与我的不同,因此请记住这一点。但关键是你应该看到这样的东西。请注意 中如何root包含三个不同的条目user:一个用于127.0.0.1(IPv4 地址)、::1(IPv6 地址)和localhost(人类可读的主机名)。这是关键。

\n

问题是,如果您的用户仅绑定到网络地址 \xe2\x80\x94,例如123.456.789.0\xe2\x80\x94,那么用户将无法通过localhost. 因此,您需要为localhost.

\n

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

\n
GRANT ALL PRIVILEGES ON `some_database`.* TO 'some_user'@'localhost';\n
Run Code Online (Sandbox Code Playgroud)\n

但出于多种原因,我不喜欢这样。我更喜欢为 MySQL 用户使用一组相当安全、可靠和标准的授权,允许他们在数据库中执行他们必须执行的操作,但不允许像这样的 root 权限:

\n
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';\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
FLUSH PRIVILEGES;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
SHOW GRANTS FOR 'some_user'@'localhost';\n
Run Code Online (Sandbox Code Playgroud)\n

当我调试像这样的 MySQL 网络/连接问题时,这些基本上是我会寻找并采取行动的两件事。

\n

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

\n

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

\n
mysql -u some_user -p\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n