1

私はこれを理解するのに苦労しています-それは十分に文書化された質問のようですが、私の問題を完全に解決するのに十分な解決策はありません。

基本的に、私は今後のイベントを保存する私たちのウェブサイトのデータベースを持っています。これらのイベントには複数のイベントが表示されることがあるため、表示されている場合はこれらの日付を入力できるフィールドがあります。ほとんどの場合、入力する日付は1つだけなので、追加の日付フィールド(date2、date 3など)は空白です。それらが空白の場合は、それらをNULLとしてmysqlデータベースに保存する必要があります。

mySQLに値を投げるために私が持っているものの例は次のようになります:

if (empty($_POST['date2']))
        {$date2 = NULL;
        }
    else
        {$date2 = mysql_real_escape_string(date("Y-m-d",strtotime($_POST['date2'])));
        }

それが想定されていることをしている。次のように変数を更新しようとすると、問題が発生します。

    mysql_query("UPDATE events
             SET date2='".mysql_real_escape_string($date2))."',

mySQLはこの値が何であるかを知らないので(明らかに、文字列をエスケープしたり、NULLで日付をフォーマットしたりすることはできないため)、代わりに値を0000-00-00として保存します(または1969-12-31 ...問題を解決するための私の試み)。私が理解できないのは、''を使用せずにdate2の値を入力する方法です。

date2 = $ date2に変更しようとしましたが、コードが実行されず、エラーが発生します。 date2 ='$ date2'、実行します-しかし、ここでもNULLを正しく保存していません(NULLではなく'NULL'を保存しているためだと思いますか?)。

何かアドバイス?

4

2 に答える 2

0

変数は一重引用符で囲んでいます。

date2='".mysql_real_escape_string($date2))."',

これは、文字列をフィールドに保存しようとしていることを意味します。

必要nullに応じて、引用符をその周りにドロップする必要があります。

insert into YourTable ('null'); // Will try to insert a string
insert into YourTable (null); // Will try to insert a null

if編集:すぐにステートメントに直接ポップしてみませんか?

if (empty($_POST['date2']))
{
    $date2 = NULL;
    mysql_query("UPDATE events SET date2=null, ...";
    // This will also work...
    mysql_query("UPDATE events SET date2=".$date2.", ...";
}
else
{
    $date2 = mysql_real_escape_string(date("Y-m-d",strtotime($_POST['date2'])));
    mysql_query("UPDATE events SET date2='".mysql_real_escape_string($date2))."', ...";
}

更新されたコード:

$query="update events set ";

if (empty($_POST['date2']))
{
    $date2 = NULL;
    $query.="date2=null, ";
}
else
{
    $date2 = mysql_real_escape_string(date("Y-m-d",strtotime($_POST['date2'])));
    $query.= " date2='".mysql_real_escape_string($date2)."', ";
}

// a few other if statements to finish up the rest of your fields...

$query.=" where someCondition=SomeOtherCondition";
mysql_query($query);

その点で、このコードを素晴らしく新鮮に書いている場合は、PDOから始めることを検討することをお勧めします。プリペアドステートメントを使用します。

于 2012-09-15T01:39:08.290 に答える
0

データベースを正規化できます。dates次の構造を持つテーブルを追加します。

CREATE TABLE  `test`.`dates` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `event_id` INT NOT NULL ,
    `date` DATETIME NOT NULL ,
INDEX (  `event_id` ));

イベントごとに、テーブルには 1 つ以上の日付が保持されます。date2、date3 が空白の場合、テーブルにはそれらのレコードがありません。

于 2012-09-15T01:51:34.837 に答える