【问题标题】:PDO object's length greater than expectedPDO 对象的长度大于预期
【发布时间】:2012-03-17 17:44:34
【问题描述】:

我想用来自 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。你怎么解释这个?

【问题讨论】:

    标签: php object pdo


    【解决方案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的最简单方法。

    【讨论】:

    • 谢谢,我要试试这个。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多