因為之前的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就都可以正常顯示...
基本上 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='監控'
(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才會出錯@@
這部分有比較好的處理方式嗎
謝謝
可以的話提供一下print_r($result->fetchAll()); 出來的結果
看一下所有的資料格式
你這個SQL好像沒有查詢日期的欄位,所以你抓日期的欄位會報錯
1.請參閱
2.日期資料可能有問題或是有空白
我用print_r看一下結果
如果有日期 都會以亂碼顯示
若沒有日期 就正常為空
可是我SQL語法沒有UNION就正常...
*發現問題
我把SQL UNION ALL改成UNION就可以了
但是我還是不知道為什麼...
試試日期轉字串
select date_format(REVISEDATE, '%Y-%m-%d') as NEWREVISEDATE
UNION ALL:所有資料含重複的資料
UNION:去除重複的資料
基本上應去除重複的資料,否則就加入一個序號欄位
測試用UNION ALL加上date_format轉字串的寫法可行!
但是還是不懂UNION ALL原本用mysqli可以執行
改用pdo日期就會變成亂碼...
Neish
你的PDO連線確認一下有沒有設定charset
有可能出來的日期格式包含中文導致亂碼
https://stackoverflow.com/questions/4361459/php-pdo-charset-set-names
這個設定過了
一樣沒辦法@@
而且只有用UNION ALL才會亂碼...
通靈亡
謝謝你的熱心查找
看起來好像真的是環境問題@@
目前我其實也不用用到UNION ALL
現況使用UNION就可以了
如果真的要用UNION ALL
使用rogeryao提到的轉字串方式也可以解
這問題我就先結掉了
感謝各位大大協助!
改成
$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。除非你只是範例而已。
我天天用 jqgrid,union 更是家常便飯,
先幫您排除一件事,這個和 jqgrid 無關。