【问题标题】:php connecting to mysql on localhost, request from remotephp连接到localhost上的mysql,来自远程的请求
【发布时间】:2013-11-25 22:21:26
【问题描述】:

我有一个运行在我的本地机器上的 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 的事实有关,但是当我将 127.0.0.1 替换为内部网络上的 IP 地址或外部 IP 地址时,它不会随时随地工作。有什么建议吗?

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

【问题讨论】:

  • 您确定您使用的 IP 地址正确吗?

标签: javascript php android


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      好的,您的本地主机正在您的计算机上运行,​​因此只能通过同一台计算机联系 127.0.0.1 来访问。

      如果您尝试从其他设备联系它,您必须查找您要联系的设备的私有 IP 地址。在大多数情况下,这可能类似于 192.168.x.x。

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

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

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

      【讨论】:

      • 所以即使 connect.php 和 SQL 服务器在同一台机器上,它也需要使用 WAN IP 地址?
      • 不,你的 php 文件应该使用 127.0.0.1。我刚看到你的编辑。您可能应该尝试检查您的 PHP 代码并查找连接到 msyql 的错误
      【解决方案4】:

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

      另外请注意,您的 MySQL 将需要接受外部连接,默认情况下它绑定到您的 localhost 并且不会侦听远程连接。这是因为 localhost 绑定到您操作系统的一个特殊的loopback interface,并且实际上并未绑定到您计算机中的网卡。您需要将 MySQL 绑定到网卡绑定的 IP 地址,以便它可以与外界通信。

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

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

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

      【讨论】:

      • 所以即使调用 php myphpscript.php 和 connect.php 在同一台机器上我也需要在 connect.php 中使用外部 IP 地址?
      • 如果您的应用程序只调用您的 PHP 脚本而不是直接调用您的数据库,那么您需要将 TCP 端口 80 而不是 3306 转发到您的计算机。然后您可以继续使用本地主机连接不需要从外部直接连接。
      猜你喜欢
      • 2016-02-22
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多