奇怪的PHP PDO错误 - 意外的null

时间:2012-12-30 11:29:32

标签: php mysql forms pdo checkbox

我不明白为什么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:

part of database- phpmyadmin

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

3 个答案:

答案 0 :(得分:2)

有两种情况你不知道

    未选中时,
  1. 复选框不会发送到服务器。
  2. 您必须始终与发生的每一个错误保持联系。
  3. 对于后一条规则,将此行添加到引导程序文件

    error_reporting(E_ALL);
    

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

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

答案 1 :(得分:1)

错字:

name="dislcaimer"

在这里

!isset($_POST['dislcaimer']) 

但不在这里:

$disclaimer = $_POST['disclaimer'];

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

答案 2 :(得分:1)

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

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

<?php
if ($_POST['disclaimer'] == 'disclaimer') {
//checked
$disclaimer = 1;
} else {
// not checked
$disclaimer = 0;
}