-3

MySQL が原因で PHP PDO がこのエラーをスローする理由がわかりません。

致命的なエラー: メッセージ「SQLSTATE[23000]: 整合性制約違反: 1048 列 '免責事項' を null にすることはできません」[...] を含む例外 'PDOException' がキャッチされません

この特定のフォームのフロントエンドとバックエンドにはかなりの量のコードが含まれているため、関連する部分だけを引用します。

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);

マイSQL:

データベースの一部 - phpmyadmin

私はそれを理解していません。チェックボックスをデバッグするとNULLが返されますが、必須フィールドが入力されていないときに生成される自動エラーをトリガーする必要がありましたか? この設定でチェックボックスを完全に間違って処理していますか? 他のオプションのチェックボックスについては、この種のエラーが発生しないように、それらがチェックされていない場合 (たとえば「0」) に整数を割り当てています。これについても同じことを行う必要がありますが、設定されている場合はおそらく「1」を割​​り当てます...? :/

4

3 に答える 3

2

あなたにはわからないことが2つあります

  1. チェックボックスがオフの場合、チェックボックスはサーバーに送信されません。
  2. エラーが発生するたびに、常に連絡を取り合う必要があります。

後者のルールでは、この行をブートストラップ ファイルに追加します。

error_reporting(E_ALL);

$_POST['disclaimer'];そのため、通常はすべてのエラーが通知され、この場合は欠落が通知されます。
したがって、この場合は手動で定義する必要があります

ちなみに、チェックボックスが存在しない場合にデータが保存されないようにする場合は、データベースに保存する意味がありません。

于 2012-12-30T11:38:04.270 に答える
1

タイプミス:

name="dislcaimer"

そしてここ

!isset($_POST['dislcaimer']) 

ここではありません:

$disclaimer = $_POST['disclaimer'];

もう1つ、そのタイプミスを修正した後、$_POST['disclaimer']disclaimerが得られますが、そのためのtinyintフィールドがあるためvalue="1"、入力で使用する必要があります.

于 2012-12-30T11:37:16.550 に答える
1

チェックボックスをオンにすると、投稿された値は免責事項です。これは、データベースのアスペクトとしての整数ではありません。これを 1 に設定するか、php で変更する必要があります。

PHPでは、次のようにして機能させることができます。

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