Длина объекта PDO больше ожидаемой - PullRequest
0 голосов
/ 17 марта 2012

Я хотел бы создать массивы Javascript с некоторыми данными из объекта PDO.Вот мой код:

$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 будет выглядеть так1009 *

но вместо этого я получаю

<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 ]

1 голос
/ 17 марта 2012

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

1 голос
/ 17 марта 2012

Я предлагаю вам не писать свой код так, чтобы он был слишком подвержен ошибкам.Вы можете вставить свои данные в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...