iT邦幫忙

0

php pdo UNION 查詢結果無法顯示

因為之前的php資料庫連線方式是用mysqli
最近想說翻新一下改用pdo來寫

但是碰到一個問題就是如果SQL語法含有union
查詢結果就會顯示不出來...

可是很奇怪的是我用這段SQL直接在MySQL Workbench或是phpMyAdmin網頁上的查詢是可以正常顯示結果的...

而且沒有錯誤訊息 但結果都是空的

SQL大概長這樣

$sql = "SELECT vp.PRODUCTID,'逾期' AS WORK_STATUS FROM v_project vp WHERE vp.STATUS='逾期'
UNION ALL
SELECT vp.PRODUCTID,'警示' AS WORK_STATUS FROM v_project vp WHERE vp.STATUS='警示'
UNION ALL
SELECT vp.PRODUCTID,'監控' AS WORK_STATUS FROM v_project vp WHERE vp.STATUS='監控'";

try {
	$result = $connPDO->prepare($sql);
    $result->execute();
} catch(PDOException $e) {
	echo json_encode('Error: ' . $e->getMessage(). ' SQL:'.$sql);
}

再請各位指教

*補充 我前端是用jqgrid來呈現 不知道跟jqgrid有沒有影響 可是只要SQL沒有用到UNION就都可以正常顯示...

通靈亡 iT邦研究生 4 級 ‧ 2020-10-27 12:14:08 檢舉
你試試看,在$result->execute();的下一行用print_r($result)
如果有結果,問題可能會在你塞進去前端的時候出問題
如果沒有結果,問題可能會在查詢的部分出問題
Neish iT邦研究生 1 級 ‧ 2020-10-27 13:11:39 檢舉
我在NetWork Response出來的結果是我下的SQL
但這段SQL可以正常查出結果 @@
PDOStatement Object
(
[queryString] => SELECT vp.PRODUCTLINE, ...(略)...
)
通靈亡 iT邦研究生 4 級 ‧ 2020-10-27 13:16:43 檢舉
print_r($result->fetchAll()); 會得到所有的查詢結果
我的想法跟rogeryao大大的回答差不多,只要你的SQL在php端可以查詢出來,問題應該就是塞到前端的地方
0
rogeryao
iT邦高手 1 級 ‧ 2020-10-27 13:05:34
最佳解答

基本上 SQL 是正確的,以下語法是可以跑出資料的,問題可能出在拋資料到 jqgrid,
請參閱

foreach($result as $row)
   {
     echo "<tr>";
     echo "<td>" . $row['PRODUCTID'] . "</td>";
     echo "<td>" . $row['WORK_STATUS'] . "</td>";
     echo "</tr>";
   }

另外, SQL 可以改成下式 :

SELECT vp.PRODUCTID,vp.STATUS AS WORK_STATUS
FROM v_project vp
WHERE vp.STATUS='逾期' OR vp.STATUS='警示' OR vp.STATUS='監控'
看更多先前的回應...收起先前的回應...
Neish iT邦研究生 1 級 ‧ 2020-10-27 14:03:27 檢舉

(SQL是我精簡後的版本)
我後來發現是拋到前端出問題
一個欄位一個欄位去確認
發現只要是日期格式就會出錯
我不拋日期欄位就正常...

我的寫法是這樣

while($row = $result->fetch()) {
    -- 這樣不會顯示
    $responce->rows[$i]['cell']=array($row['PRODUCTID'],$row['WORK_STATUS'],$row['DATE']);
    
    -- 這樣就可以顯示
    $responce->rows[$i]['cell']=array($row['PRODUCTID'],$row['WORK_STATUS']);
    
    $i++;
}
echo json_encode($responce);

可是寫法都一樣 只有用到UNION才會出錯@@

這部分有比較好的處理方式嗎

謝謝

通靈亡 iT邦研究生 4 級 ‧ 2020-10-27 14:08:45 檢舉

可以的話提供一下print_r($result->fetchAll()); 出來的結果
看一下所有的資料格式

你這個SQL好像沒有查詢日期的欄位,所以你抓日期的欄位會報錯

rogeryao iT邦高手 1 級 ‧ 2020-10-27 14:13:11 檢舉

1.請參閱
2.日期資料可能有問題或是有空白

