#php #mysql #date
#php #mysql #Дата
Вопрос:
Я хочу поместить используемую дату рождения в database..so Я написал эту функцию:
function setAge($day, $month, $year)
{
$date= strtotime("$day $month $year");
mysql("UPDATE controlpanel
SET date_of_birth=$date
WHERE=".this->$userID) or die(mysql_error());
}
Я не уверен, правильно ли это или лучший способ обновить дату. Переменная поля — DATE, .. Я не вставляю даты, я просто обновляю ее .. вызовет ли это ошибку? это лучший способ перенести дату из php в mysql?
Ответ №1:
Вы должны отформатировать дату в ‘гггг-мм-дд’, чтобы ваша инструкция SQL могла вставить ее в MySQL.
Ответ №2:
Здесь довольно много чего не так.
- Ваш запрос неверно сформирован. Вы не указываете, какое поле вы сравниваете в
WHERE
предложении. Вам нужно сделать что-то вродеWHERE userID = 123
. - Вы не очищаете свои значения. ВСЕГДА Используйте соответствующую функцию фильтрации данных запроса. Если вы этого не сделаете, вы открыты для внедрения SQL. В этом случае вы, вероятно, захотите использовать
mysql_real_escape_string()
. - Вы используете
strtotime()
неправильно. Вы можете легко вручную отформатировать ее с помощью"{$year}-{$month}-{$day}"
.
Просто для акцента:
СЕРЬЕЗНО, ОЧИСТИТЕ СВОИ ДАННЫЕ ДОЛЖНЫМ образом. ВАС ВЗЛОМАЮТ.
Комментарии:
1. переменные будут в безопасности, прежде чем они перейдут в функцию, не волнуйтесь .. красиво noticed..it была ошибка при указании года, месяца, даты
2. Всегда лучше выполнить очистку на месте запроса, а не полагаться на другие части кода, выполняющие очистку за вас. Это означает, что вам нужно помнить о необходимости очистки только один раз, а не каждый раз, когда вы хотите использовать эту функцию. Это также облегчает чтение вашего кода, поскольку в нем нет раздражающих временных переменных, содержащих очищенные версии ваших данных.
Ответ №3:
mysql_query( "UPDATE `controlpanel`
SET `date_of_birth`='".$year."-".$month."-".$day."'
WHERE `userid`=".this->$userID);
В вашем коде довольно много ошибок. Вы хотя бы ПЫТАЛИСЬ запустить это?
В любом случае, этот код устраняет необходимость в strtotime
вызове.
Ответ №4:
Вам не нужна пользовательская функция, в PHP есть функции предопределения даты.
$date= date("Y-m-d", strtotime(mktime(0, 0, 0, $month, $day, $year)));
Вы можете использовать strtotime(), если хотите.
обратитесь к документации для получения более подробной информации http://php.net/manual/en/function.mktime.php
Комментарии:
1. У вас уже есть день, месяц и год с самого начала. Вам не нужно конвертировать в временную метку Unix. Это не ошибка, это своего рода избыточность.
Ответ №5:
kolink — это correct..in формат типа данных database date — год-месяц-день, вы также можете хранить дату и время в timestamp, с этим будет проще обращаться.. с помощью метки времени вы можете более гибко обрабатывать дату и время..
Комментарии:
1. Плохой совет. Типы данных существуют не просто так. Если вы обрабатываете даты как целые числа, вы просто усложняете это без уважительной причины.
Ответ №6:
Если вы посмотрите на руководство по PHP, вы увидите, что strtotime() возвращает целое число, точнее, временную метку Unix. Если вы посмотрите на руководство по MySQL, вы увидите, что столбцы ДАТЫ обрабатываются как строки.
Помимо чтения документации, вы можете видеть, что что-то не так с некоторой простой отладкой. Если вы напечатаете свой запрос с помощью var_dump() и запустите его в своем любимом клиенте MySQL, вы увидите, что ваша строка обновляется с недопустимым значением (или вы получите сообщение об ошибке, в зависимости от настроек сервера).
Теперь есть много способов создать правильно отформатированную строку. Похоже, что отдельные компоненты сохранены в переменных PHP, поэтому вы можете использовать sprintf():
sprintf('d-d-d', $year, $month, $day)
Обновление: я добавляю некоторые другие версии, чтобы угодить @Col. Shrapnel:
sprintf('%s-%s-%s', $year, $month, $day)
"$year-$month-$day"
$year . '-' . $month . '-' . $day
Комментарии:
1. @Col.Shrapnel —
sprintf()
это удобный способ сгенерировать строку с фиксированным форматом. Он выполняет преобразование в целое число и добавляет начальные нули по мере необходимости, и иногда это чище, чем конкатенация необработанных строк. Я думал, вы должны знать, что с 27K репутацией;-P2. какой смысл добавлять нули к году? и в кастинге тоже? если вы хотите подтвердить свою дату, сначала используйте checkdate() — она выполнит часть проверки явно, а не молча с возможным ошибочным результатом в виде sprintf().
3. @Coll.Shrapnel — Я обновил свой ответ. Я знаю, что мне должно быть все равно, но просто я не хочу давать худший ответ в six, когда я единственный, кто позаботился объяснить, почему код OP был неправильным, и сослаться на соответствующие главы руководства.
4. Спасибо. вариант «$ year-$ month-$ day» действительно самый естественный из всех.