один вызов JSON вернулся со многими? - PullRequest
0 голосов
/ 08 декабря 2010

У меня вопрос ... Как заставить json сделать 1 обратный вызов с несколькими объектами.

Я буду использовать этот пример 3 возвращаемых значений ... Вот файл calclickM.php, но я не могу понять, почему он не просыпается ...

    <?php  
$choice = (isset($_POST['choice'])) ? date("Y-m-d",strtotime($_POST['choice'])) : date("Y-m-d"); 
$con = mysql_connect("localhost","root","xxxxxx");  
if (!$con)  {  die('Could not connect: ' . mysql_error());  }  
mysql_select_db("inverters", $con);  

$sql = "SELECT sum(power/1000) AS choice FROM feed WHERE date = '".$choice."' group by date"; $res = mysql_query($sql) or die('sql='.$sql."\n".mysql_error()); 
$row = mysql_fetch_assoc($res); 
$dayPowerP = array ('dayPowerP');
?>

<?php 
$choice = (isset($_POST['choice'])) ? date("m",strtotime($_POST['choice'])) : date("m"); $con = mysql_connect("localhost","root","xxxxxx");  
if (!$con)  {  die('Could not connect: ' . mysql_error());  }  
mysql_select_db("inverters", $con);  
$sql = "SELECT sum(power/1000) AS choice FROM feed WHERE month(date) = '".$choice."'";
$res = mysql_query($sql) or die('sql='.$sql."\n".mysql_error()); 
$row = mysql_fetch_assoc($res); 
$monthPowerP = array ('monthPowerP');
?>

<?php 
$choice = (isset($_POST['choice'])) ? date("Y",strtotime($_POST['choice'])) : date("Y"); $con = mysql_connect("localhost","root","xxxxxx");  
if (!$con)  {  die('Could not connect: ' . mysql_error());  }  
mysql_select_db("inverters", $con);  

$sql = "SELECT sum(power/1000) AS choice FROM feed WHERE year(date) = '".$choice."'";
$res = mysql_query($sql) or die('sql='.$sql."\n".mysql_error()); 
$row = mysql_fetch_assoc($res); 
$yearPowerP = array ('yearPowerP');
?>
<?php
$outarr['dayPowerP'] = $dayPowerP;
$outarr['monthPowerP'] = $monthPowerP;
$outarr['yearPowerP'] = $yearPowerP;
echo json_encode($outarr);
?>

Вот Jquery, который я использую для публикации, и JSON

    <script type="text/javascript">
$(document).ready(function () {   
$('#datepicker').datepicker({maxDate: 0, dateFormat: 'yy-mm-dd', onSelect: function(dateText) {
            var myDate = $(this).datepicker('getDate');
            $('#apDiv1').html($.datepicker.formatDate('DD, d', myDate));
            $('#apDiv5').html($.datepicker.formatDate('MM', myDate));
            $('#apDiv7').html($.datepicker.formatDate('yy', myDate));           
            $.ajax({  
            type: "POST",   
            url: "calclickM.php",                  
            data: {choice: dateText}, 
            dataType: "json",  
            success: function(json_data) {  
            $('#apDiv2').html(json_data['dayPowerP']);  
            $('#apDiv6').html(json_data['monthPowerP']);  
            $('#apDiv8').html(json_data['yearPowerP']);  
           } 
        })           
    }});
}); 

Спасибо,

Alan

Ответы [ 5 ]

2 голосов
/ 08 декабря 2010

Сначала метод load, который вы вызываете, отправляет запрос AJAX GET на ваш сервер. Вы, вероятно, поддерживаете запросы POST и GET в своем скрипте PHP.

Во-вторых, у вас есть некоторые ошибки в ваших $.ajax вызовах. Есть некоторые неопределенные строки, переменная данных, которую вы используете как ('#apDiv9').html(data), не определена, и если она будет, то она, вероятно, будет содержать данные JSON, которые вы не можете напрямую вставить в элемент HTML.

Последнее, но не менее важное, вторая попытка не сделает ваш код быстрее. Браузер может поддерживать только ограниченное количество параллельных запросов ajax (1-2). Вы по-прежнему делаете то же количество запросов, и некоторые из них должны ждать завершения других. Перепроектируйте свой код так, чтобы вы возвращали все за один вызов.

1 голос
/ 08 декабря 2010

