【问题标题】:MySQL STR_TO_DATE() returns invalid dateMySQL STR_TO_DATE() 返回无效日期
【发布时间】:2014-07-11 03:06:18
【问题描述】:

我们的网站需要注册。最近很明显,注册过程在很多情况下都失败了。我在我的 PHP 代码中实现了几个日志来开始跟踪它。尽可能包括一个跟踪 mysql_last_error() 的输出。

我的下一步是编写一个脚本,为不同的必填字段生成带有随机值的注册请求。我的逻辑是,如果这产生了问题——问题出在后端逻辑上,如果没有——问题出在服务器负载上。 (顺便说一句,这是合理的逻辑吗?)

当发送其中很多(我会说大约 150 个)时,我只收到三个错误,mysql_last_error 日志显示:

  • [2014 年 5 月 21 日星期三 13:20:45.000000] 日期值不正确:第 1 行的列 'dob' 的日期值不正确:'1964-11-31'

  • [2014 年 5 月 21 日星期三 13:48:37.000000] 日期值不正确:第 1 行的列 'dob' 的日期值不正确

  • [2014 年 5 月 21 日星期三 13:48:37.000000] 日期值不正确:第 1 行的列 'dob' 的日期值不正确:'1967-02-29'

请求以 JSON 格式发送,其 dob 字段为 mm/dd/yyyy 格式。 我的 PHP 代码中的 SQL 随后如下所示:

"STR_TO_DATE('".$cleanUser['dob']."', '%m/%d/%Y')"

我也尝试在 MySQL Workbench 中执行此操作,以将其与可能的错误代码隔离开来。但它在那里也失败了。我只是不明白是什么问题,以及为什么它只在某些日期发生。

所有帮助将不胜感激, 提前致谢

【问题讨论】:

    标签: php mysql date str-to-date


    【解决方案1】:

    11 月只有 30 天,所以日期 1964-11-31 不存在。

    而且 1967 年不是 bissextile 年份,所以今年 2 月只有 28 天。

    顺便说一句,使用参数化查询而不是 SQL 连接以避免让您的查询对 SQL 注入开放。

    【讨论】:

    • 哇,这很尴尬 :-) 我不会想到 MySQL 会验证这一点,所以我什至没有想到它。非常感谢您的帮助!关于 MySQL 注入,来自客户端的所有输入都通过 mysql_real_escape_string() 函数。我不知道参数化查询是什么,所以我去谷歌学习。如果您有指向一篇好文章的链接,那就太好了。
    • stackoverflow.com/questions/4712037/what-is-parameterized-query。它非常易于使用,并且真正保护了您的查询,而 mysql_real_escape_string 没有 (stackoverflow.com/questions/5741187/…)。
    【解决方案2】:

    我认为错误来自数据格式。 %m 表示月份。一月,二月等。请问您可以使用 mm 或 MM 格式来日期吗

    您可以在 php 手册页中查看更多详细信息 http://www.php.net/manual/en/datetime.formats.date.php

    【讨论】:

    猜你喜欢
    • 2019-11-29
    • 2017-03-16
    • 2017-05-26
    • 2015-01-07
    • 1970-01-01
    • 2016-01-09
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多