За последние 24 часа нас посетили 18768 программистов и 1607 роботов. Сейчас ищут 909 программистов ...

Арифметические операциисо временем

Тема в разделе "PHP для новичков", создана пользователем gelius, 20 окт 2013.

  1. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    Код (Text):
    1. <?php
    2. header('Content-Type: text/html; charset=UTF-8');
    3.  
    4. $referrer = "domain.com";
    5.  
    6. // Соединяемся, выбираем базу данных
    7. $link = mysql_connect('localhost', 'test_db', 'pass')
    8.     or die('Не удалось соединиться: ' . mysql_error());
    9. echo 'Соединение успешно установлено';
    10. mysql_select_db('test_db') or die('Не удалось выбрать базу данных');
    11.  
    12.  
    13. //Проверка на совпадения
    14. $res = mysql_query("SELECT domain FROM domains WHERE domain = '$referrer'");
    15. if(mysql_num_rows($res) > 0)
    16. {
    17.         echo("такие данные уже есть");
    18.         $res = mysql_query("SELECT time FROM domains WHERE domain = '$referrer'");     
    19.         echo mysql_result($res, 0)."\t"; //Распечатываем поле time
    20.         $dt = mysql_result($res, 0);
    21.         $dt = new DateTime($res);
    22.         $dt->add(new DateInterval('P30S')); //Прибавим к time 30 секунд
    23.         echo $dt . "\n"; //Распечатываем обновленный time
    24.         }
    25. else {          
    26.  
    27. // Заносим данные в базу
    28. $sql = 'INSERT INTO domains(domain, time)
    29. VALUES("'.$referrer.'", NOW())';
    30.  
    31. if(!mysql_query($sql))
    32. {echo '<center><p><b>Ошибка при добавлении данных!</b></p></center>';}
    33. else
    34. {echo '<center><p><b>Данные успешно добавлены!</b></p></center>';}
    35. }
    36.  
    37. // Закрываем соединение
    38. mysql_close($link);
    39.  
    40. ?>
    Говорит:

    В чем ошибка?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    В том, что вы resource функции mysql_query суете в конструктор new DateTime($res);
    DateTime::__construct() expects parameter 1 to be string
    Неужели не понятно написано?
    Вы не понимаете англ.? А переводчик, тоже забыли где находится?(
    Ну а Документация для чего
    public DateTime::__construct() ([ string $time = "now"........
    Какой тип? String правильно, а вы суете тип resource и удивляетесь?
    Пора бы уже мозги включать.
     
  3. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    Ага, незаметил.
    Код (Text):
    1. <?php
    2. header('Content-Type: text/html; charset=UTF-8');
    3.  
    4. $referrer = "domain.com";
    5.  
    6. // Соединяемся, выбираем базу данных
    7. $link = mysql_connect('localhost', 'test_db', 'pass')
    8.     or die('Не удалось соединиться: ' . mysql_error());
    9. echo 'Соединение успешно установлено';
    10. mysql_select_db('test_db') or die('Не удалось выбрать базу данных');
    11.  
    12.  
    13. //Проверка на совпадения
    14. $res = mysql_query("SELECT domain FROM domains WHERE domain = '$referrer'");
    15. if(mysql_num_rows($res) > 0)
    16. {
    17.         echo("такие данные уже есть");
    18.       $res = mysql_query("SELECT time FROM domains WHERE domain = '$referrer'");      
    19.       echo mysql_result($res, 0)."\t"; //Распечатываем поле time
    20.       $dt = mysql_result($res, 0);
    21.       $dt = new DateTime($dt);
    22.       $dt->add(new DateInterval('P30S')); //Прибавим к time 30 секунд
    23.       echo $dt . "\n"; //Распечатываем обновленный time
    24.       }
    25. else {          
    26.  
    27. // Заносим данные в базу
    28. $sql = 'INSERT INTO domains(domain, time)
    29. VALUES("'.$referrer.'", NOW())';
    30.  
    31. if(!mysql_query($sql))
    32. {echo '<center><p><b>Ошибка при добавлении данных!</b></p></center>';}
    33. else
    34. {echo '<center><p><b>Данные успешно добавлены!</b></p></center>';}
    35. }
    36.  
    37. // Закрываем соединение
    38. mysql_close($link);
    39.  
    40. ?>
    Теперь:

     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Может разные имена наконец дашь?

    Добавлено спустя 2 минуты 51 секунду:
    сделай var_dump(new DateTime($dt));
    что показывает?
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Это нормальное явление.
    Здесь переопределение идет.
    gelius,
    Попробуйте без базы данных сделать:
    Код (PHP):
    1. <?php
    2. $date='2000-12-31';
    3. $date=new DateTime($date,new DateTimeZone('Europe/Moscow'));
    4. $date->add(new DateInterval('PT30S'));
    5. echo $date->format('Y-m-d --- H:i:s');
    6. ?>
    И вообще нет new DateInterval('P30S') - такого нету, есть PT30S
    Еще есть DateInterval::createFromDateString.
    Ну и конечно, же вам суда:
    php.net/manual/ru/datetime.formats.php
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Не, нормальное явление когда дают осмысленные имена переменным и поменьше переопределений.
    Тогда код легко читать и поддерживать.
     
  7. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    Выдает:
    Fatal error: Call to undefined method DateTime::add() in /home/hosting/time.php on line 4
    Версия PHP 5.2.17

    Добавлено спустя 8 минут 32 секунды:
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Учись-это лучше чем создавать опять новую объектную переменную.
    Даже не вкурсах, что у вас происходит, но эта ошибка значит, что функция отсутствует.
    Попробуйте процедурный способ, а не объектный.
    Воспользуйтесь алиасом:
    Код (PHP):
    1. date_add($date,new DateInterval('PT30S'));
    Или вообще попробуйте переустановить php на более свежую версию.
    Ну вообще-это уже доступно с 5 версий.
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А если создать что будет процессор взорвется от неожиданности? :)

    Ничего ужасного не будет, но код будет приятней читать.
     
  10. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    В общем проблема. Это работает только с пхп 5.3. Но обновиться на 5.3 не могу т.к. для него нет Zend Optimizer-а, а без него никак. Существует альтернативное решение для арифметических операций со временем?
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. date_default_timezone_set('Europe/Moscow');
    2. $date='2000-12-31'; // 2000-12-31 00:00:00
    3. $date=date('Y-m-d H:i:s',strtotime($date)+30);
    4. echo $date; //2000-12-31 00:00:30  
    Смотря что требуется можно много способов придумать
    Посмотрите аналоги.
     
  12. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    А можно ссылки на аналоги? Ничего подходящего не нашел.
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Что вы вообще хотите сделать? Подробнее опишите задачу.
     
  14. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    Сори, меня не было некоторое время онлайн.
    Задача:
    В бд пишется рефферер и время посещения с данным рефферером. Если с последнего захода с данным рефферером прошло больше n минут, время посещения нужно обновить. Т е для начала мне нужно прибавить к времени прошлого посещения с заданным рефферером n минут, потом сравнить его с текущим временем.
     
  15. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    на стороне PHP можно так:
    Код (PHP):
    1. $ts = strtotime($str) + $n * 60; // получили время как unix timestamp (т.е. в виде колиества секунд)  
    но подозреваю, что и исходные данные и результат все в базе, поэтому вопрос: НАХУА вообще тащить это в PHP?
    у mysql своих операций с датой-временем выше крыши. там добавляйте и там сравнивайте.
    Для примера:
    http://stackoverflow.com/questions/1436827/adding-30-minute ... -php-mysql
     
  16. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  17. gelius

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

    С нами с:
    17 окт 2013
    Сообщения:
    29
    Симпатии:
    0
    разобрался. всем спасибо :)