-1

日付と同じ日付に 1 週​​間を加えた新しい行をデータベースに挿入しようとしています。

私はphpでPDOを使用していますが、それが関連しているかどうかわかりません。

これは失敗するコードです:

$stmtEncInsert = $db->prepare("INSERT INTO test
                                        (id_Event,   NIF,  name , description,  image,  start_date, end_date) 
VALUES (:idOfEvent, :NIF, :name, :description, :image, :startDate, DATE_ADD(:date_end,INTERVAL 1 WEEK)
                                        )");

        $stmtEncInsert->execute(array(':idOfEvent' => $idOfEvent, ':NIF'=> $NIF, ':name' => $resEnc['name'], ':description' => $resEnc['description'],
                                      ':image' => $resEnc['image'], ':startDate' => $date_end, ':date_end' => $date_end));

他のクエリ (例: $resEnc['..']) からいくつかのデータを取得しますが、すべてのデータに問題はありません。すべてのデータをファイルに出力しようとしましたが、すべて問題ありません。存在します。

問題は、最後のフィールド (end_date) が常にエラーを出していることです: このフィールドを空のままにしておくことはできません...

DATE_ADD あたりの問題だと思いますが、これに関連するものは見つかりませんでした。

DATE_ADD を削除して current_date だけを使用してテストしたところ、動作するので、これが問題だと思います。

何か案が?

MySQLをエンジンとして使用しています

これは、指定された例外の出力です。

 Integrity constraint violation: 1048 Column 'end_date' cannot be null

$date_end には 0000-00-00 が含まれています。これは有効な日付であり、フィールドは別のクエリの DB から取得した DATE タイプです

4

1 に答える 1

1

0000-00-00は有効な日付ではありません。MySQL は、無効または不完全な日付を格納するように構成できますが、有効にはなりません。そのため、1 週間を追加しようとしても有効な日付は返されませんが、次のようになりますNULL

mysql> SELECT DATE_ADD('0000-00-00', INTERVAL 1 WEEK);
+-----------------------------------------+
| DATE_ADD('0000-00-00', INTERVAL 1 WEEK) |
+-----------------------------------------+
| NULL                                    |
+-----------------------------------------+
1 row in set, 1 warning (0.03 sec)

要約すると、エラーメッセージが説明しているようend_dateに、必須になるように設計した場合、空にすることはできません。適切な値を割り当てるか、許可してNULLください。


編集 #1:強制的に'0000-00-00'プラス 1 週間にしたい場合は、次のように'0000-00-00'します。

COALESCE(DATE_ADD('0000-00-00', INTERVAL 1 WEEK), '0000-00-00')

IMHO、「0000-00-00」の日付を処理しても何のメリットもありませんし、すべてがより複雑になりますが、とにかくそれはあなたのコードです;-)

編集 #2:ユーザーはフィールドの日付にゼロを入力しません。PHP コードは、空の日付を検出して挿入する必要がありますNULL

if( is_valid_date($_POST['start_date']) ){
    $start_date = $_POST['start_date'];
}else{
    $start_date = NULL;
}
$stmtEncInsert = $db->prepare("INSERT INTO test (start_date) VALUES (:start_date)");
$stmtEncInsert->execute(
    array('test_date' => $start_date),
);

しかし、データベースの設計に問題があります。end_date列は必須ですが、ユーザーは入力する必要はありません。

于 2013-11-12T11:41:26.043 に答える