【问题标题】:Changing variable in php but same variable in javascript not changing更改php中的变量但javascript中的相同变量没有改变
【发布时间】:2015-10-19 14:41:17
【问题描述】:

我正在尝试创建一个谷歌图表来显示进程在不同时间段内的资源使用情况。我正在将不同的 csv 文件导入服务器,然后使用 php 读取它,这是 php 文件:

   //PHPVar.php
    <?php
    class chartData
    {
        var $length;
        var $catagories;
        var $elements = array();
        var $numFiles;
        var $allFiles;       
        function startUp($input = 5)
        {
            $dir = "CSV";
            $this->allFiles = scandir($dir,1);
            $this->numFiles = count($this->allFiles) - 2;               

            $currentDir = $input;           
            $filePath = $dir;
            $filePath .= "/";
            $filePath .= $this->allFiles[intval($currentDir)];

            $file = fopen($filePath,"r");
            $this->elements=array(fgetcsv($file));

            while(! feof($file)
                $this->elements[]=fgetcsv($file);                   

            $this->length=count($this->elements);               
            $this->catagories=count($this->elements[0]);                
        }
    }
    $data = new chartData;
    //If there's a parameter input from AJAX then call startup to
    //refill the elements list
    if(isset($_POST['fileNumber']))
        $data->startUp($_POST['fileNumber']);
    //Else call startup with default parameter
    else
        $data->startUp();
    ?>

因此,我存储所有 csv 文件的目录称为 CSV,因此,如果 startup() 没有输入,则默认情况下它将指定一个文件并将文件中的所有值存储到一个名为的数组中元素[][]。我首先创建一个 chartData 对象并检查是否有输入,如果没有,则表示这是第一次调用。在我的网页中,我有一个下拉菜单,其中显示了 CSV 目录中的所有文件,我希望它可以用我选择的 csv 文件中的值刷新图表。这是我用来将数据(我选择的文件)从 javascript 传输到 php 的代码:

    function changeFile(str) {
                $.ajax({
                    url: 'PHPVar.php',
                    type: 'POST',
                    data: {fileNumber:str},
                    success: function(data) {console.log(data);}
                    });                    
                chart.clearChart();
                drawChart();
            }

因此,下拉菜单中的每个条目最终都会调用此函数,该函数应再次运行 PHPVar.php 以刷新值。生成的第一个图很好,问题是当我尝试将 csv 文件更改为绘图时。我在 javascript 中看到的 php 变量似乎没有改变,而 PHPVar.php 中的 php 变量是。我已经通过将一些变量的值输出到控制台来验证了这一点,并且 PHPVar.php 中的变量确实随着下拉菜单中的每次调用而改变,但似乎无论我在 javascript 中使用的哪个位置记录相同的变量,该值仍然是与我第一次启动网站时一样,无论我从下拉菜单中使用不同的值调用该函数多少次。在我绘制图表的文件中,我使用了

    <?php include 'PHPVar.php' ?>

可能是 include 只是制作 PHPVar.php 的副本,所以当我去更改变量时,我真的在 PHPVar 中更改它,而由 include 创建的同名变量保持不变?任何答案/建议表示赞赏。这里是js函数:

            google.load("visualization", "1", {packages:["corechart"]});
            google.setOnLoadCallback(drawChart);
            var data;
            var options;
            var time;
            var row;
            var selected = 1;
            var average = 0;
            var max = 0;
            var index;
            var size;
            var chart;

            function drawChart() {
                average = 0;
                max = 0;
                data = new google.visualization.DataTable();
                var testArray = null;
                testArray = [];            
                <?php   
                //Export data from php server into javascript array *VERY SENSITIVE, make backup before changing*

                for($i=0;$i<$data->length-1;$i++)
                {
                ?>            
                    testArray[<?php echo $i; ?>] = [];
                    <?php

                    for($j=0;$j<$data->catagories;$j++)
                    {
                    ?>
                        <?php
                        if($j == 0 && $i != 0)
                        {
                            $timeStamp = array();
                            $time = preg_split('/-/', $data->elements[$i][0]);

                            $timeStamp = array(2015,(int)$time[0],(int)$time[1],(int)$time[2],(int)$time[3],(int)$time[4]);

                            ?>

                            testArray[<?php echo $i; ?>][<?php echo $j; ?>] = <?php echo json_encode($timeStamp,JSON_NUMERIC_CHECK); ?>;

                        <?php
                        } else if($i == 0)
                        {
                        ?>
                            testArray[<?php echo $i; ?>][<?php echo $j; ?>] = '<?php echo $data->elements[$i][$j]; ?>'; 
                        <?php
                        } else
                        {
                        ?>
                            testArray[<?php echo $i; ?>][<?php echo $j; ?>] = <?php echo (int)$data->elements[$i][$j]; ?>; 
                        <?php
                        }
                    }
                }
                ?> 
                // Declare columns
                row  = testArray[0][selected];
                time = testArray[0][0];
                data.addColumn('datetime', time);
                data.addColumn('number', row);
                //alert(String(testArray[1][0][1]));
                for(index=1;index<<?php echo $data->length-1; ?>;index++)
                {
                    data.addRow([new Date(testArray[index][0][0],
                        testArray[index][0][1],
                        testArray[index][0][2],
                        testArray[index][0][3],
                        testArray[index][0][4],
                        testArray[index][0][5]), testArray[index][selected]]);
                    average += testArray[index][selected];
                    if(testArray[index][selected] > max)
                        max = testArray[index][selected];
                }
                average = average/<?php echo $data->length-1; ?>;
                var options = {
                    width: 900,
                    height: 500,
                    title: row,
                    hAxis: {
                      title: 'Time',
                      viewWindow: {
                      min: new Date(testArray[1][0][0],
                      testArray[1][0][1],
                      testArray[1][0][2],
                      testArray[1][0][3],
                      testArray[1][0][4],
                      testArray[1][0][5]),//testArray[1][0]),
                      max: new Date(testArray[<?php echo $data->length-2; ?>][0][0], 
                      testArray[<?php echo $data->length-2; ?>][0][1], 
                      testArray[<?php echo $data->length-2; ?>][0][2], 
                      testArray[<?php echo $data->length-2; ?>][0][3], 
                      testArray[<?php echo $data->length-2; ?>][0][4], 
                      testArray[<?php echo $data->length-2; ?>][0][5])
                      },
                      gridlines: 
                      {
                          count: -1,
                          units:
                          {
                              days: {format: ['MMM dd']},
                              hours: {format: ['HH:mm', 'ha']}
                          }
                      },
                      minorGridlines:
                      {
                          units: 
                          {
                            hours: {format: ['hh:mm:ss a', 'ha']},
                            minutes: {format: ['HH:mm a Z', ':mm']}
                          }
                      }
                    },
                    vAxis: {
                      title: 'Resource'
                    },
                    backgroundColor: '#f1f8e9'
                };

                chart = new google.visualization.LineChart(document.getElementById('curve_chart'));

                chart.draw(data, options);
                document.getElementById('Average').innerHTML = "Mean Resource Usage: "+ average;
                document.getElementById('Max').innerHTML = "Max Resource Usage: "+ max;

            }

【问题讨论】:

  • 这是PHPVar.php 文件的全部内容吗?您正在向它发出 AJAX 请求,但 PHP 中似乎没有发送任何响应。
  • 你好泰德。这是对http请求响应周期的误解-我猜测javascript函数drawChart依赖于从php直接打印到js中的变量。这些变量在初始页面加载后永远不会改变。取而代之的是,除了它在参数中需要的变量之外的函数,然后从 ajax 响应中传递它们,例如drawChart(data.graphdata)。当然你必须修改你的 php 来返回这个数据
  • 如果你也展示你的js代码,也许我可以帮你
  • @Ted 我同意史蒂夫的观点,我们需要查看完整的代码才能提供更多帮助......这不是很清楚......
  • @Steve 我已经在帖子中添加了js函数,我不知道是否应该,因为它很长,但就像你说的,我使用的是直接打印到js中的变量来自 php

标签: javascript php csv


【解决方案1】:

我认为问题可能出在您的 jQuery ajax 调用上:

$.ajax({
  url: 'PHPVar.php',
  type: 'POST',
  data: {fileNumber:str},
  success: function(data) {console.log(data);}
});       

默认情况下,jQuery .ajax() 会缓存结果。

因此,您可能希望默认禁用缓存,方法是:

$.ajaxSetup({ cache: false });

在你的初始化 JS 代码之前的某个地方。

【讨论】:

  • 我怀疑这就是问题所在,更可能是 OP 对返回的数据不做任何事情,而是希望更新他的 js 中的硬编码 php 变量
  • @Steve ...我不确定..我理解你的意思..但我们错过了其余的代码以确保..我说的是关于 jQuery 缓存,因为他说最初它是第一次工作然后它不是......
  • 是的,我只是猜测-我的理论是“第一次”是初始页面加载,php 变量将被注入到 js 中。
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2023-04-02
  • 2019-11-30
  • 2013-06-28
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多