我已经在MySQL's date and time functions page周围寻找了很长一段时间,但是我没有找到一个函数来表明一种时间格式是否有效,例如,STR_TO_DATE
函数。用户提供了一种格式,我希望接受尽可能广泛的格式。该格式稍后可以在脚本中与MySQL的STR_TO_DATE
函数一起使用,该函数在失败时返回NULL (这是我希望通过在用户提供无效的时间格式时预先警告用户来避免这种情况)。我打算在临时表的帮助下以某种方式测试这些格式。
我不能使用STR_TO_DATE
函数测试格式的有效性,因为传递给它的字符串值最终将由用户生成(在未来某个未定义的时间点),所以我不知道哪些字符串将传递给它。我曾希望DATE_FORMAT
函数能解决我的问题,但它只是忽略了任何无效的格式说明符(例如,%Q
没有任何含义,它将转换为Q
)。在任何情况下都不会返回NULL,也不会产生警告。
有什么想法吗?
编辑:我能想到的唯一大致可靠的解决方案是列出所有MySQL支持的格式说明符,并将这些格式说明符与用户提供的格式中存在的所有格式说明符进行比较。
preg_match_all("/(?:(?<!%)|(?<=%%))(?:%%)*%([^%])/", $format, $matches);
正则表达式列出前面出现奇数百分号的所有字符。(这是必要的,因为百分号会自动跳转。)现在$matches[1]
包含了这些字符的列表。
发布于 2013-09-14 23:11:55
如果您想知道字符串是否只包含有效的说明符,那么可以创建一个包含32个格式说明符的列表...
a, b, c, d, D, e, f, h, H, i, I, j, k, l, m, M, p, r, s, S, T, u, U, v, V, w, W, x, X, y, Y, %
然后遍历格式字符串并检查有效的说明符...
// pseudo-code... pretend format is an array of the format's characters
function is_valid_format(format) {
for (x = 0; x < format.length; ++x)
if (format[x] == "%" &&
(x + 1 >= format.length ||
specifiers does not contain format[x + 1])
return false
return true
}
您还可以考虑提供一个预设日期格式字符串列表,供用户从中进行选择。除非用户记住了他们的格式字符串或说明符,否则我更倾向于选择日期格式字符串。
发布于 2013-09-15 06:20:48
使用Jquery验证引擎从客户端验证日期格式。
在PHP中,你可以验证日期( MySQL日期格式'2013-09-14‘)为
if(preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
return true;
}
发布于 2013-09-15 09:04:08
可以使用MySQL触发器来实现。
DELIMITER //
CREATE TRIGGER mytrigger BEFORE INSERT ON table_name
FOR EACH ROW BEGIN
IF (NEW.date_column REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$') = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Wrong Input';
END IF;
END //
DELIMITER;
这是一个示例集,它将检查格式为“YYYY-MM-DD”的用户输入,如果用户输入的格式与指定的格式不同,则将抛出消息"Wrong “。
正则表达式可以根据需要进行调整。
https://stackoverflow.com/questions/18806342
复制相似问题