将 PHP 形式的用户输入日期转换为 MySQL 可接受的格式
Posted
技术标签:
【中文标题】将 PHP 形式的用户输入日期转换为 MySQL 可接受的格式【英文标题】:Convert user input date in PHP form to MySQL acceptable format 【发布时间】:2022-01-12 05:59:58 【问题描述】:所以,我知道这类问题被问了很多,但我对 mysql 和 php 非常陌生,所以请原谅我询问细节。
我正在努力学习它们,我正在修改我在 YouTube 上找到的演练,将其从输入比萨饼类型更改为创建在线活动日程页面,您可以在其中将新面板提交到 MySql 数据库中,以及列出数据库中已有的所有事件。
提交页面是一个PHP表单,连接到DB。我正在为其中的三个专栏而苦苦挣扎。面板日期、面板开始时间和面板结束时间。 Date在DB中是DATE格式,两个时间列在数据库中是TIME格式。
我知道 MySQL 的标准是 YYYY-MM-DD 表示 DATE,而 HH:MM:SS 是 24 小时格式的时间。我有多个关于最佳方式/应该如何完成的问题,所以请原谅我列出的长长的清单?
1:让用户手动输入日期和时间,然后使用正则表达式来确认它遵循一种特定格式会更好吗?我假设只是强制他们按照 MySQL 格式输入日期和时间,但我不知道如何编写 RegEx 以确保其格式正确,或者
2:我是否应该这样做,以便有一个日历按钮,他们可以单击日期以从日历中选择日期,并下拉列表时间。我不知道如何让这些东西代替已经存在的输入文本框。
另一方面,我有几个关于更改日期在页面上的显示方式的问题,该页面显示了当前在数据库中的所有面板。
3:在显示日期之前,我将使用哪种语句将日期从 YYYY-MM-DD 转换为 MM-DD-YYYY,并对时间执行相同的操作(将 24 小时转换为 12小时后有 AM 或 PM。
我将包含到目前为止的代码。就像我之前说的,我确信其中有很多东西可以清理,但现在我只是想解决这个日期/时间问题。
这里是主页/显示当前在数据库中的数据的位置,以及问题 3 适用的位置。
<?php
$conn = mysqli_connect('localhost', 'eventeny', 'test1234', 'test_event');
if(!$conn)
echo 'Connection error: '. mysqli_connect_error();
$sql = 'SELECT panelName, panelDescription, panelDate, panelStartTime, panelEndTime, panelModerator, panelist FROM schedule ORDER BY panelDate, panelStartTime, panelName';
$result = mysqli_query($conn, $sql);
$fullSchedule = mysqli_fetch_all($result, MYSQLI_ASSOC);
mysqli_free_result($result);
mysqli_close($conn);
?>
<!DOCTYPE html>
<html>
<head>
<title>Test Event 2022</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<style type="text/css">
.brand
background: #cbb09c !important;
.brand-text
color: #cbb09c !important;
form
max-width: 460px;
margin: 20px auto;
padding: 20px;
</style>
</head>
<body class="grey lighten-4">
<nav class="white z-depth-0">
<div class="container">
<a href="index.php" class="brand-logo brand-text">Event Schedule</a>
<ul id="nav-mobile" class="right hide-on-small-and-down">
<li><a href="add.php" class="btn brand z-depth-0">Add a panel</a></li>
</ul>
</div>
</nav>
<h4 class="center grey-text">Schedule</h4>
<div class="container">
<div class="row">
<?php foreach($fullSchedule as $schedule): ?>
<div class="col s6 m4">
<div class="card z-depth-0">
<div class="card-content center">
<h6><?php echo htmlspecialchars($schedule['panelName']); ?></h6>
<div><?php echo htmlspecialchars($schedule['panelDate']); ?></div>
<div><?php echo htmlspecialchars($schedule['panelStartTime']); ?> - <?php echo htmlspecialchars($schedule['panelEndTime']); ?></div>
</div>
<div class="card-action right-align">
<a class="brand-text" href="details.php?id=<?php echo $pizza['id'] ?>">more info</a>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<footer class="section">
<div class="center grey-text">© Copyright 2021</div>
</footer>
</body>
</html>
这是他们可以将新事件输入数据库的页面。这是我需要查看日期和时间的地方,确保其格式正确(无论是什么格式),然后将其保存到数据库中
<?php
$conn = mysqli_connect('localhost', 'eventeny', 'test1234', 'test_event');
if(!$conn)
echo 'Connection error: '. mysqli_connect_error();
$panelName = $panelDescription = $panelDate = $panelStartTime = $panelEndTime = $panelModerator = $panelist = '';
$errors = array('panelName'=>'', 'panelDescription'=>'', 'panelDate'=>'', 'panelStartTime'=>'', 'panelEndTime'=> '', 'panelModerator'=>'', 'panelist'=>'');
if(isset($_POST['submit']))
if(empty($_POST['panelName']))
$errors['panelName'] = 'A panel name is required.';
else
$panelName = $_POST['panelName'];
if(empty($_POST['panelDescription']))
$errors['panelDescription'] = 'A panel description is required.';
else
$panelDescription = $_POST['panelDescription'];
if(empty($_POST['panelDate']))
$errors['panelDate'] = 'The date of the panel is required.';
else
$panelDate = $_POST['panelDate'];
if(empty($_POST['panelStartTime']))
$errors['panelStartTime'] = 'The starting time of the panel is required.';
else
$panelStartTime = $_POST['panelStartTime'];
if(empty($_POST['panelEndTime']))
$errors['panelEndTime'] = 'The ending of the panel is required.';
else
$panelEndTime = $_POST['panelEndTime'];
if(empty($_POST['panelModerator']))
$errors['panelModerator'] = 'The name of the panel moderator is required.';
else
$panelModerator = $_POST['panelModerator'];
if(empty($_POST['panelist']))
$errors['panelist'] = 'The name(s) of the panelist(s) are required.';
else
$panelDate = $_POST['panelist'];
if(!array_filter($errors))
$panelName = mysqli_real_escape_string($conn, $_POST['panelName']);
$panelDescription = mysqli_real_escape_string($conn, $_POST['panelDescription']);
$panelDate = mysqli_real_escape_string($conn, $_POST['panelDate']);
$panelStartTime = mysqli_real_escape_string($conn, $_POST['panelStartTime']);
$panelEndTime = mysqli_real_escape_string($conn, $_POST['panelEndTime']);
$panelModerator = mysqli_real_escape_string($conn, $_POST['panelModerator']);
$panelist = mysqli_real_escape_string($conn, $_POST['panelist']);
$sql = "INSERT INTO schedule(panelName,panelDescription,panelDate,panelStartTime,panelEndTime,panelModerator,panelist) VALUES('$panelName','$panelDescription','$panelDate'.'$panelStartTime','$panelEndTime','$panelModerator','$panelist')";
if(mysqli_query($conn, $sql))
header('Location: add.php');
else
echo 'query error: '. mysqli_error($conn);
?>
<!DOCTYPE html>
<html>
<head>
<title>Test Event 2022</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<style type="text/css">
.brand
background: #cbb09c !important;
.brand-text
color: #cbb09c !important;
form
max-width: 460px;
margin: 20px auto;
padding: 20px;
</style>
</head>
<body class="grey lighten-4">
<nav class="white z-depth-0">
<div class="container">
<a href="index.php" class="brand-logo brand-text">Event Schedule</a>
<ul id="nav-mobile" class="right hide-on-small-and-down">
<li><a href="add.php" class="btn brand z-depth-0">Add a panel</a></li>
</ul>
</div>
</nav>
<section class="container grey-text">
<h4 class="center">Add a Panel</h4>
<form class="white" action="add.php" method="POST">
<label>Panel Name</label>
<input type="text" name="panelName" value="<?php echo htmlspecialchars($panelName) ?>">
<div class="red-text"><?php echo $errors['panelName']; ?></div>
<label>Panel Description</label>
<input type="text" name="panelDescription" value="<?php echo htmlspecialchars($panelDescription) ?>">
<div class="red-text"><?php echo $errors['panelDescription']; ?></div>
<label>Panel Date (Must be in YYYY-MM-DD format)</label>
<input type="text" name="panelDate" value="<?php echo htmlspecialchars($panelDate) ?>">
<div class="red-text"><?php echo $errors['panelDate']; ?></div>
<label>Panel Start Time (Must be in 24 hour HH:MM:SS format</label>
<input type="text" name="panelStartTime" value="<?php echo htmlspecialchars($panelStartTime) ?>">
<div class="red-text"><?php echo $errors['panelStartTime']; ?></div>
<label>Panel End Time</label>
<input type="text" name="panelEndTime" value="<?php echo htmlspecialchars($panelEndTime) ?>">
<div class="red-text"><?php echo $errors['panelEndTime']; ?></div>
<label>Panel Moderator</label>
<input type="text" name="panelModerator" value="<?php echo htmlspecialchars($panelModerator) ?>">
<div class="red-text"><?php echo $errors['panelModerator']; ?></div>
<label>Panelist(s)</label>
<input type="text" name="panelist" value="<?php echo htmlspecialchars($panelist) ?>">
<div class="red-text"><?php echo $errors['panelist']; ?></div>
<div class="center">
<input type="submit" name="submit" value="Submit" class="btn brand z-depth-0">
</div>
</form>
</section>
<footer class="section">
<div class="center grey-text">© Copyright 2021</div>
</footer>
</body>
</html>
如果有人可以就如何做到这一点给我建议,并希望至少能指导我一点,我将不胜感激。这是我正在努力解决的最后一部分,但我无法让它发挥作用。
【问题讨论】:
您必须为 MySQL 查询提供明确的参数格式。它究竟是什么并不重要。如果它不是标准的YYYY-MM-DD hh:mm:ss
,那么您可以简单地将 STR_TO_DATE() 应用于提供的值。如果输入格式是“免费的”,那么您可以使用正则表达式来检查该值是否合法,如果为真,则将其转换为预期将被查询接收的明确格式。当您从 MySQL 检索值时,您可以使用 DATE_FORMAT() 函数将值格式化为查询中所需的格式。
【参考方案1】:
基本上,用户更喜欢简洁的界面,所以我建议提供日历来获取日期。
对于日期时间格式的确认,您可以执行以下操作-
$date = mysql_real_escape_string($_POST['intake_date']);
-
对于 DATE 类型-
$date = date('Y-m-d', strtotime(str_replace('-', '/', $date)));
-
对于 DATETIME 类型-
$date = date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $date)));
我已替换 '/' ,因为有时似乎日期可能包含该斜线。所以我更喜欢用'-'代替它
【讨论】:
看起来日历转换很完美,所以不需要strtotime命令,不过谢谢你的建议。【参考方案2】:如果您希望人们关注并鼓励他们回答,请在不复制和粘贴整个代码的情况下提出更简洁的问题。
使用html<input type="date" >
解决日期格式问题。浏览器会自动显示一个日历供用户选择日期。你可以阅读更多关于here
不需要日历按钮,因为输入本身会显示一个内置日历
在 PHP 中,您可以使用函数来格式化日期对象,例如
echo $myDateVariable->format('Y-m-d H:i:s'); // YYYY-MM-DD HH:MM:SS
阅读更多关于 PHP 日期格式的信息here
但是,以不同于输入内置格式的格式显示它,在将值存储到数据库时总是会导致麻烦。我建议坚持使用单一格式进行显示和输入。您可以稍后在存储时将日期重新格式化为数据库要求。
另外,您可以使用jQueryUI datepicker 插件here。这是自定义日期的显示方式以及它们如何存储在输入值中的好方法。
【讨论】:
似乎工作得很好。以上是关于将 PHP 形式的用户输入日期转换为 MySQL 可接受的格式的主要内容,如果未能解决你的问题,请参考以下文章