JQuery JSON Проблема - PullRequest
       24

JQuery JSON Проблема

3 голосов
/ 18 февраля 2009

Я хочу заполнить поля формы значениями из базы данных сразу после того, как пользователь введет значение в поле #sid. Вот мой пример jQuery / HTML:

<script src="jquery-1.3.1.min.js"></script>
<script type="text/JavaScript">
$(document).ready(function()
{
  $('#sid').bind("change", function(){
    $.getJSON("test.php?sid=" + $("#sid").val(), 
    function(data)
    {
      $.each(data.items, 
      function(i, item)
      {
        if (item.field == "saffil")
        {
              $("#saffil").val(item.value);
        }
        else if (item.field == "sfirst")
        {
              $("#sfirst").val(item.value);
        }
      });
      });
   });
});
</script>

Вот мой скрипт обработки (test.php, который вызывается методом .getJSON)

<?
require_once("db_pers.inc");

$ssql = "SELECT * FROM contacts_mview WHERE sempid = '".$_GET['sid']."'";

$rres = pg_query($hdb, $ssql);
pg_close($hdb);

$ares = pg_fetch_assoc($rres);

$json = array(array('field' =>  'saffil',
            'value' =>  $ares['saffil']),
          array('field' =>  'sfirst',
            'value' =>  $ares['sfirst']));

echo json_encode($json);
?>

В соответствии с firebug параметр GET прекрасно передается в test.php, а объект JSON возвращается просто отлично:

[{"field":"saffil","value":"Admin"},{"field":"sfirst","value":"Nicholas"}]

однако на странице ничего не происходит, и я получаю следующее сообщение об ошибке:

G is undefined
init()()jquery-1....1.min.js (line 12)
(?)()()test.html (line 15)
I()jquery-1....1.min.js (line 19)
F()()jquery-1....1.min.js (line 19)
[Break on this error] (function(){var l=this,g,y=l.jQuery,p=l.....each(function(){o.dequeue(this,E)})}});

Это мой первый удар по ajax с jQuery, так что любой вклад будет высоко ценится!

Спасибо

  • Николай

Ответы [ 4 ]

7 голосов
/ 18 февраля 2009

Хорошая маленькая инъекционная атака, ожидающая там;)

Попробуйте изменить

$.each(data.items,

до:

$.each(data,

Редактировать : чтобы ответить на ваш комментарий, я хочу назвать мои поля такими же, как и ключ данных:

<input type="text" name="saffil" value="" />
<input type="text" name="sfirst" value="" />

var data = {saffil:'foo', sfirst:'bar'};
$.each(data, function(key, value) {
   $('[name='+key+']').val(value)
})
1 голос
/ 02 марта 2009

Я согласен с предыдущими ответчиками. Этот скрипт является SQL-инъекцией, ожидающей своего появления. Возможно, вам следует использовать что-то вроде PDO с подготовленными утверждениями или хотя бы что-то вроде pg_escape_string .

0 голосов
/ 18 марта 2010

Я не верю, что ответы здесь верны.

Проблема в том, что библиотеки PHP (и Perl) кодируют JSON, который вы им предоставляете, и ничего больше.

Таким образом, если вы передадите функции кодирования массив, она выдаст:

[ element1, element2, element3]

Это правильная кодировка для массива, но это , а не правильный ответ JSON. Правильный ответ JSON должен быть объектом, обозначенным на http://json.org/.

Таким образом, вам нужно создать объект-оболочку вокруг вашего массива, а затем кодировать и ответить этим.

<?php
$json = array('items' =>
              array(
                    array('field' =>  'saffil',
                          'value' =>      $ares['saffil']),
                    array('field' =>      'sfirst',
                          'value' =>      $ares['sfirst'])
              )
        );

echo json_encode($json);
?>
0 голосов
/ 18 февраля 2009

Не уверен, но я вижу огромное отверстие для инъекций Sql.

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