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>

环境变量.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

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 回答
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 回答
0

用于STR_TO_DATE将文本转换为有效的日期格式:

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