We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 9675
    • 63 Posts
    Вопрос, возможно, не вполне по MODx, но таки есть задача извлечь пользователей с сегодняшней датой рождения.

    Извлекаем данные пользователей следующим запросом:
    SELECT 
    wu.id AS 'id', wu.username AS 'username', wua.fullname AS 'fullname', wua.surname AS 'surname', wua.email AS 'email', 
    IF(wua.gender = 1,'', 
    IF(wua.gender = 2,'','-')) AS 'gender', 
    IF(wua.blocked,'','-') AS 'blocked', wua.phone, 
    IF(wua.mobilephone = '', '-', wua.mobilephone) AS mobilephone, 
    IF(wua.fax = '', '-', wua.fax) AS fax, 
    IF(wua.dob = 0, '-', DATE_FORMAT(FROM_UNIXTIME(wua.dob), '%d.%m')) AS dob,
    IF(wua.empdate = 0, '-', DATE_FORMAT(FROM_UNIXTIME(wua.empdate), '%d.%m.%Y')) AS empdate, 
    IF(wua.photo='', 'assets/templates/front/images/nophoto.gif', wua.photo) AS photo, 
    wua.comment, wua.education, wua.hobby, wua.experience 
    FROM `intinkoff`.`modx_web_users` wu 
    INNER JOIN `intinkoff`.`modx_web_user_attributes` wua ON wua.internalKey = wu.id


    Все отлично извлекается и в поле dob дата рождения в формате "dd.mm". Такой запрос:
    SELECT DATE_FORMAT(NOW(), '%d.%m')

    возвращает текущую дату в том же формате "dd.mm".

    Но! Закой запрос:
    SELECT 
    wu.id AS 'id', wu.username AS 'username', wua.fullname AS 'fullname', wua.surname AS 'surname', wua.email AS 'email', 
    IF(wua.gender = 1,'', 
    IF(wua.gender = 2,'','-')) AS 'gender', 
    IF(wua.blocked,'','-') AS 'blocked', wua.phone, 
    IF(wua.mobilephone = '', '-', wua.mobilephone) AS mobilephone, 
    IF(wua.fax = '', '-', wua.fax) AS fax, 
    IF(wua.dob = 0, '-', DATE_FORMAT(FROM_UNIXTIME(wua.dob), '%d.%m')) AS dob,
    IF(wua.empdate = 0, '-', DATE_FORMAT(FROM_UNIXTIME(wua.empdate), '%d.%m.%Y')) AS empdate, 
    IF(wua.photo='', 'assets/templates/front/images/nophoto.gif', wua.photo) AS photo, 
    wua.comment, wua.education, wua.hobby, wua.experience 
    FROM `intinkoff`.`modx_web_users` wu 
    INNER JOIN `intinkoff`.`modx_web_user_attributes` wua ON wua.internalKey = wu.id
    WHERE dob LIKE DATE_FORMAT(NOW(), '%d.%m')

    Не возвращает ничего не смотря на то, что в базе есть пользователи с днем рождения сегодня.

    Господа, где же ошибка?
      • 785
      • 2,113 Posts
      Не вникая в суть, в одном случае DATE_FORMAT используется в SELECT, а в другом - в WHERE, так что сравнивать запросы вряд ли надо.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 9675
        • 63 Posts
        Если не хотите вникать, то лучше ничего не пишите — я тут, между прочим, сижу волнуюсь...

        Поясню. DATE_FORMAT(NOW(), ’%d.%m’) возвращает правильную дату. Поле dob - тоже содержит правильную дату. Но сравниваться они нормально не хотят. В чем дело - не понятно. LIKE не работает. ’=’ использовать нельзя ибо вся строка WHERE передается в сниппет в качестве параметра, а парсер MODx парсит параметры по знаку ’=’; так или иначе с ’=’ запрос тоже не работает... smiley
          • 785
          • 2,113 Posts
          А зачем мне вникать? Работает и не работает - совершенно разные примеры. Сначала сделайте соответствующие примеры и убедитесь, что в однотипных вариантах не работает.
            Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
            Статьи о MODx, регулярно новые публикации
            • 785
            • 2,113 Posts
            А вообще-то лучше на форум по MySQL обратиться - там с большей вероятностью разберуться.
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 9675
              • 63 Posts
              Даже если написать такого вот монстра (т. е. повторить все преобразования, какие есть в SELECT, но с текущей датой):
              WHERE dob LIKE DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), '%d.%m')

              все равно не работает
                • 785
                • 2,113 Posts
                А если что-то вроде
                SELECT dob, DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), ’%d.%m’) AS date WHERE dob LIKE date
                  Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                  Статьи о MODx, регулярно новые публикации
                  • 9675
                  • 63 Posts
                  Ура!. Вот так.
                  Т. е. надо работать не с полем конечной таблицы, а с полем исходной...

                  SELECT 
                  wu.id AS 'id', wu.username AS 'username', wua.fullname AS 'fullname', wua.surname AS 'surname', wua.email AS 'email', 
                  IF(wua.gender = 1,'', 
                  IF(wua.gender = 2,'','-')) AS 'gender', 
                  IF(wua.blocked,'','-') AS 'blocked', wua.phone, 
                  IF(wua.mobilephone = '', '-', wua.mobilephone) AS mobilephone, 
                  IF(wua.fax = '', '-', wua.fax) AS fax, 
                  IF(wua.dob = 0, '-', DATE_FORMAT(FROM_UNIXTIME(wua.dob), '%d.%m')) AS dob,
                  IF(wua.empdate = 0, '-', DATE_FORMAT(FROM_UNIXTIME(wua.empdate), '%d.%m.%Y')) AS empdate, 
                  IF(wua.photo='', 'assets/templates/front/images/nophoto.gif', wua.photo) AS photo, 
                  wua.comment, wua.education, wua.hobby, wua.experience 
                  FROM `intinkoff`.`modx_web_users` wu 
                  INNER JOIN `intinkoff`.`modx_web_user_attributes` wua ON wua.internalKey = wu.id
                  WHERE DATE_FORMAT(FROM_UNIXTIME(wua.dob), '%d.%m') LIKE DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), '%d.%m')


                  Ну епт...

                  Таким образом мы имеем сниппет, который возвращает пользователей по условию и шаблонизирует данные:
                  <?php
                  /**/
                  	$sql =	"SELECT wu.id AS 'id', wu.username AS 'username', wua.fullname AS 'fullname', wua.surname AS 'surname', wua.email AS 'email', IF(wua.gender = 1,'".$_lang['user_male']."', IF(wua.gender = 2,'".$_lang['user_female']."','-')) AS 'gender', IF(wua.blocked,'".$_lang['yes']."','-') AS 'blocked', wua.phone, IF(wua.mobilephone = '', '-', wua.mobilephone) AS mobilephone, IF(wua.fax = '', '-', wua.fax) AS fax, IF(wua.dob = 0, '-', FROM_UNIXTIME(wua.dob, '%d.%m')) AS dob, IF(wua.empdate = 0, '-', FROM_UNIXTIME(wua.empdate, '%d.%m.%Y')) AS empdate, IF(wua.photo='', 'assets/templates/front/images/nophoto.gif', wua.photo) AS photo, wua.comment, wua.education, wua.hobby, wua.experience".
                  			" FROM ".$modx->getFullTableName("web_users")." wu " . 
                  			" INNER JOIN ".$modx->getFullTableName("web_user_attributes")." wua ON wua.internalKey = wu.id";
                  	
                  	$parameter = array('id', 'surname', 'fullname', 'phone', 'dob');
                  	$field = array('wu.id', 'wua.surname', 'wua.fullname', 'wua.phone', 'DATE_FORMAT(FROM_UNIXTIME(wua.dob), \'%d.%m\')');
                  	
                  	if (isset($where)) $sql .= ' WHERE ' . $where;
                  	else {
                  		$p = 0;
                  		for($i = 0; $i < count($parameter); $i++) {
                  			if (isset($$parameter[$i])) {
                  				if($p == 0) $sql .= ' WHERE ';
                  				else $sql .= ' AND ';
                  				$sql .= $field[$i] . ' LIKE ' . $$parameter[$i];
                  				$p++;
                  			}
                  		}
                  	}	
                  	
                  	$result = $modx->dbQuery($sql);
                  	$output = (!$results)? $noResults : '';
                  	while ($row = $modx->fetchRow($result)) {
                  		$row = ($position != '')? array_merge($row, array('position'=>$position)) : $row;
                  		$output .= $modx->parseChunk($tpl, $row, '[+', '+]');
                  	}
                  	return $output;
                  ?>


                  Там запрос для моей подправленной таблицы, но вернуть все в зад не составит труда.
                  И вот такой страшноватый вызов
                  [!User? &dob=`DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), '%d.%m')` &tpl=`dob_tpl`!]


                  Может кому пригодится...