$_GET数据无法写入mysqli_query,Formstack Webhook仅日期字段生效
我写了一段PHP代码用来捕获URL变量并推送到AWS RDS数据库,代码如下:
<?php $userid = $_GET['UniqueID']; $username = $_GET['usename']; $useremail = $_GET['useemail']; $userphone = $_GET['usephone']; $userref = $_GET['refid']; $link = mysqli_connect('xxxx.xxxx.ap-southeast-2.rds.amazonaws.com', 'xxxxx', 'xxxxxx','xxxxxxx'); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } // Check if server is alive if (mysqli_ping($link)) { echo "Connection is ok!"; } else { echo "Error: ". mysqli_error($link); } mysqli_query($link,"INSERT INTO landing_post (`useid`, `name`, `email`, `phone`, `refid`, `DateTime` ) VALUES ('$userid', '$username', '$useremail', '$userphone', '$userref', CURDATE())") or die(mysqli_error($link)); echo "Entered data successfully\n"; mysqli_close($link); ?>
当我通过浏览器访问URL(https://example.com.au/post.php?UniqueID=1234&usename=test&useemail=test%40test.com&usephone=1800+000+000&refid=28383)时,功能完全正常,所有字段都能正确写入数据库;但使用Formstack Webhook推送数据时,只有DateTime字段能正常写入,其他字段都是空值。两者的核心差异是Webhook不会在浏览器中打开页面,请问是我遗漏了配置,还是存在AWS RDS限制?
这种情况大概率和AWS RDS限制无关,问题出在请求处理或者参数传递的环节上,下面是几个最可能的原因和对应的解决办法:
1. 请求方法不匹配:Webhook用POST,你代码只处理GET
Formstack的Webhook默认是通过POST请求发送数据的,而你的代码全程用$_GET来获取参数——这就导致Webhook发送的参数根本没被捕获到,自然除了CURDATE()生成的DateTime,其他字段都是空值。
解决办法有两种:
- 改用
$_REQUEST来获取参数(它会同时处理GET和POST的参数):$userid = $_REQUEST['UniqueID']; $username = $_REQUEST['usename']; $useremail = $_REQUEST['useemail']; $userphone = $_REQUEST['usephone']; $userref = $_REQUEST['refid']; - 或者直接针对POST请求处理,用
$_POST:
另外你也可以去Formstack的Webhook设置里检查,是否支持切换为GET请求,但POST是更常见的Webhook方式,建议优先调整代码。$userid = $_POST['UniqueID']; // 其他参数同理
2. 参数名称不匹配:Formstack发送的字段名和你代码里的不一致
仔细看你的代码,变量$username对应的是$_GET['usename']——这里是不是打错了?应该是username(少了一个r)?如果Formstack里的字段名是标准的username,那你代码里的usename自然拿不到值。
排查方法:给代码加个日志记录,把收到的所有参数都存下来,方便核对:
// 在代码开头添加,把请求参数写入日志文件 file_put_contents('webhook_log.txt', print_r($_REQUEST, true) . "\n\n", FILE_APPEND);
然后触发一次Formstack Webhook,打开webhook_log.txt看看实际收到的参数名是什么,再对应调整代码里的参数键名。
3. 缺少错误捕获,Webhook的错误你看不到
浏览器访问时你能看到页面输出的错误,但Webhook请求是后台发起的,你看不到任何报错。比如如果参数不存在,$_GET['xxx']会抛出警告,但你没捕获,导致插入空值。
建议把错误信息也写入日志,同时对参数做存在性检查:
// 检查参数是否存在,不存在则设为默认值或记录错误 $userid = isset($_REQUEST['UniqueID']) ? $_REQUEST['UniqueID'] : ''; if(empty($userid)) { file_put_contents('error_log.txt', "Missing UniqueID parameter\n", FILE_APPEND); } // 其他参数同理
4. 代码存在SQL注入风险,同时可能引发编码问题
你的代码直接把用户输入拼接到SQL语句里,不仅有严重的SQL注入风险,还可能因为特殊字符编码问题导致插入失败(虽然浏览器访问时没出现,但Webhook的数据编码可能不同)。
强烈建议改用预处理语句来执行插入,既安全又能避免编码问题:
// 预处理语句示例 $stmt = mysqli_prepare($link, "INSERT INTO landing_post (`useid`, `name`, `email`, `phone`, `refid`, `DateTime`) VALUES (?, ?, ?, ?, ?, CURDATE())"); mysqli_stmt_bind_param($stmt, "sssss", $userid, $username, $useremail, $userphone, $userref); mysqli_stmt_execute($stmt); echo "Entered data successfully\n"; mysqli_stmt_close($stmt);
关于AWS RDS的可能性
如果以上都排查过还是有问题,再考虑RDS的因素:比如检查RDS的安全组是否允许Formstack的IP访问(但如果DateTime能写入,说明连接是通的,所以这个概率极低);或者检查数据库表字段的约束(比如是否允许空值,但浏览器能写入说明字段是允许空的)。
综上,优先排查请求方法和参数名称的问题,这是最常见的原因。
内容的提问来源于stack exchange,提问作者Andy Mac

