如何将大数组值从javascript传递给php

时间:2014-05-07 01:18:24

标签: javascript php arrays

我的要求是发出多个xml请求并将数据存储在一个数组中,这样如果我说出4000条记录,我可以在页面中显示40条记录并可以进行分页。因此,如果我转到第2页,我可以从数组中获取数据,而不是再次发出xml请求。

目前我使用php数组变量存储大量数据,点击按钮javascript函数将通过查询字符串使用ajax请求再次调用相同的php页面。问题是查询字符串不能容纳大数组。

这是我的代码 -

  1. 将php数组传递给javascript变量

    echo '<script type="text/javascript">/* <![CDATA[ */';
    echo 'var allProd = '.json_encode($allProd);
    echo '/* ]]> */</script>';
    
  2. 通过按钮点击

    使用表单调用javascript函数
    <form id="new_page" name="new_page" method="post" action="" >
        <td>&nbsp;&nbsp;Jump to page&nbsp;<input name="neggPage" id="neggPage"  class="pageText" style="height:20px; width:40px"/></td>
        <input type="hidden" name="hideProd" value="<?php echo htmlentities(serialize($allProd)); ?>" />
        <td><input type="Submit" name="neggBut" value="Go" class="pageButton" onClick="get_results(document.getElementById('neggPage').value, <?php echo $sInd; ?>, <?php echo $rndTot; ?>, <?php echo $totEnt; ?>, allProd);">
        Total pages <?php echo $rndTot; ?></td>
        <td height="40">&nbsp;</td>
       </tr></table>
     </form>
    
  3. Javascript功能

    <script>
    function get_results(PageNo, SelIndex, totPage, totEnt, allProd)
    {
    var allProd1 = '';
    for (i=0; i < allProd.length; i++)
    {
        allProd1 += '&q[' + i + ']=' + encodeURIComponent(JSON.stringify(allProd[i]));
    }
    
    if (PageNo > totPage || isNaN(PageNo))
    {
        alert ('Please enter the available pages');
    }
    else
    {
    var neggProd = sessionStorage.getItem('Product1');
    var cntryCode = sessionStorage.getItem('Cntry'); 
    var sortType;
    var ordType;
    if (SelIndex == 0) {sortType = 'bestmatch';}
    else if (SelIndex == 1) {sortType = 'bestseller';}
    else if (SelIndex == 2) {
        sortType = 'pricehigh';
        ordType = 'dsc';
    }
    else if (SelIndex == 3) {
        sortType = 'pricelow';
        ordType = 'asc';
    }
    
    document.getElementById("sl_api").innerHTML="";
    document.getElementById("sl_api1").setAttribute("style","background:     url('KartEazy/loading.gif') #edeeee no-repeat center center; background-size:20px 20px;");
    
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("sl_api").innerHTML= xmlhttp.responseText;
        }
      }
    
    xmlhttp.open("GET",'KartEazy/Skimlinks/Skimlinks.php?PageNum=' + PageNo + '&neggProd=' + neggProd + '&cntryCode=' + cntryCode + '&sortType=' + sortType + '&ordType=' + ordType + '&totEnt=' + totEnt + allProd1, true);
    xmlhttp.send();
    setInterval(function()    {
    document.getElementById("sl_api1").setAttribute("style","background: #edeeee;")},4500);
    }
    }
    </script>
    
  4. 现在我在同一页面试图获取数组

    if(isset($_REQUEST['q']))
    {
    $totEnt = $_REQUEST['q'];
    }
    
  5. 我尝试使用隐藏的表单变量,但即使$ _POST也不接受大型数组。请你们中的任何人给我一个解决方案或建议。这对我很有帮助。

    即使将数据存储在数据库或会话变量中也无法满足我的要求。因为如果我使用数据库,我无法检索多个查询的数据,如果用户为同一个URL使用多个选项卡,甚至会覆盖php会话变量。

1 个答案:

答案 0 :(得分:0)

我处于类似的情况,我将几个MEG数据从Javascript传递给PHP。

我没有代码,所以我只能给你一个p代码解决方案,但它会给你一个想法。

// JavaScript:

var bigstring = "...."; the data to pass
var chunkSize = 100*1024; 

// http://stackoverflow.com/questions/7033639/javascript-split-large-string-in-n-size-chunks
var chunks = splitString(bigstring);

var chunkIdx = -1; // Prime the pump

function sendNextChunk() {
  chunkIdx++;


  if (chunkIdx < chunks.length) {
    // Your AJAX call here
    var data = {
      piece: chunkIdx
      ofpieces: chunks.length;
    }

    // set your onsuccess method to call
    // sendNextChunk again
  }
}

sendNextChunk(); // start it.

现在,对于您的PHP代码:

// Read in each chunk, and the piece number.
// The way I've got the code written, then come in sequentional order
// so open up a temporary file and append the data.
// when piece === ofpieces
// you have the whole file and you can then process it.