2017-01-02 10 views
0

テーブルのいずれかにレコードを追加しようとしています。列の1つは、入力された情報に応じて将来の日付で埋められることが意図されています。時には1か月、場合によっては1年です。ダイナミックCURDATEとINSERT INTOの問題

CURDATE()+ INTERVAL 1 MONTH/YEARを使用して将来の日付を取得しています。

ただし、レコードを追加すると、日付は0000-00-00と表示されます。

これは私が使用しているコードです:

if ($_POST['type'] == "month") { 
    $expire = 'CURDATE() + INTERVAL 1 MONTH'; 
} else if ($_POST['type'] == "year") { 
    $expire = 'CURDATE() + INTERVAL 1 YEAR'; 
} 

$insertSQL = 'INSERT INTO users (dateAdded, name, email, promoEndDate) VALUES (now(), :name, :email, :expire)'; 
$rsInsert = $pdo->prepare($insertSQL); 
$rsInsert->bindParam(':name', $_POST['name'], PDO::PARAM_STR); 
$rsInsert->bindParam(':email', $_POST['email'], PDO::PARAM_STR); 
$rsInsert->bindParam(':expire', $expire, PDO::PARAM_STR); 
$rsInsert->execute(); 

私は以前に結合することなくCURDATEを使用しているし、それが働いているが、私は、ユーザーの選択に依存する間隔を必要としています。

私は$ rsInsert-> bindValue( ':expire'、$ expire、PDO :: PARAM_STR)を使ってみましたが、同じ結果が得られました。

ご協力いただければ幸いです。

ありがとうございました。

+3

準備文は、値を準備するためのものです。つまり、あなたの 'CURDATE()+ INTERVAL 1 MONTH'はmysql式ではなく文字列として扱われます。 –

+0

ありがとうございました。私はbindParam行を削除し、$ expireを直接クエリ文字列に追加しました。出来た。 – cesarcarlos

+0

これで質問に答えられます。 –

答えて

0

これはちょっとハッキリかもしれませんが、その特定の挿入ステートメントにユーザが入力したパラメータを使用しているわけではないので、恐ろしいものではありません。あなたの質問へ

if ($_POST['type'] == "month") { 
    $expire = 'CURDATE() + INTERVAL 1 MONTH'; 
} else if ($_POST['type'] == "year") { 
    $expire = 'CURDATE() + INTERVAL 1 YEAR'; 
} 

$insertSQL = 'INSERT INTO users (dateAdded, name, email, promoEndDate) VALUES (now(), :name, :email, '. $expire .')'; 
$rsInsert = $pdo->prepare($insertSQL); 
$rsInsert->bindParam(':name', $_POST['name'], PDO::PARAM_STR); 
$rsInsert->bindParam(':email', $_POST['email'], PDO::PARAM_STR); 
$rsInsert->execute(); 

必ずしも関係ありませんが、どちらも月または年が指定されている場合ので、あなたはおそらく、彼らは$ _POSTから来ている場合は、あなたの変数を消毒だけでなく、ポストタイプのデフォルトのケースを含めて検討すべきであるあなたの変数が追加されず、挿入が失敗します。

+0

これは私がやったことです。ありがとう! – cesarcarlos