2017-09-27 93 views
2

比方說我有這個疑問:是有可能的變量值添加到選擇查詢結果PHP PDO

$stmt = $con->_con->prepare("Select id from table", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); 
while ($selected_row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $rows[] = array_map('utf8_encode', $selected_row); 
} 

由此我得到:

[{ 
    "id": "000060000000000071964708\/17\/201309:55:00" 
}] 

而且我想補充的另一個關鍵值對像:

[{ 
    "id": "000060000000000071964708\/17\/201309:55:00", 
    "column": "code1" 
}] 

從結果我想補充的一個關鍵column與價值code1這個VA lue是動態的,我想通過選擇查詢之外的條件來設置它。 我試過手動添加列在while循環一樣:

while ($selected_row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $rows[] = array_map('utf8_encode', $selected_row); 
    array_push($rows, array('column' => $column)); 
} 

$column = 'code1'這取決於一個條件。但它給我的結果:

[{ 
    "id": "000060000000000071964708\/17\/201309:55:00" 
}, { 
    "column": "code1" 
}] 

這是不是期望output.Also試圖做Select id,column AS 'code1'...,我嘗試手動把密鑰對值返回爲選擇查詢的一部分,但它失敗,給錯誤在AS .....

如何從示例中獲得所需的輸出? 我打開其他的解決方案,比我心目中

回答

2

您試圖在SQL做到這一點幾乎是正確的想法好,但正確的形式是

SELECT 
    id, 
    'code1' AS `column` 
FROM... 

返回靜態值作爲帶引號的字符串文字,帶有列別名。所以你可以查詢它的靜態值爲:

$stmt = $con->_con->prepare("Select id, 'code1' AS `column` from table", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); 

當提取時,它會返回所需格式的結果。但是,由於該值是動態的,因此您可以並且應該使用PDO佔位符。這是從你使用到哪裏綁定參數的PDO包裝類不清楚,但prepare()通話將是對SQL像

// Whatever the source of the dynamic value... 
$your_dynamic_value = 'code1'; 
// Adds :column as a prepared statement placeholder 
$stmt = $con->_con->prepare("Select id, :column AS `column` from table", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); 

我必須把它留給你能正確調用bindParam()或與[':column' => $your_dynamic_value]傳遞參數數組執行這個不熟悉的PDO包裝類,其中prepare()方法似乎比正常的PDO::prepare()做得更多。

如果你要在增加它的獲取,你需要做的是你將它添加到迭代其追加到$rows[]前/獲取變量$selected_row

while ($selected_row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    // Add an array key to the fetched row before calling array_map() 
    // and appending to the $rows collection 
    $selected_row['column'] = 'code1'; 
    $rows[] = array_map('utf8_encode', $selected_row); 
} 
+0

我想澄清這是最好的解決方案?第一個還是第二個? – Martin

+1

我個人更喜歡在'SELECT'中添加'code1',因爲你將它當作查詢結果的一部分。它爲數據庫查詢增加了很少的開銷。將值添加到輸出數組後,可能會在稍後追溯並忘記它來自哪裏時使其起源不太清晰。但另一方面,也許有一天有人會查看數據庫源表,並對該列不存在的原因感到困惑。這兩種解決方案都沒有明顯的優勢,但是我發現了'SELECT'整理器。如果需要,可以使用它在應用程序代碼外複製SQL中相同的查詢結果。 –

+0

非常感謝解釋快樂編碼隊友:) – Martin