Как извлечь дату из базы данных с помощью php

#php #mysql #sql #datetime

#php #mysql #sql #дата и время

Вопрос:

Я пытаюсь создать еженедельный график работы. Когда я пытаюсь выбрать сдвиги из базы данных, мое значение даты выбирает текущее время, но дату (Y-m-d) из таблицы.

Это мой код:

 while ($row = mysqli_fetch_array($res))
{
          $dt = new DateTime();
          $dt->setISODate($year, $week);

          $fetch_mID = $row['ID_EMPLOYEE'];
          $fetch_fn = $row['Firstname'];
          $fetch_en = $row['Lastname'];
          echo "<tr>";
            echo "<td>" . $fetch_fn . " " . $fetch_en . "</td>";

            do {
              $obj = new ReflectionObject($dt);
              $pro = $obj->getProperty('date');
              $date = $pro->getValue($dt);
              echo $date; //Output = 'Y-m-d H:m:s'

              $shift = $conn->query("SELECT ShiftDate, ShiftStart, ShiftEnd FROM shifts WHERE ID_EMPLOYEE = '$fetch_mID' AND Date(ShiftDate) = '$date'");
              $fetch = mysqli_fetch_array($shift);
              $dt->modify(' 1 day');
            } while ($week == $dt->format('W'));
  

Я бы ожидал, что $date выведет Y-m-d, но он выводит Y-m-d H: m: s. И время — это текущее время.

Комментарии:

1. можете ли вы проверить, какой тип $date ? используя gettype($date)

2. Это строка.

3. Предупреждение: вы широко открыты для SQL-инъекций и должны действительно использовать параметризованные подготовленные операторы вместо того, чтобы вручную создавать свои запросы. Они предоставляются PDO или MySQLi . Никогда не доверяйте никаким входным данным, особенно тем, которые поступают со стороны клиента. Даже когда ваши запросы выполняются только доверенными пользователями, вы все еще рискуете повредить свои данные .

4. Итак, почему $dt = new DateTime(); $obj = new ReflectionObject($dt); $pro = $obj->getProperty('date'); $date = $pro->getValue($dt); echo $date; вместо того, чтобы просто $date = $dt->format("Y-m-d"); ?

5. @miken32, это быстрее, чем format(). Тем более, что это в цикле.

Ответ №1:

Решение состоит в том, чтобы преобразовать $date в объект date, а затем отформатировать дату в новом формате Y-m-d.

   $time = strtotime($date);
  $newformat = date('Y-m-d',$time);
  echo $newformat; // output 2019-04-05
  

Ваш новый код выглядит примерно так :

 while ($row = mysqli_fetch_array($res))
{
          $dt = new DateTime();
          $dt->setISODate($year, $week);

          $fetch_mID = $row['ID_EMPLOYEE'];
          $fetch_fn = $row['Firstname'];
          $fetch_en = $row['Lastname'];
          echo "<tr>";
            echo "<td>" . $fetch_fn . " " . $fetch_en . "</td>";

            do {
              $obj = new ReflectionObject($dt);
              $pro = $obj->getProperty('date');
              $date = $pro->getValue($dt);
              //new code
              $newformat = date('Y-m-d',strtotime($date));
              echo $newformat; // output 2019-04-05
              // end new code
              $shift = $conn->query("SELECT ShiftDate, ShiftStart, ShiftEnd FROM shifts WHERE ID_EMPLOYEE = '$fetch_mID' AND Date(ShiftDate) = '$date'");
              $fetch = mysqli_fetch_array($shift);
              $dt->modify(' 1 day');
            } while ($week == $dt->format('W'));
  

Комментарии:

1. Может потребоваться удалить лишнее ; в date('Y-m-d',strtotime($date);); = date('Y-m-d',strtotime($date));

2. Спасибо. Теперь вывод имеет правильный формат, но он по-прежнему не выбирает значения из таблицы.

3. какой тип ShiftDate в БД?

4. Неважно. Просто пришлось изменить $date в select на $newformat. У тебя есть моя любовь. Большое спасибо.

5. Используйте DateTime класс