如何在请求发起页面使用jQuery $.post设置的PHP变量$entrymode
解决原页面使用异步请求后设置的PHP变量问题
首先得明确一个核心点:PHP是服务器端语言,原页面的PHP代码在页面第一次加载时就已经执行完毕了,而你用jQuery的$.post发起的是异步客户端请求——这时候entrymode.php里的$entrymode是在另一个独立请求中设置的,原页面的PHP根本“看不到”这个变量。所以直接在原页面的PHP里写If ($entrymode == $addentry)是行不通的,得换个思路,下面给你几个可行的方案:
方案一:用Session保存$entrymode,让原页面可以读取
这个方案适合你需要在原页面的PHP逻辑中使用$entrymode的场景:
- 第一步,修改
entrymode.php,开启Session并把$entrymode存进去:
<?php session_start(); // 必须开启Session include_once('common.php'); global $flag, $addentry, $editentry; if(isset($_POST['value']) ){ $flag= $_POST['value']; } switch($flag){ case "add": $entrymode = $addentry; break; case "edit": $entrymode = $editentry; break; } $_SESSION['entrymode'] = $entrymode; // 存到Session里 echo $entrymode; ?>
- 第二步,在原页面中:
- 如果允许页面刷新后使用变量,直接在原页面的PHP里读取Session:
<?php session_start(); include_once('common.php'); if(isset($_SESSION['entrymode'])){ $entrymode = $_SESSION['entrymode']; if($entrymode == $addentry){ // 执行add对应的后端逻辑 } else { // 执行edit对应的后端逻辑 } // 用完可以销毁这个Session(可选,避免后续干扰) unset($_SESSION['entrymode']); } ?> - 如果不想刷新页面,就在`$.post`的回调函数里,用返回的`data`(也就是`$entrymode`的值)触发前端操作,再配合新的AJAX请求调用后端逻辑。
方案二:把判断逻辑放到前端,用AJAX返回的值直接处理
如果你的逻辑不需要在原页面的PHP中执行,而是可以通过前端控制,那这个方案更简单:
修改原页面的jQuery代码,在回调函数里根据返回的data(也就是$entrymode的值)执行不同操作:
var value = 'add'; $.post('entrymode.php', {value: value}, function(data){ $('#add_name1').html(data); // 这里直接用data判断,data就是entrymode.php返回的$entrymode值 if(data === '<?php echo $addentry; ?>'){ // 执行add对应的前端操作,比如显示添加表单、隐藏编辑区域等 console.log('进入添加模式'); } else { // 执行edit对应的前端操作 console.log('进入编辑模式'); } });
如果需要触发后端的特定逻辑,也可以在这个判断里再发起新的AJAX请求,调用对应的后端接口。
方案三:改用同步AJAX(不推荐)
虽然可以把$.post改成同步请求,但这会阻塞浏览器,导致页面暂时无法响应,影响用户体验,所以不建议使用。如果一定要试,代码大概是这样:
var value = 'add'; var entrymodeValue; $.ajax({ url: 'entrymode.php', type: 'POST', data: {value: value}, async: false, // 开启同步请求 success: function(data){ entrymodeValue = data; $('#add_name1').html(data); } }); // 之后可以用entrymodeValue做前端判断,但原页面的PHP还是拿不到这个值
总结一下,最常用的是方案一(需要后端PHP逻辑使用变量)和方案二(前端控制逻辑),你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者Manoj Patil
相关产品推荐
相关产品推荐

