各位大大好
小弟在用 pdo 時遇到問題
就是當我用連續兩個同名的 pdo query 後的物件時(像在loop中)
他會無法跑第二個
然後報 "2050 的錯誤"
網路上找解法是取不同名稱或把原本的名稱設成空值
可是這些方法我試過都行不通
請問還有什麼方法嗎?
補上程式碼
public function getSale($search_time, $option = array())
{
$time_start = $search_time['search_year'].$search_time['search_month_start'];
$time_end = $search_time['search_year'].$search_time['search_month_end'];
$data_array = array();
$show_sql = "
select distinct isdept from test where yyyymm between '$time_start' and '$time_end' order by isdept";
$show_query = $this->link->query($show_sql);
$shows = $show_query->fetchAll(PDO::FETCH_ASSOC);
foreach ($shows as $show) {
$sale_sql = "
select isdept, dptnam, round(sum(depositqty)) as depositqty, round(sum(depositamtx)) as depositamtx, sum(qty) as qty, round(sum(amtx)) as amtx, round(sum(amtx-cost)) as profit
from test m inner join invtest i using(isdept)
where yyyymm between '$time_start' and '$time_end' and isdept = '".$show['isdept']."' and i.iclas='0' and i.isclas='0'
GROUP BY isdept
order by isdept";
$sale_query = $this->link->query($sale_sql);
$data_array[$show['isdept']][$search_time['search_year']] = $sale_query->fetchAll(PDO::FETCH_ASSOC);
}
return json_encode($data_array);
}
P.S: PHP使用 5.1版 原因可能會是版本太舊
但無法升級的情況下不知道有沒有什麼方式解決
---更新(問題已解決)
不使用 fetch 改採用 prepare + execute
迴圈尾端加上
$sale_query->closeCursor();
$sale_query = NULL;
原
$sale_query = $this->link->query($sale_sql);
$data_array[$show_sdept][$search_time['search_year']-$i] = $sale_query->fetchAll(PDO::FETCH_ASSOC);
加一列 unset 試看看
$sale_query = $this->link->query($sale_sql);
$data_array[$show_sdept][$search_time['search_year']-$i] = $sale_query->fetchAll(PDO::FETCH_ASSOC);
unset($sale_query);
參考資料來源
順帶一提
比較好的做法應該是「把兩段 SQL 合成一段」
就不會碰到這個問題了
感謝大大回覆
先解釋我為什麼要這樣做
其實原 code 外部還有一個迴圈來跑年度
所以才有大大看到的 $i
變數
但為了畫面縮減我把它拿掉了
就只留一個迴圈
兩個SQL功能
第一個: 找出首年度所有的子部門
第二個: 找出所有該子部門當年度業績(總子部門數以首年度為主)
加一列 unset 試看看
這其實小弟也試過了
我也嘗試了動態常數命名 ${"sale".$show['isdept']}
或$sale_query->closeCursor();
都是一樣的結果QQ
比較好的做法應該是「把兩段 SQL 合成一段」
就不會碰到這個問題了
我想也是
因為他第一次執行是成功的
這可能是舊版 PHP pdo的坑吧QQ
其實原 code 外部還有一個迴圈來跑年度
所以才有大大看到的 $i 變數
但為了畫面縮減我把它拿掉了
問題就是在「因為迴圈
而重覆使用的 pdo 物件」
你把它拿掉
還期望得到正確答案嗎?
什麼樣的問題
就會得到什麼樣的答案
不好意思大大
問題的確是出在迴圈
所以我留了內部迴圈
因為光我拿掉外部迴圈跑(如我發問的)的結果就會有如此狀況了
讓您誤解不好意思