2015-11-02 160 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