我试图混合php和javascript,因为我的javascript需要访问一些php变量时,页面加载。我理解一些东西有困难,我做了一个代码示例。
<?php
session_start();
$test = 100;
$_SESSION['test'] = 200;
?>
<html>
<head>
<title>Test This Out</title>
</head>
<body>
<h1> Testing Javascript and PHP Mixed </h1>
<p>
<?php
echo("The value of '$test is $test and the value of '$_SESSION['test'] is ");
?>
</p>
<p>
<script type="text/javascript">
<?php
session_start();
if(isset($test)) echo("document.write('Non-session variable exists and is $test <br />');");
else echo("document.write('Non-session variable does not exist<br />');");
if(isset($_SESSION['test'])) echo("document.write('Session variable exists <br />');");
else echo("document.write('Session variable does not exist<br />');");
?>
</script>
</p>
</body>
</html>
输出如下:
Testing Javascript and PHP Mixed
The value of $test is 100 and the value of $_SESSION['test'] is
Non-session variable exists and is 100
Session variable exists
所以我试图了解什么类型的php变量是可用的脚本。看起来变量$test是可用的,但是即使它知道
$_SESSION['test']
存在,如果我尝试输出这个值(与我输出
的方式完全相同)$test
变量),整个系统挂起。
我的问题是:1. 可以在javascript中使用的php"看到"变量我已经在页面上定义的早些时候?2. 为什么我要打印
$_SESSION['test']
变量使整个东西崩溃(根本没有渲染)?3.第二个
session_start(),
脚本中的那个,有必要吗?
谢谢你的帮助
PHP在服务器上运行,Javascript在客户端上运行。它们有完全不同的执行环境,在完全不同的时间执行。PHP变量具有PHP的变量作用域,而JS规则不参与其中,因为PHP不是在"JS环境"中执行的。这是不可能的。
你可以有PHP GENERATE JS代码/变量,但是这些变量不会被JS引擎处理/执行/验证,直到在页面已经由PHP生成并发送到客户端浏览器。
你也可以让JS"发送"变量到PHP,但这是通过AJAX调用完成的,同样,JS在客户端浏览器中运行,PHP在web服务器上运行。就PHP而言,AJAX调用只是一个常规的HTTP请求,当响应返回到浏览器中运行的JS时,它就像来自服务器的任何其他HTTP响应一样。
您的第二个session_start()
将失败-会话必须在服务器生成任何输出之前启动,因为会话ID令牌作为常规HTTP cookie发送到客户端浏览器。每当脚本产生任何输出时,PHP都会自动发送完整的HTTP头,并且在第二个session_start()执行之前,您已经输出了HTML页面的开始和一些JS代码。
如果你有这样的东西:
<script type="text/javascript">
var jsvar = <?php echo $phpvar; ?>;
</script>
对于PHP引擎而言,这是完全有效的PHP代码,并且它将输出$phpvar
在该点的内容。但是请记住,PHP是在服务器上运行的,PHP引擎不知道您要将变量输出到什么环境中。它不知道它在javascript块中,它只知道它应该输出一个变量的内容。如果此时没有定义$phpvar,您实际上会生成:
var jsvar = ;
是一个语法错误。这完全取决于您,以确保您使用PHP生成有效的JAVASCRIPT代码。
代码,正如您现在所拥有的那样,是过程性的,这意味着它将按顺序从第1行运行到EOF, b/c您没有进行任何自定义函数调用等。
您不需要第二个session_start(),第一个足以初始化会话。
从来没有听说过在尝试var dump会话变量时系统挂起。也许可以试试这个格式(单引号代替双引号):
echo('The value of $test is ' . $test . ' and the value of $_SESSION[test] is ' . $_SESSION['test']);