我试图将一个老的,非常简单的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运行正常。我得到了记录,可以对它们做些什么。然后我需要另一个查询的另一个结果继续,但对同一连接的第二个查询会抛出这个&#34;访问被拒绝&#34;错误。
只要我只做一个查询就没问题。
你可能会猜到我以前有过&#34; mysql&#34;而不是&#34; mysqli&#34;在这段代码中,这是真的。奇怪的是,我仍然在旧服务器上运行旧代码,这很好地连接到它的旧MySQL。如果我将它指向新服务器上的新MySQL(MariaDB),则相同的旧代码仅显示相同的&#34;一个查询&#34;问题。我最初认为旧的PHP 5无法与新的MariaDB进行正确的对话,PHP 7也可以,但它在那里完全相同。
我的猜测是数据库上的一些怪癖,而不是PHP部分,因为这些连续的查询应该工作。他们还应该工作吗?
我已经检查了&#34; max_connections&#34;数据库配置文件中的条目和用户权限中没有发现异常的东西,但也许我只是不知道要查找的内容。
另一方面,非常web / DB服务器运行其他PHP / MySQL应用程序非常好,没有任何hickup。除了我的代码之外的一切。
我很确定我会错过一些微不足道的小事。
答案 0 :(得分:0)
感谢马里奥和暗影,你以正确的方式引导我。这种查询肯定正确并应该工作的一定知识让我再次关注数据库。
所以这就是......
原来,&#34; table2&#34;在上面的例子中不是一个表而是一个VIEW。没有固有的问题,如果不是旧的数据库中的原始定义是懒惰和坏的(在迁移之前):
CREATE
ALGORITHM=UNDEFINED
DEFINER=`root`@``
SQL SECURITY DEFINER
VIEW `table2` AS ...
但是没有用户&#34; root @&#34;在数据库中,它从来没有,没有人可以定义一个。我们有&#34; root @ localhost&#34;我们有&#34;用户@%&#34;。
旧的MySQL显然默默地解释为&#34; root @%&#39;或类似的选择进展顺利。新的选择&#34; SQL SECURITY DEFINER&#34;,查找&#34; root
@``&#34;的特权。并且正确地失败了&#34;访问被拒绝&#34;。
我使用正确的&#34; user @ localhost&#34;重新设计了视图作为数据库所有者。另外还有&#34; SQL SECURITY INVOKER &#34;,以防其他人打开查询以确保使用表权限。
在许多正确定义的观点之间出现了一些不好的观点,我偶然选择了一个糟糕的观点作为&#34;第二个&#34;每次一个。
一旦你了解它就可以轻松修复。