1

(フォーム内の)値をMySQLの日付フィールドに挿入するにはどうすればよいですか。私はこれを試しています:

<form  action="enviar.php" autocomplete="off" method="post"> 
    <label for="nacimiento" class="youpasswd" data-icon="p">
        Fecha de Nacimiento
    </label>
    <br>
    <input id="nacimiento" name="nacimiento"
           required type="datetime" placeholder="DD/MM/YYYY" />
</form>

enviar.php

$nacimiento= $_POST['nacimiento'];
mysql_query("INSERT INTO voluntarios(nacimiento) VALUES ('$nacimiento')");`

これは他のすべてのフィールドでは機能しますが、日付フィールドでは機能しません。それは空です。私は何が間違っているのですか?

ありがとうございました

4

5 に答える 5

4

フィールドからサーバーに値を取得することさえ問題があるようですinput。これは最初に修正する必要があります。データをデバッグ( var_dump) し、$_POST何が起こっているかを確認します。さらにヘルプが必要な場合は、さらにコードを提供してください。あなたが書いたものから、値が送信されるべきではない理由がわかりません。

日付文字列を取得したら、値をMySQL が認識する文字列リテラル形式に変換します。

$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

次に、次を使用して挿入しmysqli_queryます。

mysqli_query(sprintf("INSERT INTO voluntarios(nacimiento) VALUES ('%s')"),
                      mysql_real_escape_string($mysqldate));

PDOを使用してこれを行います。

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$q = $dbh->prepare("INSERT INTO voluntarios(nacimiento) VALUE (:nacimiento)");
$q->bindParam(':nacimiento', $mysqldate, PDO::PARAM_STR);
$success = $q->execute();
于 2012-07-23T22:44:32.727 に答える
2

試してみて、エコー$_POST['nacimiento'];して、それが何かをするかどうかを確認してください。また、SQL クエリ全体を投稿していないようですが、クエリにエラーがある可能性がありますか?

編集: mysql_errorを使用してエラーの内容を確認することもできます


次のコードは、 SQL インジェクションに対して脆弱です

$nacimiento= $_POST['nacimiento'];
mysql_query("INSERT INTO voluntarios(nacimiento) VALUES ('$nacimiento')");`

非推奨になったため、mysql_* 関数の使用を停止します。代わりにPHP データベース オブジェクト (PDO)を使用してください。PDO では、SQL インジェクションから保護するパラメーター バインディングが可能です。

ここでPDO の使用について読むことができます

于 2012-07-23T22:42:42.147 に答える
1

問題は、日付をSQL標準(YYYY-MM-DD)にフォーマットする必要がある可能性があります。

POSTで何が表示されるかについてかなり自信がある場合は、次を使用できます。

$formatted_date = date('Y-m-d',strtotime($_POST['nacimiento']));

フォーマットを確認したい場合は、次のようなものを使用できます。

preg_match('#^(\d{1,2})/(\d{1,2})/(\d{4})$#', $_POST['nacimiento'], $matches);
if(count($matches))
{
    $formatted_date = $matches[3].'-'.str_pad($matches[1],2,0,STR_PAD_LEFT).'-'.str_pad($matches[2],2,0,STR_PAD_LEFT);
    // Use formatted date in query
}
else // handle error
于 2012-07-23T23:06:48.887 に答える
1

マニュアルで説明されているように、 MySQL は YYYY-MM-DD 形式の日付リテラルを想定しています。受け入れられるものはかなり寛大ですが、あなたが提供する形式は受け入れられません。

おそらく、いくつかの文字列のジャグリングを回避できますが、自分自身を支持して正しく実行してください。つまり、PDO 準備済みステートメントを使用してください。日付の解析と事前チェックを php に簡単に任せられるだけでなく、コードはより安全で将来性のあるものになります。

例の要素を使用して、コードは次のようになります

$stmt = $dbh->prepare("INSERT INTO voluntarios(nacimiento) VALUES (:nacimiento)");
$stmt->bindParam(':nacimiento', $nacimiento);
// WARNING - strtotime strtotime expects '-' separators if you feed it dd-mm-yyyy
// you should modify that in your form.
$nacimiento = strtotime($_POST['nacimiento']);
$stmt->execute();
于 2012-07-23T22:45:29.200 に答える
0

STR_TO_DATEテキストを有効な日付形式に変換するために使用します。

STR_TO_DATE('12/15/2008', '%m/%d/%Y'); 
于 2012-07-23T22:41:20.023 に答える