POST请求调用cURL和Java程序后如何设置表单值?全局变量不生效
问题原因
- 代码执行顺序错误:你将表单HTML写在PHP处理逻辑之前,页面加载时会先渲染表单,此时还未执行POST请求处理逻辑对
$arg1、$arg2赋值,自然会报未定义变量错误。 global用法错误:一是声明全局变量$arg1时漏写了$符号,二是global关键字只能引用全局作用域中已定义的变量,你没有提前在全局作用域定义这两个变量,自然无法引用。- 变量生命周期问题:PHP的普通变量在单次请求结束后就会销毁,就算你用了
global,下次提交表单发起新请求时变量值也会丢失,你之前用SESSION不生效大概率是没有在代码开头调用session_start()开启会话。 - 手动拼接JSON字符串存在风险,一旦参数内有引号、特殊字符就会导致格式错误,应该用
json_encode()生成。
修复方案
推荐用SESSION存储跨请求的参数值,同时调整代码执行顺序,用函数返回值替代不推荐的global用法,完整可运行代码如下:
<?php // 必须放在代码最开头开启会话,SESSION才能生效 session_start(); // 初始化参数默认值 $arg1 = $_SESSION['arg1'] ?? ''; $arg2 = $_SESSION['arg2'] ?? ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $arg1_post = $_POST["arg1"] ?? ''; $arg2_post = $_POST["arg2"] ?? ''; // 用json_encode生成合法JSON,避免手动拼接出错 $curl_post_fields = json_encode([ 'arg1' => $arg1_post, 'arg2' => $arg2_post ]); // 用函数返回值获取处理后的结果,不要用global $new_arg1 = sendCurlPost($curl_post_fields); $new_arg2 = runJavaProgram(); if ($new_arg1 !== false) { $arg1 = $new_arg1; $_SESSION['arg1'] = $new_arg1; } if ($new_arg2 !== false) { $arg2 = $new_arg2; $_SESSION['arg2'] = $new_arg2; } } function sendCurlPost($curl_post_fields){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://url/" ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($ch, CURLOPT_POST, 1 ); curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_post_fields); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); $response = curl_exec($ch); curl_close($ch); if ($response !== false) { // 这里替换成你从response里提取arg1的逻辑 return $response; } return false; } function runJavaProgram (){ exec('C:\Java\jdk-18\bin\java.exe Main.java 2>&1 ', $output, $retval); if ($retval == 0 && !empty($output[0])) { return $output[0]; } return false; } ?> <!-- 表单放在PHP逻辑之后,此时$arg1和$arg2已经完成赋值 --> <form action="" method="POST"> <!-- 用htmlspecialchars转义避免XSS漏洞 --> <input type="text" name="arg1" value="<?php echo htmlspecialchars($arg1);?>"/> <input type="text" name="arg2" value="<?php echo htmlspecialchars($arg2);?>"/> <input type="submit"/> </form>
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

