You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

$_GET数据无法写入mysqli_query,Formstack Webhook仅日期字段生效

问题:Formstack Webhook推送数据至AWS RDS仅DateTime字段写入,浏览器访问正常

我写了一段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:
    $userid = $_POST['UniqueID']; 
    // 其他参数同理
    
    另外你也可以去Formstack的Webhook设置里检查,是否支持切换为GET请求,但POST是更常见的Webhook方式,建议优先调整代码。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:45:55