#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
класс