Как получить данные в Javascript, передаваемых через запрос PHP MySQL - PullRequest
1 голос
/ 07 июня 2011

Я хочу отобразить данные 700 продуктов в поле выбора, и при каждом выборе я должен распечатать таблицу с описанием.до того, как я делал вызов ajax и показывал данные, но процесс идет медленно.Поэтому я должен отправить все данные на стороне клиента, а затем использовать JavaScript, чтобы изменить таблицу описания при изменении опции.Ниже мой код

   <?php
     $data = json_encode( get_data_from_db() );
    ?>

<input type='hidden' name='data' id='data' value= " <?php echo $data; ?>" />

когда я делаю предупреждение в jquery

 alert( $("#data").val() );

я вижу только

{[

значение в предупреждении, но когда я печатаю данные в браузере, они печатаются в формате json.

как я могу получить эти данные в javascript, а затем я должен использовать циклы, чтобы извлечь данные из определенного идентификатора и сделать из них ul, а затем внедрить его.Пожалуйста, предложите правильный подход и что не так с предупреждением.спасибо

Ответы [ 6 ]

2 голосов
/ 07 июня 2011

Другое решение - вместо создания глобальной переменной установите эти данные как атрибут data- некоторого связанного элемента. Не забудьте выполнить json_encode() для всего массива / объекта, а затем htmlspecialchars() для результирующей строки (как уже отмечали другие, отсутствие htmlspecialchars() является причиной, по которой вы получаете только "{[" при предупреждении о значении поля ввода ). Не забудьте указать ENT_QUOTES при вызове htmlspecialchars(), иначе у вас могут быть неверные результаты, если какое-либо значение содержит символ апострофа.

<?php
    $users = array(
        array('name' => 'Average', 'surname' => 'Joe'),
        array('name' => 'Average', 'surname' => 'Jane'),
        array('name' => 'Joe', 'surname' => 'Sixpack'),
        array('name' => 'John', 'surname' => 'Doe'),
        array('name' => 'Hong', 'surname' => 'Gildong'),
        array('name' => 'Foo', 'surname' => 'Bar'),
    );
?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
    <title>sandbox</title>
    <meta http-equiv='content-type' content='text/html; charset=UTF-8'/>
    <script type='text/javascript' src='js/jquery-1.6.1.min.js'></script>
</head>
<body data-users='<?php echo htmlspecialchars(json_encode($users), ENT_QUOTES); ?>'>
    <script type='text/javascript'>
        $(function() {
            var users = $(document.body).data('users');
            for ( var n in users ) {
                $('<div/>').text(users[n].name + ' ' + users[n].surname).appendTo(document.body);
            }
        });
    </script>
</body>
</html>

Это составляет 6 <div/> элементов со всеми именами и фамилиями в качестве их содержимого.

1 голос
/ 07 июня 2011

Проблема в том, что вы используете двойные кавычки вокруг атрибута value, но, конечно, все ключи и строки в выводе JSON находятся в двойных кавычках, первая из которых завершает атрибут valueв HTML.

Не выводить $data в качестве значения скрытого элемента.Вместо этого выведите его в переменную JavaScript:

<script>
var products_data = <?php echo $data; ?>;
</script>

Затем вы можете использовать products_data непосредственно в своем JavaScript.(Как показано там, это глобальная переменная, которая не идеальна; если вы можете поместить ее в функцию определения объема, это было бы лучше, но это зависит от того, как организованы ваши сценарии и тому подобное.)

Этоработает, потому что JSON является подмножеством литерального формата объекта JavaScript, поэтому допустимый JSON также является допустимым JavaScript для определения встроенного объекта.Ваш PHP сгенерирует что-то вроде этого и отправит его в браузер:

<script>
var products_data = {
    "products": [
        {"id": 427, "name": "WonderWidget", "price": 27.99},
        {"id": 429, "name": "CoolNiftyThing", "price": 19.99}
    ]
};
</script>

Очевидно, точная структура будет зависеть от вашего $data объекта на стороне сервера.

0 голосов
/ 07 июня 2011

Лучший способ сделать это - не вставить структуру JSON непосредственно в сценарий (это может открыть вам проблемы XSS, от которых htmlspecialchars может вас не защитить).

Я бы порекомендовал сделать это.следующее:

<script type="text/plain" id="json_data">
    <?php echo html_special_chars(json_encode($data)); ?>
</script>

<script>
    var myData = $.parseJSON($("#json_data").text());
</script>

JSON - это , а не Javascript и не должно рассматриваться как таковое.

0 голосов
/ 07 июня 2011

@T.J. У Crowder ваш ответ прямо на деньги.

Причина, по которой вы видите странное поведение в своем опубликованном примере, возможно, заключается в том, что ваш json_encode имеет двойные кавычки на ранней стадии, и он взрывается, когда его вводят в свойство тега без escape-символов

0 голосов
/ 07 июня 2011

не val (); использование text ();

alert($("#data").text()); 
0 голосов
/ 07 июня 2011

причина в том, что кодированный в json массив форматируется следующим образом: {[ "value1","value2",...]}, поэтому, когда вы echo в строке внутри поля «значение» первые двойные кавычки в json строка закрывает свойство value скрытого ввода

для решения проблемы вы можете сделать что-то вроде

<script>
var myData = <?php echo json_encode( get_data_from_db() ); ?> 
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...