PHP MySQL查询视图返回0结果应该有结果

时间:2015-11-02 19:14:57

标签: php mysqli mariadb

我有一个运行PHP 5.6的网站。该站点的数据库最近从MySQL 5.1升级到MariaDB 10.0(MySQL 5.5兼容),现在我的站点上的查询无法正常工作(并且在连接到MySQL 5.1数据库时它正常运行。

对于这个演示,我有一个名为" content"的数据库表。用字段" id" (整数)和" page_title" (var_char)。在该表中有两行 - 一行ID为1,page_title为"测试1",第二行ID为2,page_title设置为"测试2"。

然后我使用phpMyAdmin中的以下查询创建了该表的视图:

select `content`.`id` AS `id`,`content`.`page_title` AS `page_title` from `content`

我可以在phpMyAdmin的视图中看到内容表中的视图和两行。

在我的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();
}?>

此查询返回以下内容:尝试在没有与语句关联的结果集时读取行

如果我从VIEW&#34; v_content&#34;更改表格到表格&#34;内容&#34;,我得到一个结果返回。另外,如果我使用相同的查询(查询VIEW v_content),并连接到MySQL 5.1数据库,我会返回结果。我知道查询本身没有任何问题,因为我已经将查询复制并粘贴到phpMyAdmin并返回了结果,并且在MySQL 5.1数据库上使用了完全相同的代码并返回了结果。我检查了错误日志,没有显示错误。

任何人都知道是什么原因导致我从视图中返回0结果?

2 个答案:

答案 0 :(得分:1)

毕竟看起来我的网站实际编码没有问题。托管公司给了我以下解释:

准备好的语句与视图工作不正常的问题似乎与新maria数据库服务器上的table_definition_cache大小有关。这是一个全局设置,基本上,如果放入缓存的表的数量超过此值,它将开始从缓存中刷新旧条目。似乎如果准备了一个语句,但是在执行准备好的语句之前条目离开了table_definition_cache,则认为它是“无效的”并且需要重新准备。由于这是一个全局值,因此访问其他表可以重置其计数器。因此,我们将table_definition_cache的值增加到所有数据库服务器上的更高值,从而解决了这个问题。

答案 1 :(得分:0)

我认为你只需要切换执行和绑定的位置。

...
} else {
    $stmt->execute();
    $stmt->bind_result($id, $page_title);
    $stmt->store_result();
    $stmt->fetch();
}
...