Как сделать хороший "сборщик дат" в PHP? - PullRequest
1 голос
/ 11 ноября 2010

Я экспериментирую с MySQL и PHP, и мне любопытно создать приятный "сборщик дат", например, выбрать дату 2010-11-11 (сегодняшняя дата).

Я хочучтобы сохранить действительные значения DATETIME в моей базе данных MySQL, и я хочу, чтобы страница PHP предоставляла скользящие списки для год , месяц и день (например, 2010-11-11) чтобы не заставлять пользователя писать даты в форме вручную, а затем выполнять проверку.

Мой вопрос, скажем, пользователь выбирает дату 2010-11-31 (которая не существует));Как я могу создать простые скользящие списки для динамической настройки?Таким образом, пользователь FIRST выбирает год, затем месяц и, наконец, день (который динамически изменяется для соответствия фактическому количеству дней в данном месяце).Надеюсь, о високосных годах тоже позаботятся.После того, как они выбраны, и пользователь нажимает «Отправить», сценарий отправит в базу данных правильно отформатированное значение DATETIME (например, YYYY-MM-DD или YYYYMMDD).

Насколько я понял, тип DATETIMEявляется строгим стандартом, то есть сервер будет отслеживать недопустимые даты, которые должны быть достаточно легко проверяться на наличие ошибок.Но я хочу избежать этого, выполнив то, что я описал выше.

Можете ли вы сказать, что мое описанное «решение» легко реализовать, используя только PHP (и MySQL)?Или мне понадобятся другие вещи (например, AJAX / JavaScript, JQuery и т. Д.) Для управления этим?Любые предложения и указатели приветствуются, особенно альтернативные подходы к той же проблеме, которые могут быть легче реализовать.Заранее спасибо!

Ответы [ 5 ]

8 голосов
/ 11 ноября 2010

Уже есть много виджетов календаря на основе JavaScript. Если вы не хотите делать это в учебных целях, нет причин изобретать велосипед.

Проверка на стороне сервера, конечно, все еще обязательна, но эти виджеты не позволят пользователю выбрать недопустимую дату при нормальных обстоятельствах.

* 1005 Е.Г. *

3 голосов
/ 11 ноября 2010

Вы пытаетесь решить проблему со стороны клиента здесь, на сервере, imho, хотя проверка никогда не может быть опущена на стороне сервера.

Но недействительные даты, как ваш пример, на самом деле не являются проблемой, так как вы можете использовать strtotime, который хорошо ест большинство дат. Конечно, в этом случае он будет оцениваться до 1 декабря, но в любом случае действительная дата. Вы можете использовать вывод из strtotime с date, чтобы отформатировать его в удобной для базы данных форме.

Чтобы продвинуться немного дальше, если вы хотите убедиться, что введенная дата не только формально действительна, вы можете проанализировать ее с помощью strtotime, отформатировать с использованием date в формате, который был отправлен в ваш скрипт, и сравнить две строки. Если не идентичны, вы узнаете, что что-то не так.

Согласно вашему примеру:

$datePosted = '2010-11-31';    
$fromClient = date('Y-m-d', strtotime($datePosted));

// $fromClient == '2010-12-01' 

if (strcmp($datePosted, $fromClient) != 0) {
  // Invalid date posted
} else {
  // All is well on the western front
}

Вас также может заинтересовать класс DateTime, предоставляемый с более новыми версиями PHP.

2 голосов
/ 11 ноября 2010

Там не должно быть необходимости в Ajax.Ajax перезванивает на сервер, но сервер не знает больше о действительных датах, чем клиент, поэтому все это можно сделать в javascript.Если вы уже используете jQuery, используйте плагин jQuery, но не загружайте всю библиотеку jQuery только для этого: это излишне.Есть много легких сборщиков даты.Все, что вы хотите сделать, это перезагрузить доступные дни, когда кто-то меняет месяц / год (помните февраль: вам нужно перезагрузить также и изменение года).

Мы сделали это с помощью метода, который включает в себя имядень недели вместе с датой:

function OnMonthYearChange(name) {
    var week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var year = document.getElementById(name + '-year');
    var mon  = document.getElementById(name + '-mon');
    var mday = document.getElementById(name + '-mday');
    if ((mon.value  == '') || (year.value == '')) {
        return;
    }

    var date = new Date();
    date.setYear(year.value);
    date.setMonth(mon.value);
    var l = getDaysInMonth(year.value, mon.value);
    var day = mday.value;

    clearSelect(mday);
    var w = 0;
    for (i = 0; i < l; i++) {
        date.setFullYear(year.value, mon.value - 1, i + 1);
        w = date.getDay();
        var o = document.createElement('option');
        o.value = getLeadingZero(i + 1);
        o.text = o.value + ' - ' + week[w];
        //alert(o.text);
        if (i == (day - 1)) o.selected = true;
        if (app.IsIE) {
            mday.add(o);
        } else {
            mday.options.add(o);
        }
    }
}
function getDaysInMonth(year, month) {
    var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (month != 2) return m[month - 1];
    if (year % 4 != 0) return m[1];
    if (year % 100 == 0 && year % 400 != 0) return m[1];
    return m[1] + 1;
}
function clearSelect(e) {
    var first = e.options[0].innerHTML;
    if (first) {
        // Form does not allow selection of a blank date. Drop all existing options.
        e.options.length = 0;
    } else {
        // Form allows selection of a blank date. First option is blank. Keep it.
        e.options.length = 1;
    }
}
function getLeadingZero(n) {
    if (n < 10) n = '0' + n;
    return n;
}

См. http://www.mattkruse.com/javascript/calendarpopup/ для другого подхода, который открывает календарь.Их можно интегрировать, передавая результаты из всплывающего календаря обратно в блоки выбора.

Помните, что люди могут отключить JavaScript и делать всякие странные вещи на стороне клиента, поэтому проверка на стороне сервера по-прежнемувопросы.

1 голос
/ 11 ноября 2010

Вы не можете.Для этого вам понадобится клиентское решение.

PHP имеет дело с обработкой данных, поэтому у вас будет средство выбора даты на основе JavaScript, где пользователь выбирает дату, и тогда вам нужно будет PHP сохранить этовыбранная дата в, скажем, базе данных, при подаче формы.

1 голос
/ 11 ноября 2010

jQuery и другие JavaScript-фреймворки, которые будут выполнять эту работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...