PDO对象的长度大于预期

时间:2012-03-17 17:44:35

标签: php object pdo

我想用PDO对象中的一些数据创建Javascript数组。这是我的代码:

$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返回

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

所以对象的长度为2.在这种情况下,JS代码看起来像这样

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

但我得到了这个

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

表示else中的代码未执行。所以我用count()检查了对象的长度,然后返回3.你怎么解释这个?

2 个答案:

答案 0 :(得分:1)

我建议你不要写代码,因为它太容易出错。 您可以在2个数组中插入数据,然后可以使用类似http://ca.php.net/implode的内容来添加逗号..

$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)

但说实话,你不应该这样做,你应该尝试检查JSON: http://ca.php.net/json_encode http://ca.php.net/json_decode

这是将对象传递给JavaScript的最简单方法。

答案 1 :(得分:1)

$ donnees不会立即保存所有结果,它只在while循环中每次迭代时保存一个结果。当你得到3的计数时,这是因为它有3个字段(user_id,user_fname,user_lname)。如果你的查询返回了100行,你的计数仍会产生3,因为你算错了。

你最好为你想要创建的每个列表创建一个数组,填充它而不用担心哪个是最后一个条目,然后在while循环之后执行此操作:

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

...或者甚至可以更好地用PHP构建数组,然后使用json_encode()。