我的 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}\nRun Code Online (Sandbox Code Playgroud)\n\n这段代码工作正常。连接已建立,并在 Apache 服务器中的 PHP 页面上显示结果。我的主要目标是使用 WinSCP 将文件传递到我的 Ubuntu 14.04 虚拟机的目录中/var/www/html,并从那里调用它们。
我认为我需要更改的唯一一行是将 $ipHost 变量从 ip 更改为 localhost:
\n\n$ipHost = "xxx.xxx.x.xxx"; -> $ipHost = "localhost";\nRun Code Online (Sandbox Code Playgroud)\n\n但这不起作用。我尝试回显后:
\n\n$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);\nRun Code Online (Sandbox Code Playgroud)\n\n但它不显示其后的回声。
\n\n我在 Ubuntu 中安装了 MySQL,还有php5 php5-mcrypt软件包。
我的 PHP 版本是:
\n\nWindows:PHP 版本 5.6.3 - Ubuntu:PHP 版本 5.5.9-1ubuntu4.5
\n所以你基本上是说当你通过IP地址连接到Ubuntu MySQL时你可以连接,但是当你打开时localhost你可以\xe2\x80\x99t正确吗?
这可能是 MySQL 授权与 IP 地址绑定的问题。但不清楚。我会执行以下操作来调试。
\n在做任何事情之前,你说你已经php5并php5-mcrypt安装了。但是关于php5-mysql?这么简单的事情可能会让你头疼。只需运行这一行:
sudo aptitude install php5-mysql\nRun Code Online (Sandbox Code Playgroud)\n安装完成后,重新启动 Apache,如下所示:
\nsudo service apache2 restart\nRun Code Online (Sandbox Code Playgroud)\n现在,如果一切都清楚了,那就是一个简单的软件安装问题。任何其他内容都应该包含在接下来的两项中。
\n如果您已nmap在 Ubuntu 系统上安装,请登录 Ubuntu 上的命令行并运行以下命令:
nmap localhost -p 3306\nRun Code Online (Sandbox Code Playgroud)\n如果你还没有nmap安装\xe2\x80\x99,只需运行以下命令即可安装;it\xe2\x80\x99s 是一个很好的简单网络调试工具,所有设置都应该默认安装:
sudo aptitude install nmap\nRun Code Online (Sandbox Code Playgroud)\n这将告诉您机器上的 MySQL 端口 (3306) 是否打开。例如,我刚刚在 Ubuntu 12.04 设置上执行了此操作,这是我得到的响应:
\nStarting 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\nRun Code Online (Sandbox Code Playgroud)\n这告诉我我的 MySL 端口 (3306)localhost已打开。如果显示已关闭,则可能是一个问题,我会在 Ubuntu 系统上打开my.cnf并查找bind-address. 我喜欢使用nano,所以这是我会使用的命令:
sudo nano /etc/mysql/my.cnf\nRun Code Online (Sandbox Code Playgroud)\n在非网络安装的 MySQL 上,设置bind-address如下:
bind-address = 127.0.0.1\nRun Code Online (Sandbox Code Playgroud)\n这将强制绑定仅为localhost(127.0.0.1)。但是如果你说你可以从 Windows 主机连接到 MySQL 数据库,那么可以将其设置为 VirtualBox IP 地址,如下所示;使用带有假 IP 地址的伪示例:
bind-address = 123.456.789.0\nRun Code Online (Sandbox Code Playgroud)\n这肯定会允许 Windows 主机连接,但是\xe2\x80\x94,这很关键\xe2\x80\x94,但它只允许通过123.456.789.0.
因此,允许 Windows 和 Ubuntu 在 VirtualBox 设置上使用 MySQL 服务器的更好方法是注释掉bind-address如下行:
# bind-address = 123.456.789.0\nRun Code Online (Sandbox Code Playgroud)\n然后像这样重新启动MySQL:
\nsudo service mysql restart\nRun Code Online (Sandbox Code Playgroud)\n完成后,您的 MySQL 将可以在 Ubuntu 中通过 IP 连接访问localhost,也可以在 Windows 机器上通过 IP 连接访问。它\xe2\x80\x99s 基本上允许世界上的任何网络连接连接到该机器。这对于现实世界的生产服务器来说不是一件好事,但对于本地化的测试/开发设置来说应该没问题。
现在,如果第一部分基本上表明您成功地在 Ubuntu 和 Windows 世界之间建立了网络,但仍然可以\xe2\x80\x99t 连接,那么下一个问题可能与 MySQL 相关GRANTS这基本上是 MySQL 中的用户权限。
要检查您的 user\xe2\x80\x99s 是否授予您权限,您首先应以特权用户身份登录 MySQL 并运行此命令以连接到mysql核心数据库:
CONNECT `mysql`;\nRun Code Online (Sandbox Code Playgroud)\n然后运行此命令来查看您设置的用户/主机:
\nSELECT `user`, `host` from `user`;\nRun Code Online (Sandbox Code Playgroud)\n如果你只安装了 MySQL,那么基本 MySQL 安装的输出应该是这样的root:
+------------------+-----------+\n| user | host |\n+------------------+-----------+\n| root | 127.0.0.1 |\n| root | ::1 |\n| debian-sys-maint | localhost |\n| root | localhost |\n+------------------+-----------+\nRun Code Online (Sandbox Code Playgroud)\n当然,您的列表可能与我的不同,因此请记住这一点。但关键是你应该看到这样的东西。请注意 中如何root包含三个不同的条目user:一个用于127.0.0.1(IPv4 地址)、::1(IPv6 地址)和localhost(人类可读的主机名)。这是关键。
问题是,如果您的用户仅绑定到网络地址 \xe2\x80\x94,例如123.456.789.0\xe2\x80\x94,那么用户将无法通过localhost. 因此,您需要为localhost.
做这样的事情相当容易。有些人喜欢在开发环境中将所有授权都扔给用户,如下所示:
\nGRANT ALL PRIVILEGES ON `some_database`.* TO 'some_user'@'localhost';\nRun Code Online (Sandbox Code Playgroud)\n但出于多种原因,我不喜欢这样。我更喜欢为 MySQL 用户使用一组相当安全、可靠和标准的授权,允许他们在数据库中执行他们必须执行的操作,但不允许像这样的 root 权限:
\nGRANT 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';\nRun Code Online (Sandbox Code Playgroud)\n当然可以更改,some_database并some_user匹配您的特定设置。但是在执行这些命令之一之后GRANT,您需要告诉 MySQL 重新加载权限,如下所示:
FLUSH PRIVILEGES;\nRun Code Online (Sandbox Code Playgroud)\n现在,如果您SHOW GRANTS在该用户上运行,您可以看到您设置的所有权限:
SHOW GRANTS FOR 'some_user'@'localhost';\nRun Code Online (Sandbox Code Playgroud)\n当我调试像这样的 MySQL 网络/连接问题时,这些基本上是我会寻找并采取行动的两件事。
\n现在要从 Ubuntu 14.04 命令行测试连接,只需输入以下命令:
\nmysql -u some_user -p\nRun Code Online (Sandbox Code Playgroud)\n当然更改some_user以匹配您的用户,然后输入您的密码。您现在应该通过该用户连接到 MySQL。如果您可以通过命令行成功连接,那么您就知道 MySQL 网络/连接功能运行良好。所以过去的任何事情都可能与您的 PHP 编码本身有关。这确实超出了本网站简单答案的范围;你需要自己调试本地 PHP 代码来解决这个问题。
| 归档时间: |
|
| 查看次数: |
10537 次 |
| 最近记录: |