2012-03-17 1 views
0

Je voudrais créer des tableaux Javascript avec des données d'un objet PDO. Voici mon code:Longueur de l'objet PDO supérieure à celle attendue

$req = $bdd->query('SELECT 
    id AS user_id, 
    fname AS user_fname, 
    lname AS user_lname 
    FROM mand_users'); 

$autocomplete_users = '<script type="text/javascript"> var names_users = new Array('; 
$users_ids = 'var users_ids = new Array('; 

$i = -1; 

while ($donnees = $req->fetch(PDO::FETCH_ASSOC)) { 
    print_r($donnees); 
    $i++; 

    $user_full_name = $donnees['user_fname'].' '.$donnees['user_lname']; 
    $user_id = $donnees['user_id']; 

       if ($i < count($donnees)-1) { 

     $autocomplete_users .= $user_full_name.', '; 
     $users_ids .= $user_id.', '; 

      } else { 

     $autocomplete_users .= $user_full_name.');'; 
     $users_ids .= $user_id.');'; 

    } 
} 

echo $autocomplete_users . $users_ids .'</script>'; 

print_r retours

Array 
(
    [user_id] => 1 
    [user_fname] => Bob 
    [user_lname] => Smith 
) 
Array 
(
    [user_id] => 2 
    [user_fname] => Alice 
    [user_lname] => Smith 
) 

si la longueur de l'objet serait 2. Dans ce cas, le code JS ressemblerait à ceci

<script type="text/javascript"> 
var names_users = new Array(Bob Smith, Alice Smith); 
var users_ids = new Array(1, 2); 
</script> 

mais je obtenir ce

<script type="text/javascript"> 
var names_users = new Array(Bob Smith, Alice Smith, var users_ids = new Array(1, 2, </script> 

ce qui signifie que le code dans le else n'est pas exécuté. Donc, j'ai vérifié la longueur de l'objet avec count() et il est revenu 3. Comment pourriez-vous expliquer cela?

Répondre

1

Je vous suggère de ne pas écrire votre code comme c'est trop sujet aux erreurs. Vous pouvez insérer vos données dans 2 tableaux, vous pouvez utiliser quelque chose comme http://ca.php.net/implode ajouter comas ..

$user_ids = array(); 
$user_names = array(); 

while ($donnees = $req->fetch(PDO::FETCH_ASSOC)) { 
    $name = $donnees['user_fname'].' '.$donnees['user_lname']; 
    $id = $donnees['user_id']; 

    $user_ids[] = $id; 
    $user_names[] = $name; 
} 

<script> 
var names = new Array('<?php implode("', '", $user_names); ?>'); 
var ids = new Array(<?php implode(", ", $user_ids); ?>); 
</script> 

(code not tested, just to give you a hint) 

Mais pour être honnête, vous ne devriez pas faire cela, vous devriez essayer de vérifier JSON: http://ca.php.net/json_encode http://ca.php.net/json_decode

C'est le moyen le plus simple de passer des objets au javascript.

+0

... grands esprits ... – Jason

+0

Merci, je vais essayer ça. – b1onic

1

$ donnees ne contient pas tous les résultats en même temps, il ne contient qu'un résultat à chaque itération de la boucle while. Lorsque vous obtenez un compte de 3, c'est parce qu'il a 3 champs (user_id, user_fname, user_lname). Si votre requête renvoyait 100 lignes, votre nombre produirait toujours 3 parce que vous comptez la mauvaise chose.

Vous feriez mieux de créer un tableau pour chaque liste que vous voulez créer, sans se soucier peupler ce qui est la dernière entrée, puis après la boucle tout en faisant ceci:

$autocomplete_users = '<script type="text/javascript"> var names_users = new Array('; 
$autocomplete_users .= implode(', ', $autocomplete_users_array); 
$autocomplete_users .= ');'; 

... ou peut-être même mieux de simplement construire le tableau en PHP, puis d'utiliser json_encode().

+0

merci pour l'explication! – b1onic

Questions connexes