如何阻止将无效日期发送到数据库

时间:2014-08-03 22:25:19

标签: php

我要求以正确的格式输入日期,如果不是,则会显示错误。我的PHP程序如下所示:

    if (empty($_POST["date"])) {
      $dateErr = "Date is required";
         } else {
           $date = test_input($_POST["date"]); etc

这只是显示不正确日期格式错误的标准方法。但我的问题是,即使显示错误,也没有什么能阻止该日期(格式错误)传递到数据库中。当我检查我的数据库时,我看到了那个日期,这不是我想要的。是否有一种方法可以阻止以错误格式写入的日期结束我的数据库?就像过滤器一样,我的意思是。

4 个答案:

答案 0 :(得分:1)

使用强大的DateTime类,DateTime :: createFromFormat在这里很有用,它会在失败时返回一个新的DateTime实例或FALSE。

所以它会这样:

    if (empty($_POST["date"])) {
  $dateErr = "Date is required";
     } else {
       $format = 'Y-m-d'; // write your format here
       $date = DateTime::createFromFormat($format, $_POST["date"]);
       if($date)
       {
           // add to database
       }

此外,您的数据库字段应设置为日期时间,格式为Y-m-d,因此在插入之前,您必须使用PHP将其格式化为Y-m-d,如:

$date->format('Y-m-d');

这将返回一个在数据库中插入的正确字符串。

答案 1 :(得分:0)

您可以使用strtotime进行检查。不需要正则表达式

$date = strtotime($_POST["date"]);
if($date === false) $dateErr = "Unrecognized Date format";
else $date = date('m/d/Y', $date); // Set your own date format here

答案 2 :(得分:0)

在开始db事务之前,您应该使用函数检查给定的日期是否采用适当的格式。您可以使用正则表达式在以下方法中执行此操作,如提到的@Subhanker以匹配以下格式YYYY-MM-DD:

 if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $_POST['date']))
{
    //Start DB transaction here

    // Create connection
      $con=mysqli_connect("example.com","peter","abc123","my_db");

    // Check connection
      if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
      }

    // escape variables for security
     $form_date = mysqli_real_escape_string($con, $_POST['date']);


     $sql="INSERT INTO dates_table (dates)
           VALUES ('$form_date')";

     if (!mysqli_query($con,$sql)) {
      die('Error: ' . mysqli_error($con));
      }

     echo "1 record added";

}else{
    $dateErr = "Date is required";
}

如果您有任何疑问,请与我们联系!

答案 3 :(得分:0)

if (preg_match("/^(19|20)\d\d[\-\/.](0*[1-9]|1[012])[\-\/.](0*[1-9]|[12][0-9]|3[01])$/", $date )){//This will match the input in format YYYY-MM-DD
//Date ok
}else{
//Invalid Date
}