2010-09-17 78 views
0

如果我有從服務器端這樣的事情,從獲取:jQuery的自動完成插件 - 獲取作品 - 使用fetchall不

array(1) { [0]=> array(1) { ["nome"]=> string(7) "aaaa.br" } } [{"nome":"aaaa.br"}] 

以上的JSON是:

[{"nome":"aaaa.br"}] 

此作品:

parse: function(data) { 
return $.map(eval('('+data+')'), function(result) { 
    return { 
    data: result, 
    value: result.nome, 
    result: result.nome 
    } 
    }); 
} 

結果被成功解析。

如果,代替取,我更改爲使用fetchall,轉儲得到這樣的(這裏僅第一索引爲例):

array(65) { [0]=> array(1) { ["nome"]=> object(stdClass)#7 (1) { ["nomeDominio"]=> string(7) "aaaa.br" } } 

以上的JSON的轉換:

string(2632) "[{"nome":{"nomeDominio":"aaaa.br"}} 

這裏,結果沒有成功解析。

所以我認爲需要在js方面改變一些東西。 但我絕對無能爲力。

更新: nomeDominio來自fetchObj PDO方法,並對應於數據庫上的列名稱。當使用FETCH :: OBJ選項時,這是使用PDO進行提取的自然行爲。

的這個PHP的一部分是JS:

$keyword = addslashes($_GET["q"]); 

$comandos = new ComandoController(); 

$arr = $comandos->recebeNomeDominios($keyword); 

if(is_array($arr)) 
{ 
    echo json_encode($arr); 

} 


public function recebeNomeDominios($keyword) 
{ 
    $DominioDao = new DominioDao(); 

    $objecto = $DominioDao->recebeNomeDominios($keyword); 

    return $this->jsonArray($objecto); 

} 

private function jsonArray($objecto) 
{ 
    $json = array(); 
    if(isset($objecto) && !empty($objecto)) 
    { 
    foreach($objecto as $obj) 
    { 
     $json[] = array('nome' => $obj); 

    } 
    } 
    return $json; 
} 

最後:

public function recebeNomeDominios($keyword) 
{ 
    try 
    { 
    $stmt = $this->_dbh->prepare("SELECT d.nomeDominio FROM dominio d WHERE d.nomeDominio LIKE '%".$keyword."%'"); 
$stmt->execute(); 
$resultado = $stmt->fetch(PDO::FETCH_OBJ); 
return $resultado; 
} 
catch (PDOException $ex) 
{ 
    echo "Erro: " . $ex->getMessage(); 
} 
} 

有什麼建議? MEM

+0

了PHP的'PDO'擴展這是一起選擇中...? – 2010-09-17 15:36:43

+0

旁註。爲什麼你必須「手動」解析/評估數據?您可以在請求的options對象中將dataType設置爲'json',jquery處理字符串 - > javascript轉換。 – VolkerK 2010-09-17 15:44:29

+1

這兩個php數組已經在結構上有所不同。 fetchAll版本中的'nomeDominio' thingy來自哪裏?您可能想向我們展示php代碼... – VolkerK 2010-09-17 15:54:23

回答

1
$comandos = new ComandoController(); 
$arr = $comandos->recebeNomeDominios($keyword); 
echo json_encode($arr); 


class ComandoController { 
    public function recebeNomeDominios($keyword) 
    { 
    $stmt = $this->_dbh->prepare(' 
     SELECT 
     d.nomeDominio as nome 
     FROM 
     dominio 
     WHERE nomeDominio LIKE :keyword 
    '); 
    $stmt->bindParam(':keyword', $keyparam); 
    $keyparam = '%'.str_replace('%', '\\%', $keyword) . '%'; 
    $stmt->execute(); 
    return $stmt->fetchALL(PDO::FETCH_ASSOC); 
    } 
... 
+0

我迫不及待地試一試。非常感謝。爲什麼使用fetch_assoc而不是fetch_obj? – MEM 2010-09-18 21:06:14

+0

「爲什麼fetch_assoc」 - 沒有特別的原因,只是習慣。也應該使用FETCH_OBJ。 – VolkerK 2010-09-19 04:00:51

+0

嗯...我剛剛發現,在jsonArray上,如果我們改變$ json [] = array('nome'=> $ obj); to,$ json [] = array('nome'=> $ obj-> nomeDominio);它完美地工作。如果你在答案中加上這個......我可以標記它。 :)這很簡單。只需添加一個 - > nomeDominio ...噢,我會使用你的代碼,因爲你已經幫我解決了另一個問題,我無法使用LIKE關鍵字使用bindParam。 ;) 我會試一下。 – MEM 2010-09-20 08:26:38

0

如果返回一個數組(讀取),那麼你需要的,如果你使用的是使用fetchall從中收集數據這樣

var name = data.name; 
var age = data.age; 
var gender = data.gender; 
// Do something with values here 

,這大概會返回一個數組的數組(多維數組)你將需要重複。從查看$.map看起來就像使用jQuery。迭代的多維數組這樣

jQuery.each(data, function() { 
    name = this.name; 
    age = this.age; 
    gender = this.gender; 
    // Do something with values here 
}); 
+0

這將幫助...我敢肯定...我已更新我的問題你介意看看嗎? – MEM 2010-09-17 16:22:55