use*_*748 6 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为"Test 1",第二行ID为2,page_title设置为"Test 2".
然后我使用phpMyAdmin中的以下查询创建了该表的视图:
select `content`.`id` AS `id`,`content`.`page_title` AS `page_title` from `content`
Run Code Online (Sandbox Code Playgroud)
我可以在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();
}?>
Run Code Online (Sandbox Code Playgroud)
此查询返回以下内容:尝试在没有与语句关联的结果集时读取行
如果我将表从VIEW"v_content"更改为表"content",我会返回一个结果.另外,如果我使用相同的查询(查询VIEW v_content),并连接到MySQL 5.1数据库,我会返回结果.我知道查询本身没有任何问题,因为我已经将查询复制并粘贴到phpMyAdmin并返回了结果,并且在MySQL 5.1数据库上使用了完全相同的代码并返回了结果.我检查了错误日志,没有显示错误.
任何人都知道是什么原因导致我从视图中返回0结果?
毕竟,我对网站的实际编码没有任何问题。托管公司给了我以下解释:
准备好的语句无法正确处理视图的问题似乎与新 maria 数据库服务器上的 table_definition_cache 大小有关。这是一个全局设置,本质上,如果放入缓存的表数量超过此值,它就会开始将较旧的条目从缓存中清除。看起来,如果一条语句已准备好,但在执行准备好的语句之前条目离开了 table_definition_cache,则该语句被视为“无效”并且需要重新准备。由于这是一个全局值,访问其他表可以重置其计数器。因此,我们在所有数据库服务器上将 table_definition_cache 的值增加到更高的值,从而解决了该问题。