2015-11-02 167 views
6

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

For在这个演示中,我有一个名为“content”的数据库表,其中包含字段“id”(integer)和“page_title”(var_char)。该表中有两行 - 一个ID为1,page_title为“Test 1”和第二行具有2 ID和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“v_content”刚才的发言

相关联的结果集表“内容”,我得到一个结果返回。此外,如果我使用相同的查询(查询VIEW v_content)并连接到MySQL 5.1数据库,则会返回结果。我知道查询本身没有问题,因为我已经将查询复制并粘贴到phpMyAdmin中并返回了结果,并且在MySQL 5.1数据库上使用完全相同的代码,并返回结果。我检查了错误日志,并且没有显示错误。

任何人都知道什么可能导致我从视图返回0结果?

+0

“尝试读取行...”错误不应出现在SELECT语句中。它通常意味着你试图在'UPDATE'或'INSERT'语句上'获取'(或者你已经关闭了结果集)。你在这里使用'store_result()'看起来很可疑。既然你调用'$ stmt-> fetch()'并且使用了'bind_result()',我不认为你需要'store_result()',尤其是因为你甚至没有把它返回的结果资源存储到一个变量中。删除该行,看看你的情况是否改变。 –

+0

如果我删除 - $ stmt-> store_result(); - 没有什么变化。它仍然返回0结果。 – user2762748

+0

但它是否仍然报告相同的错误?发布的代码似乎不太可能。 –

回答

1

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

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

0

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

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

这是尝试过,但不幸的是结果是一样的。 – user2762748