【发布时间】: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”。我需要进一步降低两个结果集。代码示例并不是全部,而是几乎全部。实际上,问题出现在代码的前几行中。当问题是“设计使然”时(现在没有人会这样做),那么我怎么能避免执行几个连续的查询呢?
-
这种行为不是设计使然,您一定是在某处犯了错误。
-
我不是这方面的专家,但可能会将第一个结果集提取到数组数组或内存中的某个东西中,然后在尝试第二个查询之前关闭该结果集?