2010-09-17 3 views
0

Si j'ai quelque chose comme ça du côté du serveur, d'un ira chercherjquery plugin autocomplete - chercher des œuvres - fetchAll ne

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

Le JSON de ce qui précède est:

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

Cela fonctionne:

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

Le résultat est analysé avec succès.

Si, au lieu de chercher, je change de fetchAll, la décharge est comme ça (ici que le premier indice comme exemple):

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

La conversion JSON de ce qui précède:

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

Ici, le résultat n'est pas analysé avec succès.

Donc, je crois que quelque chose doit être changé du côté js. Mais je suis absolument désemparé.

MISE À JOUR: nomeDominio provient de la méthode PDO fetchObj et correspond au nom de la colonne dans la base de données. C'est un comportement naturel pour récupérer avec PDO lorsque l'option FETCH :: OBJ est utilisée.

La partie php de cette js est:

$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; 
} 

Enfin:

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(); 
} 
} 

Un conseil? MEM

+0

Est-ce conjointement avec 'l'extension PDO' PHP ...? –

+0

note de côté. Pourquoi devez-vous analyser/évaluer les données "manuellement"? Vous pouvez définir le paramètre dataType sur 'json' dans votre objet d'options pour la requête et jquery gère la conversion chaîne-> javascript. – VolkerK

+1

Les deux tableaux php sont déjà structurellement différents. D'où vient cette chose 'nomeDominio' dans la version de fetchAll? Vous voudrez peut-être nous montrer le code php ... – VolkerK

Répondre

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

J'ai hâte de l'essayer. Merci beaucoup. Pourquoi fetch_assoc et pas fetch_obj? – MEM

+0

"Pourquoi fetch_assoc" - Pas de raison particulière, juste une habitude. Devrait aussi fonctionner avec FETCH_OBJ. – VolkerK

+0

Eh bien ... Je viens de découvrir que, sur jsonArray, si nous changeons de $ json [] = array ('nome' => $ obj); à, $ json [] = array ('nome' => $ obj-> nomeDominio); ça fonctionne parfaitement. Si vous ajoutez ceci sur votre réponse ... je peux le marquer. :) C'était si simple. Juste en ajoutant un -> nomeDominio ... eh bien ... Je vais utiliser votre code cependant, parce que vous m'avez aidé à résoudre un autre problème, le fait que je n'ai pas pu utiliser bindParam avec des mots-clés LIKE. ;) Je vais essayer. – MEM

0

Si vous retournez un tableau (chercher) alors vous devez collecter des données comme ceci

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

Si vous utilisez fetchAll, ce retournera probablement un tableau de tableaux (un tableau multidimensionnel) dont vous aurez besoin pour parcourir. En regardant $.map, il semble que vous utilisiez jQuery. Itérer sur le tableau multidimensionnel comme celui-ci

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

Cela aidera ... Je suis sûr ... J'ai mis à jour ma question, ça vous dérange de jeter un coup d'oeil? – MEM