【问题标题】:PHP, Access denied for user 'username'@'localhost' (using password: YES) on SECOND queryPHP,在第二次查询中拒绝用户“用户名”@“本地主机”的访问(使用密码:是)
【发布时间】:2018-01-01 23:28:35
【问题描述】:

我正在尝试将一个较旧且非常简单的 PHP 应用程序迁移到新服务器,但成功率非常有限。

$conn = mysqli_connect($hostname, $username, $password, $database);

$query1 = "select field1 from table2 where anotherfield < 3";
$res1 = mysqli_query($conn, $query1);
$row_one = mysqli_fetch_assoc($res1);

// do something with result in $row_one and maybe loop through results

$query2 = "select field2 from table2 where anotherfield = 'somevalue'";
// the next one is going to fail
$res2 = mysqli_query($conn, $query2);
$row_two = mysqli_fetch_assoc($res2);

// do something with $res1 and $res2

第一个 mysqli_query 运行良好。我得到记录,可以对它们做点什么。然后我需要另一个查询的另一个结果才能继续,但是对同一连接的第二个查询会引发此“拒绝访问”错误。

只要我只做一个查询就没有问题。

你可能会猜到我之前在这段代码中使用的是“mysql”而不是“mysqli”,这是真的。奇怪的是,我仍然在旧服务器上运行旧代码,可以很好地连接到旧 MySQL。如果我将它指向新服务器上的新 MySQL (MariaDB),相同的旧代码会显示相同的“仅一个查询”问题。我最初认为旧的 PHP 5 无法与新的 MariaDB 正确通信,而 PHP 7 可以,但那里完全一样。

我的猜测是数据库有一些怪癖,而不是 PHP 部分,因为这些连续的查询应该可以工作。他们还应该工作吗?

我已经检查了数据库配置文件和用户权限中的“max_connections”条目,没有发现异常,但也许我只是不知道要查找什么。

另一方面,Web/DB 服务器可以很好地运行其他 PHP/MySQL 应用程序,没有任何问题。除了我的一段代码之外的所有内容。

我很确定我错过了一些琐碎和基本的东西。

【问题讨论】:

  • 您遗漏的代码可能更相关。一个 mysqli_close 你忘了提?另外,为什么上帝的名字是mysqli而不是PDO? (仅仅使用i 并不是一个明智的迁移策略。)
  • 我同意@mario,您在问题中省略的代码中一定有错误。
  • 现在我只想“迁移到新服务器”,而不是重新设计完整的应用程序,因此 mysqli 似乎是让它再次运行的更快方法。这里没有“msqli_close”。我需要进一步降低两个结果集。代码示例并不是全部,而是几乎全部。实际上,问题出现在代码的前几行中。当问题是“设计使然”时(现在没有人会这样做),那么我怎么能避免执行几个连续的查询呢?
  • 这种行为不是设计使然,您一定是在某处犯了错误。
  • 我不是这方面的专家,但可能会将第一个结果集提取到数组数组或内存中的某个东西中,然后在尝试第二个查询之前关闭该结果集?

标签: php mysql mysqli mariadb


【解决方案1】:

感谢 mario 和 Shadow,您为我指引了正确的方向。这种查询肯定看起来正确并且应该可以工作的某些知识使我再次将注意力集中在数据库上。

就这样吧……

原来上面例子中的“table2”不是一个表,而是一个视图。这没有固有的问题,如果不是原始定义在旧数据库中是懒惰和坏的(迁移之前):

CREATE 
  ALGORITHM=UNDEFINED 
  DEFINER=`root`@`` 
  SQL SECURITY DEFINER 
VIEW `table2` AS ...

但是数据库中没有用户“root@”,从来没有,也没有人可以定义一个。我们有“root@localhost”和“user@%”。

旧的MySQL显然默默地解释为“root@%”或类似,并且选择顺利。新的选择“SQL SECURITY DEFINER”,查找“root@``”的权限并正确因“拒绝访问”而失败。

我使用正确的“user@localhost”和“SQL SECURITY INVOKER”将视图重新设计为数据库所有者,以防其他人打开查询以确保表权限用过。

在许多正确定义的观点之间存在一些不好的观点,我每次都偶然选择了一个不好的观点作为“第二个”观点。

很容易解决,一旦你知道了。

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2012-11-05
    • 2022-10-15
    • 2018-10-01
    • 2017-04-02
    • 2013-12-10
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多