3

ビールのバッチを追跡するために使用しようとしているフォームがあります。醸造のプロセスには数週間から数か月かかるため、フォームを一度に完成させることはできません。ビールのレコードを初めて作成したとき、ほとんどの値は NULL に設定されています。レコードを取得して更新しようとすると、すべての NULL 値もゼロに更新されます。変更された値のみをフォームからデータベースに送信して、残りが NULL のままになるようにするにはどうすればよいですか?

以下は、私の更新コードのサンプルです (PDO の違反を許してください。PDO を使用するのは初めてです)。

    <?php
//Connect to Database
try {
    $DBH = new PDO('mysql:host=localhost; dbname=dbname', 'user', 'password');
    }
catch (PDOException $e) {
    echo $e->getMessage();
    exit();
}
//Build Update SQL Query
$update = "UPDATE brewlog
          SET
            BrewDate = :BrewDate,
            EndOfPrimary = :EndOfPrimary,
            EndOfSecondary = :EndOfSecondary,
            PackagingDate = :PackagingDate,
            AnticipatedOG = :AnticipatedOG,
          WHERE ID = :ID";
//Prepare Query, Bind Parameters, Excute Query
$STH = $DBH->prepare($update);
$STH->bindParam(':ID', $_POST['ID'],PDO::PARAM_INT);
$STH->bindParam(':BrewDate', $_POST['BrewDate'],PDO::PARAM_STR,10);
$STH->bindParam(':EndOfPrimary', $_POST['EndOfPrimary'],PDO::PARAM_STR,10);
$STH->bindParam(':EndOfSecondary', $_POST['EndOfSecondary'],PDO::PARAM_STR,10);
$STH->bindParam(':PackagingDate', $_POST['PackagingDate'],PDO::PARAM_STR,10);
$STH->bindParam(':AnticipatedOG', $_POST['AnticipatedOG'],PDO::PARAM_INT);
$STH->execute();
?>
4

3 に答える 3

4

バインドする前に、データを検証する必要があります。のようなことを言う

if(!empty($_POST['EndOfPrimary'])) {
   $eop = $_POST['EndOfPrimary'];
} else {
   $eop = NULL;
}

次にバインド

$STH->bindParam(':EndOfPrimary', $eop,PDO::PARAM_STR,10);

編集: この検証を使用して、フィールドが空白のままになっている場合以外にも確認します。おそらく日付を入力する必要があるように見えるので、ユーザーが実際に日付を入力したかどうかを確認し、そうでない場合は、どこで間違いを犯したかについての役立つメッセージをフォームに送り返します。これは、日付を検証するために使用する正規表現です。

function pcre_date($subject) {
return preg_match('/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/', $subject);
/*
 *  matches 01/01/1984, 1/1/1984, but NOT 1/1/84
 *  wants mm/dd/yyyy
 */
} // returns 0 for non valid, 1 for valid

次に、これを検証に使用します

if(!empty($_POST['EndOfPrimary'])) {
    if(pcre_date($_POST['EndOfPrimary'])) {
        $eop = $_POST['EndOfPrimary'];
    } else {
        $form_errors[] = "Please format date as mm/dd/yyyy.";
    }
} else {
    $eop = NULL;
}
于 2013-05-17T20:42:41.820 に答える
2

これをきれいに行うには、次の 2 つの手順を使用します。

ユーザーに表示されるフォームで、変更されたフィールドのリストを維持します。たとえば、ユーザーが入力フィールドのデータを変更する場合、Javascript を使用してそのフィールドの内容を非表示のフォームにコピーして送信します。次に、ユーザーが「送信」をクリックすると、すべてのフィールドを含む元のフォームの内容ではなく、非表示のフォームの内容のみが送信されます。

PHP スクリプトで、提供されたフィールドに基づいてクエリを作成します。クエリには、変更されたフィールドのみが含まれるようになりました。このようにして、ステートメントを実行するUPDATEと、変更されていないフィールドは変更されません。

于 2013-05-17T20:40:43.170 に答える
0

申し訳ありませんジョージ、私はあなたが彼がやろうとしていることをはるかに複雑にしていると思います.

実際に を使用する_POST['somevar']と、フィールドが空白の場合、EMPTY 文字列が返されます。空の文字列がデータベースに保存されるため、フィールドはもう NULL ではありません

キャプチャされた値がない場合に、フィールドがデータベースで NULL のままであることを確認する最も簡単な方法は次のとおりです。

$STH->bindParam(':EndOfPrimary', isset($_POST['EndOfPrimary'])?$_POST['EndOfPrimary']:null ,PDO::PARAM_STR,10);
于 2013-05-17T20:46:35.800 に答える