【问题标题】:PHP mysqli->connect to remote host inserts local hostname with usernamePHP mysqli->连接到远程主机使用用户名插入本地主机名
【发布时间】:2013-06-07 22:14:56
【问题描述】:

此代码在我的 Mac 上运行,但不是在托管服务器上运行。错误信息是:

Tue, 11 Jun 2013 14:46:48 -0700
Remote host: my_remoteserver.com
Remote user: my_user
Remote db: my_remotedbname
mysqli Failed to connect to MySQL: Access denied for user 'my_user'@'localsystem.com' (using password: YES)

由于某种原因,本地 apache/php 系统将“@localsystem.com”附加到我的用户 ID。我可以调整什么配置参数来防止这种情况发生?

当从我的 Mac 运行时,输出如预期的那样:

Tue, 11 Jun 2013 18:03:41 -0400
mysqli Connection was OK!
Show databases returned 2 rows.
information_schema ()
my_remotedatabase ()

代码:

<?php
$hostname = "my_remoteserver.us";
$user = "my_user";
$password = "_today0613";
$dbname   = "my_remotedbname";

echo date(r, time());
echo "Remote host: " . $hostname . "<br/>";
echo "Remote user: " . $username . "<br/>";
echo "Remote db: " . $dbname . "<br/>";


$con=mysqli_connect($hostname,$user,$password,$dbname);

// Check connection
if (mysqli_connect_errno($con))
  {
  echo "mysqli Failed to connect to MySQL: " . mysqli_connect_error();
  } else { echo "mysqli Connection was OK!<br />\n";}

/* Select queries return a resultset */
if ($result = $con->query("SHOW databases")) {
    printf("Show databases returned %d rows.<br />\n", $result->num_rows);

    /* fetch object array */
    while ($row = $result->fetch_row()) {
        printf ("%s (%s)<br />\n", $row[0], $row[1]);
    }
    /* free result set */
    $result->close();

    }
$con->close();
?>

【问题讨论】:

  • localsystem.com 是什么?您能否在连接之前回显连接变量以确保它们符合您的预期?也许有人以某种方式改变了。
  • 原始帖子中的代码也已更新。我添加了代码: echo "Remote host:" 。 $主机名。 "
    ";回声“远程用户:”。 $用户名。 "
    ";回声“远程数据库:”。 $数据库名。 "
    "; - 它返回没有@localsystem.com
    的用户标识
  • 该系统可能在某处有一个配置来自动附加@localsystem.com?
  • 是的,当然。但是哪里?以及如何覆盖或更改它?

标签: php mysqli remote-access


【解决方案1】:

您是否为用户启用了远程访问?如果没有,请以 root 或其他管理用户身份登录到您的 mysql 并发出:

GRANT ALL PRIVILEGES ON *.* TO  ‘USERNAME’@‘IP’  IDENTIFIED  BY  ‘PASSWORD’;

变化:

*.* 代表所有模式,所有表。对一个模式的特定访问(推荐):

SchemaName.*

username 给您要访问的用户

ip改成服务器所在的IP

identified by passwordpassword 替换用户密码。

然后发出:

FLUSH PRIVILEGES

或者重启整个mysql服务

【讨论】:

  • 正如我所说的 - 这在我的桌面上从我的 Mac 运行,连接到远程服务器“my_remoteserver.com” - 我决定通过将它放在我帮助管理的另一台服务器上来测试它 - 调用它“localsystem.com” - 出于某种奇怪的原因,该系统正在将自己的“@localsystem.com”插入用户 ID。
  • 我不想将@localsystem.com 添加到用户ID,因为在开发和生产期间可能会从许多不同的远程服务器访问数据库。
  • 帮助!谁能帮我解决这个问题 - 我已经开始做其他事情了,但仍然需要它才能正常工作。我不认为通过添加 user@remotesystem 不能解决这个问题。问题是我的 mysql 服务器将 @localsystem 附加到 UID。这就是我想要改变的行为。
  • 您使用的是 FQDN 吗?还是用于识别系统的 IP?
【解决方案2】:

好的,这是个问题。可能是原因。

$con=mysqli_connect($hostname,$user,$password,$dbname);

在你的调试中它使用。

echo "Remote user: " . $username . "<br/>";

这些必须是相同的变量。系统默认可能使用@localsystem.com,如果不填的话。

【讨论】:

  • 我不清楚你在说什么。 PHP mysqli_connect 正在正确使用远程 $hostname,但由于某种原因,它正在将 @localhost 添加到用户名。这是我无法克服或绕过的障碍。这对我来说是新行为,一些我无法发现的设置。
  • 在调试语句中你有一个不同的变量名。可能在某处名称不匹配。所以你以某种方式使用默认值。
  • 好吧。呃。感谢您指出那个小项目。我什至没有看到它。但是,其中一位同事添加了一些调试行,他可能添加不正确($user/$username)。我已经用 HostGator 打开了一张票,似乎添加 @localhost 是 cPanel 中的默认设置,他们将无法摆脱它。所以我只需要弄清楚如何解决它。此默认设置也会导致其他脚本出现问题,并且在其他托管服务上的 Plesk 环境中无法以这种方式工作。
  • 就像这里经常出现的情况一样,我们最终会自己解决问题。我已经解开了这个谜团,或者接近了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2019-02-23
  • 2018-10-09
  • 1970-01-01
相关资源
最近更新 更多