PHP代码网页/移动端正常,社交平台打开报Column 'meno' cannot be null错误
问题分析与修复方案
问题根源
当通过Instagram或Facebook的链接直接打开页面时,页面是通过GET请求加载的,而非表单提交的POST请求——这会导致$_POST['meno']未被赋值,变量$meno直接变成null。而你的数据库表sutaz_tabulka中meno字段设置了非空约束,因此执行INSERT操作时触发了SQLSTATE[23000]完整性约束错误。
修复步骤
- 校验请求方式与参数合法性
在使用$_POST['meno']之前,先判断请求是否为POST,同时检查meno参数是否存在且不为空。 - 处理非法请求场景
对不符合条件的请求(比如GET请求、参数为空),给出明确提示,避免执行后续数据库操作。 - 清理冗余代码
你的代码中同时使用了bindValue()和execute()传参,两者选其一即可,避免冗余。
修改后的完整代码
<?php header("Content-type: text/html; charset=utf-8"); $title = "xxxxxx"; require("header.php"); // 校验请求方式与参数有效性 if ($_SERVER['REQUEST_METHOD'] !== 'POST' || empty(trim($_POST['meno']))) { echo '<div class="dakujem" style="text-align: center; font-size: 30px; margin-top: 200px; padding: 50px 5px; color: white; background-color: rgb(220, 20, 60);">Prosím, použite formulár na zapojenie do súťaže!</div>'; require("footer.php"); // 若有页脚文件可添加,保证页面结构完整 exit; } $conn = new PDO('xxxxxxxxxxxxx'); $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $meno = trim($_POST['meno']); $sql = $conn->prepare('SELECT COUNT(*) AS `total` FROM sutaz_tabulka WHERE meno = :meno'); $sql->execute(array(':meno' => $meno)); $result = $sql->fetchObject(); if ($result->total > 0) { echo '<div class="dakujem" style="text-align: center; font-size: 30px; margin-top: 200px; padding: 50px 5px; color: white; background-color: rgb(220, 20, 60);">Nedávno ste sa už zapojili do našej súťaže!</div>'; } else { $stmt = $conn->prepare("INSERT INTO sutaz_tabulka (meno) VALUES(:meno)"); $stmt->execute(array(':meno' => $meno)); // 添加成功提示 echo '<div class="dakujem" style="text-align: center; font-size: 30px; margin-top: 200px; padding: 50px 5px; color: white; background-color: rgb(34, 139, 34);">Ďakujeme za zapojenie do súťaže!</div>'; } ?>
额外说明
- 加入
trim()是为了过滤用户输入的空白字符,避免仅输入空格导致的无效数据存入数据库。 - 非法请求时直接
exit,可以阻止后续代码执行,避免不必要的数据库连接操作。
内容的提问来源于stack exchange,提问作者Diana Viťazková
相关产品推荐
相关产品推荐

