在php中改变变量,但在javascript中相同的变量不变
Changing variable in php but same variable in javascript not changing
我试图创建一个谷歌图表来显示一个进程在不同时期的资源使用情况。我将不同的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()没有输入,则默认情况下它将指定文件并将文件中的所有值存储到一个名为elements[][]的数组中。我首先创建一个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;
}
我认为问题可能是与您的jQuery ajax调用:
$.ajax({
url: 'PHPVar.php',
type: 'POST',
data: {fileNumber:str},
success: function(data) {console.log(data);}
});
默认情况下,jQuery .ajax()正在缓存结果。
所以你可能想默认禁用缓存,通过这样做:
$.ajaxSetup({ cache: false });
在你初始化JS代码之前的某个地方。
- 像createComment这样的各种自定义变量名在内联javascript中被覆盖,但在外部js中没有.为什么?
- 变量在运行时未定义,但在使用调试器时定义
- 服务变量分配了数据,但在访问时始终未定义
- ng绑定html,变量名来自ng repeat,但在其他地方定义了变量
- d3.js变量未定义,但在Firefox控制台中,它可以工作
- 变量有效,但在代码块的下方未定义
- 在客户端上从 Meteor.call 获取未定义,但在服务器上变量包含数据
- 在控制器中声明的变量,带有“var”,但在控制器中引用为范围
- Javascript Date 适用于临时变量,但在首次分配给变量时失败
- 变量在$scope中可见,但在 Angular 中实际访问时未定义
- 如何在重定向()中传递变量 - 但不是在URL中传递变量
- 变量包含值,但在操作中它们等于NULL
- JS-在函数中设置变量值,但在函数外使用变量
- Javascript变量在chrome中不可访问,但在firefox中运行良好
- 在Javascript中,如何引用函数范围内的变量,该变量来自在该函数中调用但在其他地方定义的函数
- 你怎么称呼一个变量,它在函数外是常量,但在函数内是变量
- 虽然在控制台中未定义,但setInterval中的javascript变量会在警告框中显示其值
- Javascript变量已声明并初始化,但在检查时未定义
- 在php中改变变量,但在javascript中相同的变量不变
- JQuery变量在第一次点击时未定义,但在第二次点击后定义