2017-02-23 72 views
1

這是給我兩個項目的數組雖然查詢輸出應該是一個單細胞的單個項目,它可能是顯而易見的,但不是一個初學者和我一樣數組,而不是在PHP

$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 

function dbFetch($db,$query) 
    { 
     $stmt = $db->prepare($query); 
     $stmt->execute(); 
     return $stmt->fetch(); 
    } 

$query = " 
SELECT 
Name 
FROM Players WHERE PlayerID='21'"; 
$rows = dbFetch($db,$query); 
var_dump($rows); 

輸出:

array(2) { ["Name"]=> string(6) "PLAYERNAME" [0]=> string(6) "PLAYERNAME" } 

它重複輸出作爲關聯,其次作爲數字。

+0

您正在獲取關聯索引和數字索引。只需使用'$ stmt-> fetch(PDO :: FETCH_ASSOC);' –

回答

1

請嘗試使用PDOStatement::fetchColumn()代替。它將返回第一條記錄的第一列。

function dbFetch($db,$query) 
{ 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 
    return $stmt->fetchColumn(0); 
} 

另外,我願意打賭你不是在尋找「21」而是一個變量。在這種情況下,你會關閉使用prepared statements,並修改像這樣的代碼要好得多:

$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
function dbFetch($db,$query,$params=[]) 
{ 
    $stmt = $db->prepare($query); 
    $stmt->execute($params); 
    return $stmt->fetch(); 
} 

$query = " 
SELECT 
Name 
FROM Players WHERE PlayerID=?"; 
$params = array("your user id"); 
$rows = dbFetch($db,$query,$params); 
var_dump($rows); 
+0

確實可行。謝謝。 – denski

+0

您是否瞭解它爲什麼會創建兩個項目? – denski

+1

@denski [默認fetch_style](http://php.net/manual/en/pdostatement.fetch.php)是提取數字和關聯。 'PDO :: FETCH_BOTH' –

1

可能是由於取的風格。

作爲每PHP手冊:

公共混合PDOStatement對象::抓取([INT $ fetch_style [摘要 $ cursor_orientation = PDO :: FETCH_ORI_NEXT [摘要$ cursor_offset = 0 ]]])獲取與PDOStatement 對象關聯的結果集中的一行。 fetch_style參數確定PDO如何返回該行。

fetch_style控制如何將下一行返回給調用者。 該值必須是PDO :: FETCH_ *常量之一,默認爲 PDO :: ATTR_DEFAULT_FETCH_MODE(默認爲 PDO :: FETCH_BOTH)的值。

PDO :: FETCH_ASSOC:返回按列名索引的數組作爲你的結果返回 設置

PDO :: FETCH_BOTH(默認):返回雙方列 名和0索引列號索引的數組在你的結果返回集

PDO :: FETCH_BOUND:返回TRUE並分配設置爲PHP變量,在結果列 的值到了他們所用的 :: PDOStatement對象bindColumn()方法的約束

PDO :: FETCH_CLASS:返回請求類的新實例, 將結果集的列映射到 類中的命名屬性,然後調用構造函數,除非還提供了 PDO :: FETCH_PROPS_LATE。如果fetch_style包括 PDO :: FETCH_CLASSTYPE(例如,PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE) ,則類的名稱由第一列的值確定。

PDO :: FETCH_INTO:更新請求的類的現有實例, 映射結果在該類

PDO :: FETCH_LAZY設置爲命名屬性的列:結合了PDO :: FETCH_BOTH和PDO :: FETCH_OBJ,創建 對象的變量名,因爲它們被訪問

PDO :: FETCH_NAMED:返回與相同的形式 PDO :: FETCH_ASSOC,陣列所不同的是,如果有與 相同名稱的多個列,值由該密鑰引用的數組將包含所有的 ro中的值W在所述有這樣的列名

PDO :: FETCH_NUM:返回一個由列號索引在結果集返回 ,開始在列0

PDO :: FETCH_OBJ數組:返回與屬性名稱的匿名對象這 對應於列名在結果集返回

PDO :: FETCH_PROPS_LATE:與PDO :: FETCH_CLASS使用時,屬性是從各自的列值分配 前 構造函數的類被調用。

+0

謝謝你。 – denski