За последние 24 часа нас посетили 39750 программистов и 3282 робота. Сейчас ищут 1577 программистов ...

Не правильно срабатывает функция

Тема в разделе "PHP для новичков", создана пользователем MrSullex, 23 фев 2016.

  1. MrSullex

    MrSullex Активный пользователь

    С нами с:
    15 сен 2015
    Сообщения:
    122
    Симпатии:
    1
    Почему то не верно срабатывает функция продления сервера. Из выпадающего списка пользователь должен выбрать кол-во месяцев, на сколько он хочет продлить сервер. Однако сколько бы он не выбрал, все равно в базу записывается 1.

    Вот выбор на сколько продлить:

    Код (PHP):
    1. <select class="form-control" id="months" onChange="updatePrice()">
    2.                                 <option value="1">1 месяц</option>
    3.                                 <option value="3">3 месяца (-5%)</option>
    4.                                 <option value="6">6 месяцев (-10%)</option>
    5.                                 <option value="12">12 месяцев (-15%)</option>
    6.                             </select>
    Через эту функцию должно записаться:

    Код (PHP):
    1. $this->serversModel->extendServer($serverid, $months, false);
    Сама функция:

    Код (PHP):
    1. public function extendServer($serverid, $month, $fromCurrent) {
    2.         $sql = "UPDATE `servers` SET server_date_end = ";
    3.         if($fromCurrent)
    4.             $sql .= "NOW()";
    5.         else
    6.             $sql .= "server_date_end";
    7.         $sql .= "+INTERVAL " . (int)$month . " MONTH WHERE server_id = '" . (int)$serverid . "'";
    8.         
    9.         $this->db->query($sql);
    10.     }
    А вот переменная $months, которая (по моему мнению) не передает POST данные в база, а передает только "1".

    Код (PHP):
    1. switch($months) {
    2.                 case "3":
    3.                     // Скидка 5%
    4.                     $months = 3;
    5.                     $price = $price * 0.95;
    6.                     break;
    7.                 case "6":
    8.                     // Скидка 10%
    9.                     $months = 6;
    10.                     $price = $price * 0.90;
    11.                     break;
    12.                 case "12":
    13.                     // Скидка 15%
    14.                     $months = 12;
    15.                     $price = $price * 0.85;
    16.                     break;
    17.                 default:
    18.                     $months = 1;
    19.             }
    20.  
    P.S: пытался в функции менять month на months, не помогает.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Тут выручит отладка:
    http://phpfaq.ru/debug
    https://netbeans.org/kb/docs/php/debugging_ru.html

    Если что-то по ней не понятно, спрашивай, так как ты самостоятельно сможешь находить любые не стыковки.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Посмотрите, что за запрос в итоге формируется, подставьте в phpMyAdmin или другой клиент mysql, посмотрите, на что ругнётся. Ну или используйте аналогичные инструменты для другой БД
     
  4. MrSullex

    MrSullex Активный пользователь

    С нами с:
    15 сен 2015
    Сообщения:
    122
    Симпатии:
    1
    По моему просто не передаеются POST данные. Вот переменная $months
    Код (PHP):
    1. switch($months) {
    2.                 case "3":
    3.                     // Скидка 5%
    4.                     $months = 3;
    5.                     $price = $price * 0.95;
    6.                     break;
    7.                 case "6":
    8.                     // Скидка 10%
    9.                     $months = 6;
    10.                     $price = $price * 0.90;
    11.                     break;
    12.                 case "12":
    13.                     // Скидка 15%
    14.                     $months = 12;
    15.                     $price = $price * 0.85;
    16.                     break;
    17.                 default:
    18.                     $months = 1;
    19.             }
    20.  
    Как видите, "1" там не прописан и только 1 записывается, а остальные нет.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ты это проверил с помощью инструкции по отладке?
     
  6. MrSullex

    MrSullex Активный пользователь

    С нами с:
    15 сен 2015
    Сообщения:
    122
    Симпатии:
    1
    Да. Подтвердилось, срабатывает только default, остальные case почему то игнорируются.
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Что в переменной $months? И откуда она берётся?
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А, ну так это, читаем разницу между name и id в учебнике по html

    Добавлено спустя 3 минуты 17 секунд:
    http://htmlbook.ru/html/attr/id
    http://htmlbook.ru/html/select/name

    Правда ведь, не одно и тоже написано?
     
  9. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Зачем (int)$month? Если в switch она и так int, $months = 3?

    Добавлено спустя 1 минуту 44 секунды:
    Зачем вообще преобразовать $month в число если потом она в строку вставляется "+INTERVAL " . (int)$month . "??
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я думаю для защиты от инъекции. все норм.
     
  11. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Тут не может быть инъекции, так как переменная перебивается в switch, $months = 1; У тебя будет либо число которое ты передал (3, 6, 12) или 1.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну ок, в таком виде да. автор ввел в заблуждение разместив листинг со свичем отдельно от топика. но если свича бы не было - защита от инъекции вполне годная.