Есть способ сделать то, что вы просите, но вам нужно будет обработать результаты самостоятельно. По сути, все ваши Ajax-вызовы имеют одинаковые параметры, но разные наборы результатов. Итак, во-первых, код на стороне клиента, который делает волшебство:

$.post('datePacked.php', {choice: dateText}, function(data) {
    $('#apDiv2').html(data['dayPower']);
    $('#apDiv4').html(data['dayGraph']);
    $('#apDiv6').html(data['monthPower']);
    $('#apDiv9').html(data['monthGraph']);
    $('#apDiv8').html(data['yearPower']);
    $('#apDiv10').html(data['yearGraph']);
});

Если вы реорганизовали свой HTML-код, чтобы фактически сопоставить div-идентификаторы с результатом вашего ответа JSon, вы можете еще больше упростить вызов:

$.post('datePacked.php', {choice: dateText}, function(data) {
    $.each(data, function(id, value) {
        $('#'+id).html(value);
    });
});

На стороне сервера ваш новый datePacked.php должен возвращать результат JSON, который предоставляет хэш имен для содержимого. По сути это будет выглядеть примерно так:

{ "dayPower" : "<p>My Content</p>", "dayGraph" : "<p>Day graph</p>", ... }

Многоточие предназначено для заполнения оставшейся части содержимого. Выбор значимых имен идентификаторов для ваших элементов HTML - это не только хорошая практика, это может сэкономить вам много повторений, если вы воспользуетесь этим. Примером этого может быть вторая форма примера клиента. Это тот случай, когда контент должен быть JSON, чтобы он работал - если только вы не хотите разделить DOM, возвращаемый сервером.

1 голос
/ 08 декабря 2010

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

var pages = [
  { url: "dayPower.php",   div: "#apDiv4"  },
  { url: "dayGraph",       div: "#apDiv2"  },
  { url: "monthPower.php", div: "#apDiv6"  },
  { url: "monthGraph",     div: "#apDiv9"  },
  { url: "yearPower.php",  div: "#apDiv8"  },
  { url: "yearPower",      div: "#apDiv10" }
};

for ( var i=0; i<pages.length; i++ ) {
  $.ajax({ 
    type: "POST",  
    url: pages[i].url,                 
    data: { choice: dateText}, 
    dataType: "json", 
    success: function(json_data ) 
      (pages[i].div).html(data).show(); // Did you mean json_data here?
    }
  });
}

Случай аналогичен первому коду кода в вашем вопросе.

Еще раз, я знаю, что это не решит реальную проблему, но это облегчит реализацию решения, когда вы (или кто-то еще) найдет его.

РЕДАКТИРОВАТЬ

Если подумать, я вижу по крайней мере одну странную вещь: в функции успеха вы вызываете параметр json_data, но вы получаете доступ к переменнойчто вы назвали data.Вы намеревались назвать их одинаково?

0 голосов
/ 08 декабря 2010

если вам никогда не требуется вызывать что-либо из этого отдельно, почему бы просто не сделать один ajax-вызов php-файла, упаковать все ваши данные в многомерный массив, преобразовать в json и отправить обратно клиенту.

Когда у вас есть этот json, вы можете разбить его с помощью js и выяснить, что происходит в вашей передней части.

В зависимости от того, сколько данных вы получаете, это может занять некоторое время.Если это огромный запрос, то лучше разбить его на несколько небольших вызовов.Он асинхронный, поэтому по крайней мере части вашей страницы будут загружаться.в то время как другие части собирают данные.

0 голосов
/ 08 декабря 2010

Я не совсем уверен, что вы спрашиваете, но вот пара моментов:

  1. $('#apDiv2').load('dayPower.php', {choice: dateText} делает то же самое, что и $.ajax({type: "POST", url: "dayPower.php", data: { choice: dateText}$.ajax, и $.load делают HTTP-запросы через JavaScript, что означает «AJAX».

  2. Ваш второй блок примера кода содержит некоторые основные синтаксические ошибки.Вот первый исправленный вызов $ .ajax:

    $.ajax({ 
        type: "POST",  
        url: "dayPower.php",                 
        data: { choice: dateText}, 
        dataType: "json", 
        success: function(json_data ) { // “{” added to start the function block
            ('#apDiv2').html(data).show(); 
        }
    }) // “})” added to end the object literal and function call
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...