我正在尝试将一个旧的、非常简单的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\u查询运行良好。我有记录可以做点什么。然后我需要另一个查询的另一个结果继续,但是对同一个连接的第二个查询抛出这个“拒绝访问”错误。
没问题,只要我只做一个查询。
您可能会猜到,我以前在这段代码中使用了“mysql”而不是“mysqli”,这是真的。奇怪的是,我仍然在一个旧服务器上运行旧代码,这个服务器可以很好地连接到它的旧mysql。如果我将它指向新服务器上的新mysql(mariadb),同样的旧代码显示同样的“仅一个查询”问题。我最初认为旧的php5不能正确地与新的mariadb和php7进行通信,但是在那里是完全相同的。
我的猜测是关于数据库的一些怪癖,而不是php部分,因为这些连续的查询应该可以工作。它们还能用吗?
我已经在db config文件和user privileges中检查了“max\u connections”条目,没有发现异常,但可能我不知道该查找什么。
另一方面,web/db服务器运行其他php/mysql应用程序非常好,没有任何问题。除了我的代码。
我很肯定我错过了一些琐碎和基本的东西。
1条答案
按热度按时间7kjnsjlb1#
多亏了马里奥和影子,你指引了我正确的方向。这种查询看起来确实是正确的,而且应该是有效的,这一点让我再次把注意力放在了数据库上。
就这样。。。
结果发现,上面示例中的“table2”不是一个表,而是一个视图。如果不是原始定义在旧数据库中(在迁移之前)是懒惰和不好的,那么这没有内在的问题:
但是数据库中没有用户“root@”,从来没有,也没有人能定义一个。“我们有”root@localhost我们有“user@%”。
旧的mysql显然默默地将其解释为“root@%'或类似的,select进行得很顺利。新的一个选择“sql安全定义器”,查找
root
@``并正确地以“拒绝访问”失败。我用正确的user@localhost另外还有“sql security invoker”,以防其他人打开查询以确保使用表权限。
在许多正确定义的观点之间有一些不好的观点,每次我都会偶然选择一个不好的观点作为“第二个”。
一旦你知道了,很容易搞定。