PHP MySQL 视图的查询 returns 应该有结果的时候0个结果
PHP MySQL Query of view returns 0 results when there should be a result
我的网站是 运行 PHP 5.6。该站点的数据库最近从 MySQL 5.1 升级到 MariaDB 10.0(MySQL 5.5 兼容),现在我的站点上的查询将无法运行(并且在连接到 MySQL 5.1 数据库.
对于这个演示,我有一个名为 "content" 的数据库 table,其中包含字段 "id"(整数)和 "page_title"(var_char)。其中 table 有两行 - 一行的 ID 为 1,page_title 为 "Test 1",第二行的 ID 为 2,page_title 设置为 "Test 2".
然后我在 phpMyAdmin 中使用以下查询创建了这个 table 的视图:
select `content`.`id` AS `id`,`content`.`page_title` AS `page_title` from `content`
我可以在 phpMyAdmin 的视图中看到视图和内容 table 的两行。
在我的 PHP 页面上,我有一个面向对象的样式查询。该代码是:
<?php
try {
require_once 'Connections/dbconn.php';
$sql = "SELECT id, page_title FROM v_content WHERE id = 1 LIMIT 1";
$stmt = $db->stmt_init();
if (!$stmt->prepare($sql)) {
$error = $stmt->error;
} else {
$stmt->bind_result($id, $page_title);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();
}
} catch (Exception $e) {
$error = $e->getMessage();
}?>
此查询返回以下内容:在没有与语句关联的结果集时尝试读取一行
如果我将 table 从 VIEW "v_content" 更改为仅 table "content",我会返回一个结果。此外,如果我使用相同的查询(查询 VIEW v_content)并连接到 MySQL 5.1 数据库,我会得到返回的结果。我知道查询本身没有任何问题,因为我已将查询复制并粘贴到 phpMyAdmin 中并返回了结果,并且在 MySQL 5.1 数据库上使用了完全相同的代码并返回了结果。我检查了错误日志,没有显示任何错误。
有人知道是什么导致我从视图返回 0 个结果吗?
我觉得你只需要调换execute和bind的位置就可以了
...
} else {
$stmt->execute();
$stmt->bind_result($id, $page_title);
$stmt->store_result();
$stmt->fetch();
}
...
看起来毕竟,网站的实际编码对我来说没有问题。托管公司给了我以下解释:
似乎准备好的语句无法正确处理视图的问题与新 maria 数据库服务器上的 table_definition_cache 大小有关。这是一个全局设置,本质上,如果放入缓存的表数超过此值,它就会开始将较旧的条目从缓存中清除。看起来,如果准备了一条语句,但在执行准备好的语句之前条目离开了 table_definition_cache,则它被认为是 "invalid" 并且需要重新准备。由于这是一个全局值,访问其他表可以重置其计数器。因此,我们在所有数据库服务器上将 table_definition_cache 的值增加到一个更高的值,从而解决了该问题。
我的网站是 运行 PHP 5.6。该站点的数据库最近从 MySQL 5.1 升级到 MariaDB 10.0(MySQL 5.5 兼容),现在我的站点上的查询将无法运行(并且在连接到 MySQL 5.1 数据库.
对于这个演示,我有一个名为 "content" 的数据库 table,其中包含字段 "id"(整数)和 "page_title"(var_char)。其中 table 有两行 - 一行的 ID 为 1,page_title 为 "Test 1",第二行的 ID 为 2,page_title 设置为 "Test 2".
然后我在 phpMyAdmin 中使用以下查询创建了这个 table 的视图:
select `content`.`id` AS `id`,`content`.`page_title` AS `page_title` from `content`
我可以在 phpMyAdmin 的视图中看到视图和内容 table 的两行。
在我的 PHP 页面上,我有一个面向对象的样式查询。该代码是:
<?php
try {
require_once 'Connections/dbconn.php';
$sql = "SELECT id, page_title FROM v_content WHERE id = 1 LIMIT 1";
$stmt = $db->stmt_init();
if (!$stmt->prepare($sql)) {
$error = $stmt->error;
} else {
$stmt->bind_result($id, $page_title);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();
}
} catch (Exception $e) {
$error = $e->getMessage();
}?>
此查询返回以下内容:在没有与语句关联的结果集时尝试读取一行
如果我将 table 从 VIEW "v_content" 更改为仅 table "content",我会返回一个结果。此外,如果我使用相同的查询(查询 VIEW v_content)并连接到 MySQL 5.1 数据库,我会得到返回的结果。我知道查询本身没有任何问题,因为我已将查询复制并粘贴到 phpMyAdmin 中并返回了结果,并且在 MySQL 5.1 数据库上使用了完全相同的代码并返回了结果。我检查了错误日志,没有显示任何错误。
有人知道是什么导致我从视图返回 0 个结果吗?
我觉得你只需要调换execute和bind的位置就可以了
...
} else {
$stmt->execute();
$stmt->bind_result($id, $page_title);
$stmt->store_result();
$stmt->fetch();
}
...
看起来毕竟,网站的实际编码对我来说没有问题。托管公司给了我以下解释:
似乎准备好的语句无法正确处理视图的问题与新 maria 数据库服务器上的 table_definition_cache 大小有关。这是一个全局设置,本质上,如果放入缓存的表数超过此值,它就会开始将较旧的条目从缓存中清除。看起来,如果准备了一条语句,但在执行准备好的语句之前条目离开了 table_definition_cache,则它被认为是 "invalid" 并且需要重新准备。由于这是一个全局值,访问其他表可以重置其计数器。因此,我们在所有数据库服务器上将 table_definition_cache 的值增加到一个更高的值,从而解决了该问题。