Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
14 / 14 / 2
Регистрация: 22.09.2010
Сообщений: 227

Вычитание из переменной

23.04.2012, 23:00. Показов 3647. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код:
PHP
1
2
3
4
5
6
7
8
$db = mysql_connect ("localhost","логин","пасс");
mysql_select_db("база",$db);
mysql_query ("SET NAMES utf8");
$bd = mysql_query("SELECT * FROM birthdays ORDER BY `date` DESC",$db);
 
<?php while($bdrow = mysql_fetch_assoc($bd)) { if($bdrow['date'] == date("d.m")) { ?>
<p>Сегодня у <?php echo $bdrow['name']; ?> день рождения! </p>
<?php } } ?>
В таблице в БД есть 2 столбца — {name} и {date}. Скрипт выводит «Сегодня у {name} день рождения!», если значение {date} равно сегодняшней дате. Прошу помощи в написании условий для вывода таких строк:
«Завтра у {name} день рождения!»,
«Через ## дней у {name} день рождения!» (если до дня рождения меньше 10 дней).

Я себе это представляю примерно вот так:

PHP
1
2
3
4
5
6
7
8
9
10
11
<?php while($bdrow = mysql_fetch_assoc($bd)) { if($bdrow['date'] == date("d.m")) { ?>
<p>Сегодня у <?php echo $bdrow['name']; ?> день рождения! </p>
<?php } } ?>
 
<?php while($bdrow = mysql_fetch_assoc($bd)) { if($bdrow['date'] /* <— здесь должна быть переменная, равная $bdrow['date'] минус один день */ == date("d.m")) { ?>
<p>Завтра у <?php echo $bdrow['name']; ?> день рождения! </p>
<?php } } ?>
 
<?php while($bdrow = mysql_fetch_assoc($bd)) { if($bdrow['date'] == date("d.m") /* <— здесь что-то вроде массива с датами, начиная от $bdrow['date'] минус 10 дней и заканчивая $bdrow['date'] минус 2 дня */) { ?>
<p>Через ## дней у <?php echo $bdrow['name']; ?> день рождения! </p>
<?php } } ?>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2012, 23:00
Ответы с готовыми решениями:

Вычитание массива от переменной
Подскажите почему не вычитает от моей переменной элементы массива a,b,r: array of real; begin c:=1; for j:=k downto 1 do begin...

Вычитание переменной с течением секунды
Добрый день, как отнимать от переменной(int) одно значение в секунду?

Сложение (вычитание) переменной и числовой константы
org 100h mov BX,29h mov AL,X cbw sub BX,AX add BX,Y sub AL,Z cbw add BX,AX

11
 Аватар для shafl
258 / 147 / 37
Регистрация: 24.01.2011
Сообщений: 427
24.04.2012, 09:43
в поле 'date' в таблице, у вас какой тип данных?
0
14 / 14 / 2
Регистрация: 22.09.2010
Сообщений: 227
24.04.2012, 18:14  [ТС]
shafl, сейчас varchar(32)
0
 Аватар для shafl
258 / 147 / 37
Регистрация: 24.01.2011
Сообщений: 427
24.04.2012, 19:34
т.к. запись через точку, разбивайте
PHP
1
$dateArr = explode(".", $bdrow['date'])
теперь в $dateArr[0] у вас месяц, а в $dateArr[1] день рождения, далее сравнивайте с датой, на полное совпадение можно не разбивать, а целиком сравнивать.
1
14 / 14 / 2
Регистрация: 22.09.2010
Сообщений: 227
24.04.2012, 22:14  [ТС]
shafl, спасибо, покопаю в эту сторону.
Цитата Сообщение от shafl Посмотреть сообщение
в $dateArr[0] у вас месяц, а в $dateArr[1] день рождения
наоборот

Добавлено через 37 минут
«Завтра» сделал:
PHP
1
2
3
4
5
6
7
<?php while($bd2row = mysql_fetch_assoc($bd2)) {
$dateArr = explode(".", $bd2row['date']);
$thedaybefore = $dateArr[0] - "1";
if($dateArr[1] == date("m")) {
if($thedaybefore == date("d")) { ?>
<h2>Завтра у <?php echo $bd2row['name']; ?> день рождения!</h2>
<?php } } } ?>
А вот как быть с «Через ## дней»?

Добавлено через 4 минуты
Хм, я не учел, что день рождения может быть 1 числа. Как исправить?

