2013-04-22 17 views
0

我腳本它如下,爲什麼結果集不能付諸會議在PHP

session_start(); 
$employees = null; 

if (isset($_SESSION['employees'])) { 
    $employees= $_SESSION['employees']; 

} else { 

$con = new mysqli("localhost", "root", "test", "emp_db"); 
$employees = $con->query("SELECT * from employee"); 
$_SESSION['employees'] = $employees; 
} 

echo "<table>"; 

foreach ($employees as $row) { 
    echo '<tr>'; 
    echo "<td>" . $row['emp_id'] . " </td>"; 
    echo "<td>" . $row['emp_name'] . " </td>"; 
    echo "<td>" . $row['emp_address'] . "</td>"; 
    echo "</tr>"; 
} 

第一頁的訪問順利,即從DB訪問。 但是,當我嘗試從$ _SESSION在第二個頁面請求獲取,它說...

"Warning: main(): Couldn't fetch mysqli_result in C:\xampp\htdocs\test\dbtemp.php on line 22". My line 22 is: foreach($employees as $row) { 

任何想法?

如果php返回的結果集連接資源(如Java),爲什麼我們仍然可以在關閉與DB的連接後迭代它?

當我打電話給get_resource_type($employees) ......它說,它是一個對象,而不是資源。那麼爲什麼一個對象沒有被存儲在會話中?

回答

0

嘗試更換:

$_SESSION['employees'] = $employees; 

有了:

$_SESSION['employees'] = $employees->fetch_all(); 

結果集是不是爲腳本,以不同的時間稱爲共享。換句話說,在數據庫連接關閉後,您無法正確保存$_SESSION中的活動mysqli_result並使用它。但是,您可以保存arraymysqli_result::fetch_all()是你需要的。

不過,我不認爲這是一個好方法。我建議你監督你的劇本。

+0

哦,我喜歡你現在編輯的文章。刪除了downvote – 2013-04-22 09:22:05

+0

** @ STT LCU **,我只是聲稱空間。 :)修正。 – BlitZ 2013-04-22 09:23:16

+0

通過在fetch_all()中傳遞MYSQLI_ASSOC很好地工作,defualt是MYSQLI_NUM – 2013-04-22 09:33:36

3

引自SO質疑Storing database connection in a session variable

您可以在會話中不存儲數據庫連接或結果集,這是因爲它們的資源和:

某些類型的數據不能被序列化因此存儲在會議中。它包括資源變量或帶有循環引用的對象(即 將自身引用傳遞給另一個對象的對象)。

http://php.net/manual/en/intro.session.php

您可以提取設定成正常陣列的結果和存儲在任何其他變量的會話。無論如何,這將是一個相當典型的會話用例。只是要小心,不要在會話中存儲太多數據,因爲這可能會比從數據庫中獲取更多的資源。

相關問題