将 PHP 形式的用户输入日期转换为 MySQL 可接受的格式

Posted

技术标签:

【中文标题】将 PHP 形式的用户输入日期转换为 MySQL 可接受的格式【英文标题】:Convert user input date in PHP form to MySQL acceptable format 【发布时间】:2022-01-12 05:59:58 【问题描述】:

所以,我知道这类问题被问了很多,但我对 mysqlphp 非常陌生,所以请原谅我询问细节。

我正在努力学习它们,我正在修改我在 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">&copy; 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">&copy; 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&lt;input type="date" &gt;解决日期格式问题。浏览器会自动显示一个日历供用户选择日期。你可以阅读更多关于here

    不需要日历按钮,因为输入本身会显示一个内置日历

    在 PHP 中,您可以使用函数来格式化日期对象,例如

    echo $myDateVariable->format('Y-m-d H:i:s');  // YYYY-MM-DD HH:MM:SS

阅读更多关于 PHP 日期格式的信息here

但是,以不同于输入内置格式的格式显示它,在将值存储到数据库时总是会导致麻烦。我建议坚持使用单一格式进行显示和输入。您可以稍后在存储时将日期重新格式化为数据库要求。

另外,您可以使用jQueryUI datepicker 插件here。这是自定义日期的显示方式以及它们如何存储在输入值中的好方法。

【讨论】:

似乎工作得很好。

以上是关于将 PHP 形式的用户输入日期转换为 MySQL 可接受的格式的主要内容,如果未能解决你的问题,请参考以下文章

php怎么将指定日期转换为时间戳?

MySQL 日期格式

如何将php日期格式转换为GMT,反之亦然?

在表单上使用 jquery 日期选择器将用户输入转换为整数日期

php将日期格式转换为mysql格式以进行插入[重复]

在 PHP/MySQL 中将日期时间存储为 UTC