Neish iT邦研究生 1 級 ‧ 2020-10-27 16:37:16 檢舉

我用print_r看一下結果
如果有日期 都會以亂碼顯示
若沒有日期 就正常為空

可是我SQL語法沒有UNION就正常...
https://ithelp.ithome.com.tw/upload/images/20201027/200977811fU0ouD0zM.jpg

Neish iT邦研究生 1 級 ‧ 2020-10-27 16:51:45 檢舉

*發現問題
我把SQL UNION ALL改成UNION就可以了
但是我還是不知道為什麼...

rogeryao iT邦高手 1 級 ‧ 2020-10-27 16:52:43 檢舉

試試日期轉字串
select date_format(REVISEDATE, '%Y-%m-%d') as NEWREVISEDATE

rogeryao iT邦高手 1 級 ‧ 2020-10-27 16:55:47 檢舉

UNION ALL:所有資料含重複的資料
UNION:去除重複的資料
基本上應去除重複的資料,否則就加入一個序號欄位

Neish iT邦研究生 1 級 ‧ 2020-10-27 17:29:25 檢舉

測試用UNION ALL加上date_format轉字串的寫法可行!
但是還是不懂UNION ALL原本用mysqli可以執行
改用pdo日期就會變成亂碼...

通靈亡 iT邦研究生 4 級 ‧ 2020-10-27 17:45:26 檢舉

Neish
你的PDO連線確認一下有沒有設定charset
有可能出來的日期格式包含中文導致亂碼

https://stackoverflow.com/questions/4361459/php-pdo-charset-set-names

Neish iT邦研究生 1 級 ‧ 2020-10-28 08:31:21 檢舉

這個設定過了
一樣沒辦法@@
而且只有用UNION ALL才會亂碼...

通靈亡 iT邦研究生 4 級 ‧ 2020-10-28 09:07:05 檢舉

Neish
目前看到跟你遇到類似問題的,是因為環境跟版本問題造成的
https://stackoverflow.com/questions/58197864/date-field-issue-in-union-query-when-setting-pdoattr-emulate-prepares-false

Neish iT邦研究生 1 級 ‧ 2020-10-28 09:47:43 檢舉

通靈亡
謝謝你的熱心查找
看起來好像真的是環境問題@@

目前我其實也不用用到UNION ALL
現況使用UNION就可以了

如果真的要用UNION ALL
使用rogeryao提到的轉字串方式也可以解

這問題我就先結掉了
感謝各位大大協助!

1
浩瀚星空
iT邦超人 1 級 ‧ 2020-10-27 13:13:38

改成

$sql = "(SELECT vp.PRODUCTID,'逾期' AS WORK_STATUS FROM v_project vp WHERE vp.STATUS='逾期')
UNION ALL
(SELECT vp.PRODUCTID,'警示' AS WORK_STATUS FROM v_project vp WHERE vp.STATUS='警示')
UNION ALL
(SELECT vp.PRODUCTID,'監控' AS WORK_STATUS FROM v_project vp WHERE vp.STATUS='監控')";

試試看。pdo的sql有一定的規則在。

不過說真的,你這一段的sql語法我會改成

SELECT vp.STATUS AS WORK_STATUS,vp.PRODUCTID FROM v_project where vp.STATUS in ('逾期','警示','監控')

沒啥必要用union。除非你只是範例而已。

Neish iT邦研究生 1 級 ‧ 2020-10-27 14:05:01 檢舉

後來發現是日期的問題
問題點回覆在上面了
只發生在有UNION的SQL
沒有用到UNION日期可以正常回拋給前端

0
ckp6250
iT邦研究生 3 級 ‧ 2020-10-27 19:49:02

我天天用 jqgrid,union 更是家常便飯,
先幫您排除一件事,這個和 jqgrid 無關。

Neish iT邦研究生 1 級 ‧ 2020-10-28 08:35:12 檢舉

請問你也是用PDO連線還有UNION ALL嗎
我用UNION可以... UNION ALL就不行...

ckp6250 iT邦研究生 3 級 ‧ 2020-10-28 10:28:47 檢舉

yes, jqgrid , pdo , union , union all 通通都有,
您可以排除這部份。

Neish iT邦研究生 1 級 ‧ 2020-10-28 10:57:27 檢舉

看起來應該真的是環境問題@@

我要發表回答

立即登入回答