php连接到localhost上的mysql,从远程请求


php connecting to mysql on localhost, request from remote

我有一个wamp服务器在我的本地机器上运行,它暴露在外部世界中。我有几个php脚本,允许android应用程序访问与WAMP服务器在同一台机器上运行的mySQL数据库中包含的信息。当从我的本地网络内部进行测试时,一切都很好。然而,当我尝试从本地网络外部运行php脚本时,连接到mySQL时似乎出现了错误。

connect.php

<?php
header('Access-Control-Allow-Origin: *'); 
/*** mysql hostname ***/
$hostname = '127.0.0.1';
/*** mysql username ***/
$username = 'chaosjr_user';
/*** mysql password ***/
$password = 'pass';
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=chaos_jr", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

我几乎可以肯定这与我从外部引用localhost有关,但当我用内部网络上的IP地址或外部IP地址替换127.0.0.1时,它在任何地方都不起作用。有什么建议吗?

编辑:为了澄清,我可以从外部访问我的php脚本(我确实有一个静态IP地址),并从他们那里得到响应,只要该特定脚本不必查询MySQL。例如,我可以连接到XXX.XXX.XXX/myPHPscript.php,一切都很好。但是,本应使用SQL数据填充的菜单是空的。

您是正确的-地址127.0.0.1是您的本地IP地址,而不是您要从外部连接的地址。

如果你有一个静态IP地址,你需要使用它。如果你没有固定的IP地址,或者你有一个防火墙来阻止你使用的端口,你可能会发现事情很棘手。

您仍然应该使用127.0.0.1来连接到数据库,因为据我所知,PHP脚本和数据库在同一服务器上运行。它不在乎你的脚本是否从外部调用,如果脚本和DB在同一台服务器上,127.0.0.1是正确的地址。

在您的PHP代码中,它应该保持127.0.0.1,因为PHP和MySQL运行在同一服务器上,即您在该IP上的本地主机。但联系它要困难得多。

好的,所以你的本地主机正在你的计算机上运行,所以只能通过同一台计算机联系127.0.0.1来联系。

如果你试图从另一台设备联系它,你必须查找你想联系的设备的私人IP地址。在大多数情况下,这可能类似于192.168.x.x。

现在,从网络外部联系这台计算机更加困难,因为你将首先连接到路由器(通过其公共IP),该路由器应该将你转发到某个端口(可能是80端口)上的电脑。你必须确保你配置了路由器,这样它才能转发到你网络中的正确计算机和该计算机上的正确端口。

但是等等,还有更多!出于安全原因,大多数ISP(互联网服务提供商)每隔几天就会更改一次您的公共IP地址,这使得您更难维护对您试图访问的计算机的正确引用。

您可以通过访问找到您的WAN IP(公共IP)http://www.whatismyip.com并通过在shell中执行"ifconfig"或在windows命令提示符中执行"ipconfig"来检查本地IP

如果您确实希望您的数据库可以从网络外部使用(请注意,您的机器需要始终通电才能使用数据库),则需要在路由器上配置一个所谓的端口转发到您的内部地址。然后在你的应用程序中,确保使用你的外部IP地址,然后你的路由器会将请求重新路由到你的机器。

还要注意,MySQL需要接受外部连接,默认情况下它绑定到本地主机,不会侦听远程连接。这是因为localhost绑定到操作系统的一个特殊环回接口,而实际上并没有绑定到计算机中的网卡。您需要将MySQL绑定到绑定到网卡的IP地址,这样它才能与外界通信。

换句话说,你想要什么是可能的,但需要许多不同的步骤才能工作,主要是与网络/访问相关的,如何配置取决于你的设置。因此,这还没有现成的答案,需要一些尝试和错误。但基本上可以归结为以下步骤:

  1. 在路由器上为MySQL端口(默认值:tcp 3306)配置一个端口转发
  2. 确保您的MySQL服务器绑定到您的"外部"(在大多数LAN中,这是192.168.0.x地址)IP地址,而不是本地主机或127.0.0.1(这是my.ini配置文件中的设置)
  3. 确保您的应用程序尝试在您的远程IP地址(您从ISP获得的地址,所以不是您的127.0.0.1或192.168.0.x地址!)上创建数据库

对于最后一步,ISP给你一个静态IP地址也是很重要的。许多ISP使用DHCP地址,这意味着每次您的调制解调器重置时,当它再次启动时,您的IP地址可能会有所不同。您可以向ISP进行验证。永远记住,在内部托管通常并不理想,这对微型项目或初创项目来说是可以的,但如果情况严重,可以考虑在场外托管。