Добавлено через 33 минуты
Проблема решена, всем спасибо.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php while($bd1row = mysql_fetch_assoc($bd1)) {
$dateArr = explode(".", $bd1row['date']);
if($dateArr[1] == date('m')) {
if($dateArr[0] == date('d')) { ?>
<h2>Сегодня у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('tomorrow'))) {
if($dateArr[0] == date('d', strtotime('tomorrow'))) { ?>
<h2>Завтра у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('+2 days'))) {
if($dateArr[0] == date('d', strtotime('+2 days'))) { ?>
<h2>Через 2 дня у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('+3 days'))) {
if($dateArr[0] == date('d', strtotime('+3 days'))) { ?>
<h2>Через 3 дня у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('+4 days'))) {
if($dateArr[0] == date('d', strtotime('+4 days'))) { ?>
<h2>Через 4 дня у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('+5 days'))) {
if($dateArr[0] == date('d', strtotime('+5 days'))) { ?>
<h2>Через 5 дней у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('+6 days'))) {
if($dateArr[0] == date('d', strtotime('+6 days'))) { ?>
<h2>Через 6 дней у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } }
if($dateArr[1] == date('m', strtotime('+7 days'))) {
if($dateArr[0] == date('d', strtotime('+7 days'))) { ?>
<h2>Через 7 дней у <?php echo $bd1row['name']; ?> день рождения!</h2>
<?php } } } ?>
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.04.2012, 22:17
Wir2al, вот так лучше и лишнего писать не надо:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php 
    $db = mysql_connect ("localhost","логин","пасс");
    mysql_select_db("база",$db);
    mysql_query ("SET NAMES utf8");
    $bd = mysql_query("SELECT * FROM birthdays ORDER BY `date` DESC",$db);
 
    $day = date("d"); // Сегодняшний день
    $month = date("m"); // Текущий месяц
    
    while($bdrow = mysql_fetch_assoc($bd)) 
    {
        // Рабзбиваем дату рождения на день и месяц 
        $dateArr = explode(".", $bdrow['date']);
        
        // Отнимаем от дня родения сегодняшнюю дату
        $days = $dateArr[0] - $day;
        
        if( $days == 0 && $dateArr[1] == $month )
        {
            echo "У ".$bdrow['name']." сегодня день рождения!";
        }
        elseif( $days == 1 && $dateArr[1] == $month )
        {
            echo "Завтра у ".$bdrow['name']." день рождения!";
        }
        elseif( $days < 10 && $days > 1 && $dateArr[1] == $month )
        {
            echo "Через ".$days." дней у ".$bdrow['name']." день рождения!";
        }
        elseif( $days < 0 )
        {
            echo "У ".$bdrow['name']." в этом году день рождения прошёл!";
        }
    }
?>
1
14 / 14 / 2
Регистрация: 22.09.2010
Сообщений: 227
24.04.2012, 22:43  [ТС]
Lyodik,
PHP
1
$days = $dateArr[0] - $day;
а если день рождения 1 числа, а сегодня 31? 1 - 31 = -30
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.04.2012, 05:57
Цитата Сообщение от Wir2al Посмотреть сообщение
а если день рождения 1 числа, а сегодня 31? 1 - 31 = -30
Да, всё верно. Сработает этот код:
PHP
1
2
3
4
elseif( $days < 0 )
{
    echo "У ".$bdrow['name']." в этом году день рождения прошёл!";
}
И выведет: У user в этом году день рождения прошёл!
0
 Аватар для shafl
258 / 147 / 37
Регистрация: 24.01.2011
Сообщений: 427
25.04.2012, 07:57
вот так и месяц перелистывать должно
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sql_connect();
$query = "SELECT * FROM birthdays ORDER BY `date` DESC";
$result = mysql_query($query);
$bdrow = mysql_fetch_assoc($result);
$currentDate = explode(".", date('m.d'));
while ($bdrow = mysql_fetch_assoc($result))
    {
    $dateArr = explode(".",$bdrow['date']);
    $days =  (mktime(0, 0, 0, $dateArr[0], $dateArr[1], 0)-mktime(0, 0, 0, $currentDate[0], $currentDate[1], 0));
    if( $days == 0 )
        {
        echo "У ".$bdrow['name']." сегодня день рождения!";
        }
    elseif( $days > 1 && $days < 86401 )
        {
        echo "Завтра у ".$bdrow['name']." день рождения!";
        }
    elseif( $days > 86400 && $days < 777601 )
        {
        echo "Через ".end(explode('.',date("m.d",$days)))." дней у ".$bdrow['name']." день рождения!";
        }
    elseif( $days < 0 )
        {
        echo "У ".$bdrow['name']." в этом году день рождения прошёл!";
        }
    }
1
14 / 14 / 2
Регистрация: 22.09.2010
Сообщений: 227
25.04.2012, 08:37  [ТС]
Lyodik, так это же неправильно. Если сегодня 31 марта, а завтра 1 апреля у юзера день рождения, то на выходе вместо «ДР завтра» будет «ДР в этом году уже был».

Добавлено через 2 минуты
shafl, интересно. Можете объяснить, что это за строчка?
PHP
1
$days =  (mktime(0, 0, 0, $dateArr[0], $dateArr[1], 0)-mktime(0, 0, 0, $currentDate[0], $currentDate[1], 0));
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.04.2012, 08:46
Цитата Сообщение от Wir2al Посмотреть сообщение
Lyodik, так это же неправильно. Если сегодня 31 марта, а завтра 1 апреля у юзера день рождения, то на выходе вместо «ДР завтра» будет «ДР в этом году уже был».
Да, точно не учёл
0
 Аватар для shafl
258 / 147 / 37
Регистрация: 24.01.2011
Сообщений: 427
25.04.2012, 10:13
mktime — Возвращает метку времени Unix для заданной даты
PHP
1
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
часы, минуты, секунды и года нам не нужны, поэтому mktime(0, 0, 0, $dateArr[0], $dateArr[1], 0) - так мы создаём метку времени Unix для дня рождения, и вычитаем созданную таким же методом текущую дату, далее с помощью кода Lyodik определяем что выводить, только время в секундах.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.04.2012, 10:13
Помогаю со студенческими работами здесь

Рекурсия. Сложение и вычитание через сложение/вычитание единицы
Помогите пожалуйста народ!! Задача: Сложение и вычитание через сложение/вычитание единицы :wall:ПоМОГИТЕ

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной, значение переменной как это сделать?

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной, значение переменной как это сделать?

a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b
даны произвольные числа a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b.

Переменной B присвоить первую десятичную цифру переменной A, а переменной С вторую цифру переменной А
Помогите, у меня есть число A = 16,и переменные B и C. Как переменной B присвоить первую цифру переменной A, а переменной С второе число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru