2017-06-19 28 views
0

我想在我的mysql數據庫中選擇一個包含以逗號分隔的值的字段(讓我們說它是「dd,bb,ee」),以便這些可以被分解並轉換爲數組。 然而,如果試圖做到這一點:如何使用PDO輸出字符串而不是單元素數組來執行執行?

$sql = $conn->prepare("SELECT contacts FROM Users WHERE username = ?"); 
$sql->execute($usernametmp); 
$oldcontacts = $sql->fetch(PDO::FETCH_COLUMN); 

我得到這個錯誤:

Warning: PDOStatement::execute() expects parameter 1 to be array, string 
given in /.../.../.../.../.../....php 

在執行行,而如果我做到以下幾點:

$sql = $conn->prepare("SELECT contacts FROM Users WHERE username = ?"); 
$sql->execute(array($usernametmp)); 
$oldcontacts = $sql->fetch(PDO::FETCH_COLUMN); 

它的工作原理,但與數據庫條目出來作爲一個數組元素包含「dd,bb,ee」,其中它將需要一個字符串,以便我使用爆炸與逗號作爲分隔符。

任何想法如何解決這個問題?

+2

你需要每個值的佔位符。 CSV列不是很好的DB設計。 '$ usernametmp'是一個數組還是字符串? – chris85

+1

你可以使用'bindValue'來分配'$ usernametmp',但你會得到和上一個例子一樣的傳入一個元素數組的結果。 'FETCH_COLUMN'應該返回第一行第一列的值,而不是數組。這兩者沒有關係。傳入單個元素數組不會使您的'FETCH_COLUMN'輸出包裝在數組中。如果你在分配它後立即執行了'var_dump($ oldcontacts);',它應該只是第一行和聯繫人列的值。 –

+0

@ chris85 $ usernametmp只是一個字符串,我從 $ usernametmp = $ _GET [「usernametmp」]; 一個問號是需要的一個佔位符。 –

回答

2

我相信PDO fetch函數返回一個數組,而不是標量,即使該行包含單個列。

(我不是在所有熟悉PDO::FETCH_COLUMN風格與fetch功能。那是記載地方?我認爲風格可以用fetchAll功能可以使用。但是,這仍然會返回數組)。

PDO fetchColumn函數將返回一個標量,而不是一個數組。

參考:http://php.net/manual/en/pdostatement.fetchcolumn.php


(又路過綁定參數到execute是獨立無關的問題)。

+1

雖然''fetch'文檔中的提取樣式常量中沒有列出'PDO :: FETCH_COLUMN',它將和'fetch'以及'fetchAll'一起工作_should_ fetch一個單一的標量值(我不認爲這是記錄在任何地方,只是基於我的觀察) –

+1

@ Don'tPanic:謝謝,我只是有點驚訝,實際works.I認爲'fetch'總是返回一個數組。看起來很奇怪,它會在使用無證的獲取樣式調用時返回一個標量。我並不是說它不起作用。我只是說我不熟悉'PDO :: FETCH_COLUMN的用法'帶PDO'fetch'功能的風格。我只看到'fetchAll'函數使用的樣式。 – spencer7593

+1

是的,我主要也有。實際上,我在'fetch'中工作的經驗僅僅是因爲我偶然使用它的時間,並最終調試了這個問題的相反情況。儘管我認爲大部分'fetchSomething'類型的函數都只是'fetch(PDO :: FETCH_SOMETHING)'的快捷方式。 –