-3

我不明白为什么 MySQL 会导致 PHP PDO 抛出这个错误:

致命错误:未捕获的异常 'PDOException' 带有消息'SQLSTATE [23000]:完整性约束违规:1048 列'免责声明'不能为空'[...]

这个特殊的表单前端和后端涉及相当多的代码,所以我只引用相关的部分。

HTML:

<label for="disclaimer" class="container ten columns">*Blah blah legalese</label>
            <input type="checkbox" name="dislcaimer" value="disclaimer">

PHP:

  if(!isset($_POST['fname']) ||
        !isset($_POST['sname']) ||
        !isset($_POST['email']) ||
        // and so on ...   
        !isset($_POST['dislcaimer']) ||
          (
          !isset($_POST['mf'])&&!isset($_POST['me'])&&!isset($_POST['ms'])&&!isset($_POST['wf'])&&!isset($_POST['we'])&&!isset($_POST['ws'])
        )
      )
    {
        died('We are sorry, but you appear to have left at least one of the mandatory fields blank.');    
}

[...]

$disclaimer = $_POST['disclaimer']; // variable initialisation

PHP/PDO:

  $data = array($first_name, $last_name, $email_from, $telephone, $dateofbirth, $licence, $club, $countynm, $mf, $me, $ms, $wf, $we, $ws, $party, $disclaimer);
  $STH = $dbh->prepare("INSERT INTO competitor (fname, sname, email, phone, dob, licence, club, country, mf, me, ms, wf, we, ws, party, disclaimer) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
  $STH->execute($data);

MYSQL:

数据库的一部分 - phpmyadmin

我只是不明白。在调试复选框返回NULL,但它肯定应该触发未填写必填字段时生成的自动错误?我在此设置中处理复选框是否完全错误?对于其他可选复选框,我会为它们分配一些整数,以防它们被取消勾选(例如“0”),这样就不会出现这种错误。我是否需要为此做同样的事情,但如果设置了它,则分配它可能是“1”......?:/

4

3 回答 3

2

你不知道有两种感觉

  1. 未选中时,复选框不会发送到服务器。
  2. 您必须始终与发生的每个错误保持联系。

对于后一条规则,将此行添加到您的引导文件中

error_reporting(E_ALL);

因此,您将收到一般的每个错误的通知,以及$_POST['disclaimer'];在这种情况下的缺失。
因此,在这种情况下,您必须手动定义它

顺便说一句,如果它只是一个复选框,可以防止数据在不存在时保存,我认为将其存储在数据库中没有意义。

于 2012-12-30T11:38:04.270 回答
1

在这里打错字:

name="dislcaimer"

和这里

!isset($_POST['dislcaimer']) 

但不是在这里:

$disclaimer = $_POST['disclaimer'];

还有一件事,在更正那个错字之后,$_POST['disclaimer']会有价值disclaimer,但你有 tinyint 字段,所以你应该value="1"在输入中使用。

于 2012-12-30T11:37:16.550 回答
1

如果您选中复选框,则发布的值是免责声明。这不是您在数据库中的整数。您可以将其设置为 1,或者您必须在 php.ini 中更改它。

在 php 中,您可以执行以下操作以使其正常工作:

<?php
if ($_POST['disclaimer'] == 'disclaimer') {
//checked
$disclaimer = 1;
} else {
// not checked
$disclaimer = 0;
}
于 2012-12-30T11:44:24.337 回答