【问题标题】:MySQL date insert errorMySQL日期插入错误
【发布时间】:2012-08-21 04:01:05
【问题描述】:

我正在尝试插入格式为 12-Aug-2012 的日期,但是当我在插入后检查数据库集时,我只能看到 00-00-0000 em> 在日期字段上?

这是我使用的查询:

$query= "INSERT INTO ambition_opportunities SET

 opp_deadline='".strtotime($_POST['deadline'])."'"; // date field come with date picker** 

 $sql = mysql_query($query) or die(mysql_error());

谢谢

【问题讨论】:

  • 你需要格式化你的变量,使它们与数据库字段的格式相匹配,即。您不能将“2012 年 8 月 12 日”格式的日期插入数据库中的“dd-mm-yyyy”字段,就像您可以将 char 添加到 int 字段一样。另外,尽量远离*_mysql 方法(read the red box here),尽量使用 PDO 或 MySQLi。另外,您的 INSERT 语法错误,请查看手册 here

标签: php mysql


【解决方案1】:

Date and Time Literals中所述:

MySQL 可识别以下格式的 DATE 值:

  • 作为'YYYY-MM-DD''YY-MM-DD' 格式的字符串。允许使用“宽松”语法:任何标点字符都可以用作日期部分之间的分隔符。例如,'2012-12-31''2012/12/31''2012^12^31''2012@12@31' 是等价的。

  • 作为'YYYYMMDD''YYMMDD' 格式的不带分隔符的字符串,前提是该字符串作为日期有意义。例如,'20070523''070523' 被解释为'2007-05-23',但'071332' 是非法的(它有无意义的月份和日期部分)并变成'0000-00-00'

  • 作为YYYYMMDDYYMMDD 格式的数字,前提是该数字作为日期有意义。例如,19830905830905 被解释为'1983-09-05'

因此,字符串 '12-Aug-2012' 不是有效的 MySQL 日期文字。您有三个选项(按照某种模糊的偏好顺序,没有任何关于您的要求的更多信息):

  1. 配置 Datepicker 以使用其dateFormat option 以支持的格式提供日期:

    $( ".selector" ).datepicker({ dateFormat: "yyyy-mm-dd" });
    
  2. 使用MySQL的STR_TO_DATE()函数转换字符串:

    opp_deadline=STR_TO_DATE('$_POST[deadline]', '%d-%b-%Y')
    

    注意:请参阅下面有关 SQL 注入的警告。

  3. 将接收到的字符串转换为 PHP 时间戳——例如像现在一样使用strtotime()

    $timestamp = strtotime($_POST['deadline']);
    

    然后:

    • 使用date()格式化时间戳:

      $date = date('Y-m-d', $timestamp);
      
    • 使用FROM_UNIXTIME() 将时间戳直接传递给 MySQL:

      opp_deadline=FROM_UNIXTIME('$timestamp')
      

警告

  1. 您的代码容易受到 SQL 注入的攻击。您真的应该使用prepared statements,您将变量作为不被评估的参数传递到其中对于 SQL。如果你不知道我在说什么,或者如何解决它,请阅读Bobby Tables 的故事。

  2. 另外,如the introduction 中关于mysql_* 函数的PHP 手册一章所述:

    不建议使用此扩展来编写新代码。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。

【讨论】:

【解决方案2】:

正如您所提到的,数据库中字段的类型是00-00-0000。 您插入格式为:12-Aug-2012 的值。

您应该将您的月份值从“月份名称”转换为“数字”, 例如:

Jan -> 01,
Feb -> 02 ...

你明白了。

之后,它应该可以工作了。

【讨论】:

    【解决方案3】:

    您必须确保输入的日期格式为YYYY-MM-DD2012 年 8 月 12 日 不是有效的 MySQL date format,这就是它返回错误的原因。

    此外,您的代码容易受到 SQL 注入攻击。我强烈建议您在将数据插入数据库时​​使用mysql_real_escape_string 以防止SQL injections 作为快速解决方案或更好地使用PDOMySQLi

    您的插入查询应该如下所示:

      SET
     opp_provider='".mysql_real_escape_string($_POST['provider'])."'";
    

    【讨论】:

      【解决方案4】:

      我正在尝试在文本框 2013-12-24 中插入日期。数据库中的日期显示为 1970-01-01

      $date=$year & $month & $day; $date= Date("Y-m-d", strtotime($date));

          $query = "INSERT INTO `book` VALUES('$id', '$title', '$author_name', '$publisher', '$date' )";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-26
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多