2015 — Web-coding

LoadeR 2 июня 2015

Очень просто можно скопировать данные из одного столбца в базе Mysql в другой

Например есть два солбца в таблице table_A - 'field1' - заполненный данными и 'field2' пустой, такой же структуры, как и 'field1'. Выполняем следующий запрос :

UPDATE `table_A` SET `field2` = `field1`;

Если надо видоизменить данные в столбце 'field2', например, добавить в начало строки какие-то символы - напрмер 'new_' то пишем так

UPDATE `table_A` SET `field2` = CONCAT('new_',`field1`);
Теги: Mysql

LoadeR 5 мая 2015

Как-то пришлось заниматься "извлечением" данных из таблицы заказов (пусть это будет таблица orders) за разные промежутки времени, выбираемые администратором. Интервалы были такими : За сегодня, За вчерашний день, За текущий календарный месяц, За прошлый месяц, За текущий год, За прошлый год. Поскольку в таблице было поле 'order_time' с временем заказа, в формате Date-Time, нужно было подготовить примерно такой sql запрос :

SELECT 'Что-то' FROM `orders` WHERE `order_time` BETWEEN '$start' AND '$stop';

Где $start и $stop соответственно время начала и конца запрашиваемого интервала в формате метки времени

к примеру так с "2013-04-12 00:00:00" по "2013-05-12 23:59:59"

Поскольку интервал, выбираемый админом, планировался посылатьcя в базу AJAX-ом (а сердцем любого AJAX является javascript), написал коротенький скрипт, вычисляющий нужные интервалы исходя из текущего времени. Может кому пригодиться.....

Итак, собственно, скрипт и пояснения: (тут приведен .html вариант для запуска в браузере и просмотра результатов в отладочной консоли). Сначала создаем обьект Date и назначаем ему переменную current_time, которая становиться обьектом со своими свойствами. Поскольку обьект создан без параметров,

то он возвращает текущее время. Обращаясь к свойствам этого обьекта : getFullYear - получаем текущий год из четырех цифр, getMonth - текущий месяц и getDate - текущую дату, все это назначаем соответствующим переменным:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Временные интервалы</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="JavaScript">
<!--
current_time = new Date();
var current_year = current_time.getFullYear();
var current_month = current_time.getMonth();
var current_date = current_time.getDate();

Начнем с интервала за сегодня, - тут все просто "склеиваем" текущую дату с началом дня - "00:00:00" и с его завершением "23:59:59". Конструкция console.log() вставлена для отладки и в реальном скрипте естественно не присутствует.

    //За сегодня
var start = +current_year+'-'+current_month+'-'+current_date+' 00:00:00';
console.log('сегодня старт '+start);
var stop = +current_year+'-'+current_month+'-'+current_date+' 23:59:59';
console.log('сегодня стоп '+stop);

За вчера, - тут создаем новый обьект Date, но уже с параметрами - текущий год, текущий месяц и текущая дата минус 1 что дает вчера -)). Дальше опять склейка с часами и минутами, начала и конца дня

    //вчера
var yesterday = new Date(current_year,current_month,(current_date-1));
var start = +yesterday.getFullYear()+'-'+(yesterday.getMonth()+1)+'-'+yesterday.getDate()+
' 00:00:00';
    console.log('вчера старт '+start);
    var stop = +yesterday.getFullYear()+'-'+(yesterday.getMonth()+1)+'-'+yesterday.getDate()+
    ' 23:59:59';
console.log('вчера стоп '+stop);

Текущий календарный месяц - создаем снова обьект Date с параметрами текущий год, текущий месяц +1(так как отсчет месяцев идет с нуля), и,наконец, число 1 - первое число месяца. Дальше опять склейка с временем часы,минуты.

    //первый день текущего месяца
var first_current_month_day = new Date(current_year,current_month,1);
    // текущий месяц
var start = +first_current_month_day.getFullYear()+'-'+(first_current_month_day.getMonth()+1)
+'-'+first_current_month_day.getDate()+' 00:00:00';
console.log('текущий месяц '+start);
var stop = +current_year+'-'+(current_month+1)+'-'+current_date+' 23:59:59';
console.log('Текущий месяц '+stop);

Прошлый месяц тут сначала ничего необычного - новый обьект Date с параметрами текущий год, текуший месяц минус 1,что относит нас в прошлый месяц и первое число прошлого месяца опять единица -)).

    //прошлый месяц
    //первый день прошлого месяца
var last_month_first_day = new Date(current_year,(current_month-1),1);
var start = +last_month_first_day.getFullYear()+'-'+(last_month_first_day.getMonth()+1)+'-'
+last_month_first_day.getDate()+' 00:00:00';
console.log('первый день прошлого месяца '+start);

И, вот затем, начинается самое интересное - вычисление того, сколько дней в прошлом месяце. Ведь оно, это число, все время разное и зависит от месяца и года (высокосного например).Приведенное тут решение не мое, нашел его, как всегда, в паутине интернета, но оно мне понравилось своей изящностью. Дело в том, что если в качестве аргумента в обьект Date ввести заведомо несуществующее значение, например, дату 32 в месяце, которой не существует, то этот обьект вернет дату начала следующего месяца со сдвигом на столько дней, на сколько мы "ошиблись". Так и поступим, подав в качестве аргументов во вновь создаваемый обьект, текущий год, прошлый месяц и 32-е его число!!! .Осталось вычесть из одного другое - и вот , правильное число дней в месяце. Медитируем.....

    //вычисляем сколько дней в прошлом месяце
var day_count = 32 - new Date(current_year,(current_month-1), 32).getDate();
var stop = +last_month_first_day.getFullYear()+'-'+(last_month_first_day.getMonth()+1)+'-'
+day_count+' 23:59:59';
console.log('последний день прошлого месяца '+stop);

Дальше все очень просто, и после предыдущих строк, обьяснять то нечего, за исключением того, что месяцы считаются с нуля и 0 - это январь а 11 - декабрь. В самом конце завершаем наш скрипт и в тэге body пишем коротенькую памятку. Осталось соединить все куски кода этого поста в один .html файл и запустить в браузере. Я проверял интервалы, меняя системную дату назад и вперед, вроде, все определяется верно. Может кто заметит неточность - пишите.

    //первый день текущего года
var first_current_year_day = new Date(current_year,0,1);
    // текущий год
var start = +first_current_year_day.getFullYear()+'-'+(first_current_year_day.getMonth()+1)
+'-'+first_current_year_day.getDate()+' 00:00:00';
console.log('первый день текущего года '+start);
var stop = +current_year+'-'+(current_month+1)+'-'+current_date+' 23:59:59';
console.log('последний день текущего года '+stop);
    //прошлый год
    //первый день прошлого года
var first_last_year_day = new Date((current_year-1),0,1);
var start = +first_last_year_day.getFullYear()+'-'+(first_last_year_day.getMonth()+1)+'-'
+first_last_year_day.getDate()+' 00:00:00';
console.log('первый день прошлого года '+start);
var stop = +first_last_year_day.getFullYear()+'-'+(new Date((current_year-1),11,31).getMonth()+1)
+'-'+new Date((current_year-1),11,31).getDate()+' 23:59:59';
console.log('последний день прошлого года '+stop);
-->
</script>
</head>
<body>
Откройте консоль, чтобы прочитать временные интервалы :<br />
FireFox,Chrome - F12<br />
Opera - Ctrl+Shift+i - консоль
</body>
</html>
Теги: javascript

LoadeR 17 апреля 2015

Пришлось решать следующую задачу: на странице редактирования свойств товара добавить дополнительную характе-
ристику, с возможностью выбора значения с помощью <select> и после выбора записать значение в базу к новому
свойствуву товара. Конструкция была самая простая :

<select form = "product-settings-form" name = "product_type">
        <option value = "0"> 0 - Без Акции</option>
        <option value = "1"> 1 - Акция 1</option>
        <option value = "2"> 2 - Акция 2</option>
        <option value = "3"> 3 - Акция 3</option>
        <option value = "4"> 4 - Акция 4</option>
</select>

И все бы ничего, но на этой странице уже присутствовали другие поля с редактированием других различных св-в товара,
и если администратор, войдя на страницу редактирования свойств товара, изменит какую-нибудь другую характеристику,
и нажмет сохранить - то в базу, помимо прочего, запишется значение моего селекта по умолчанию ( у меня это было 0),
которое перепишет предидущее установленное значение , если оно отлично от 0. Пришлось думать, как выставлять в
селекторе по умолчанию ту величину, которая записана в базе, для предотвращения данной коллизии .
На помощь пришел добрый javascript c Jquery.

Присваиваем нашим элементам идентификаторы - <select> обзываем id = "sel", а каждому <option> даем id из цифры,
склеенной со словом "opt" id = "0opt" ("1opt") и т.д . Подключаем библиотеку jquery-1.11.1.min.js ( в данном случае идет
речь о Shop-Script 3 c шаблонизатором Smarty), которая лежит у меня в каталоге js/jquery скриптов SC3 и за обращение к
данному каталогу отвечает константа Smarty - {$smarty.const.URL_JS} . И далее, либо добавляем в существующий, либо
пишем свой короткий скриптик, включающий обработку поступивших значений из базы. В данном случае используется
свойство product_type обьекта смарти product , которое было создано добавлением в таблицу товаров нового
поля - product_type и может принимать значения 0,1,2,3,4.
Логику получения значения поля из базы конструируйте сами, какую захотите -)). Важно то, что в переменную
optinon_select надо записать это значение. Затем с помощью свойства attr обьекта, который нам вернет
$("#"+option_select+"opt"), мы установим нужный нам option в select.

<script type="text/javascript" src="{$smarty.const.URL_JS}/jquery/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
var option_select = {$product.product_type};/*записываем в переменную 0 либо 1,2,3,4 из базы*/
    $(document).ready(function(){literal}{{/literal}/* {literal} нужны тут из-за smarty*/
    $("#"+option_select+"opt").attr("selected","selected");
    {literal}}{/literal});
</script>
<select id = "sel" form = "product-settings-form" name = "product_type">
        <option id = "0opt" value = "0"> 0 - Без Акции</option>
        <option id = "1opt" value = "1"> 1 - Акция 1</option>
        <option id = "2opt" value = "2"> 2 - Акция 2</option>
        <option id = "3opt" value = "3"> 3 - Акция 3</option>
        <option id = "4opt" value = "4"> 4 - Акция 4</option>
</select>
Теги: javascript

LoadeR 9 апреля 2015

В базе данных WA3.0 есть основополагающая таблица SC_division в которой описаны разделы и их иеархия

Надо было добавить в раздел администрирования, в подраздел отчеты (did->103), новый модуль. Добавил , поставил приоритет "самый самый" - установив поле "xPriority" на большую величину, чем у одноклассников. Он стал показываться среди доступных модулей первым слева, но, при загрузке родительского раздела "Отчеты" все равно по умолчанию считывался раздел "отчет о продажах " sale-report (did ->165).

надо было у родительского ему раздела "отчеты" (did->103) изменить поле "xLinkDivisionUKey" c "sale_reports", которое прописывается в поле "xUnicKey" у каждого раздела ( и у did->165 , было "sale-reports" ) на свое новое поле. И вопрос снялся... -))


<img src="http://www.localpost.ru/wa-data/public/blog/img/sql.png">
Теги: WEBASYST 3.0

LoadeR 1 марта 2015

Эта простая функция преобразует формат цвета HEX в RGB

<?php
function hex_to_rgb($color)    { // на вход подается строка вида #47a847
    if ($color[0] == '#')//Если будем подавать на вход без #
    $color = substr($color, 1);//То эти две строки убираем
    if (strlen($color) == 6)      // Если длина HEX 6 символов
    list($r, $g, $b) = array($color[0].$color[1],
                                     $color[2].$color[3],
                                     $color[4].$color[5]);
    elseif (strlen($color) == 3) // Если длина HEX 3 символа
    list($r, $g, $b) = 
    array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
    else
    return false;
$r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
    $rgb = array($r, $g, $b);
    $rgb_css = $rgb[0].",".$rgb[1].",".$rgb[2];
    return ($rgb_css); // на выходе получаем 71,168,71
    }
?>
Теги: PHP

LoadeR 24 февраля 2015

Както разбирался, что "хочет" один php сценарий от базы -)), и лень было в куче кода искать место , где формируется запрос и выводить его. Поскольку дело было на локалке и, к серверу mysql обращался только тестируемый мной скрипт ( и больше ничего ), решил временно включить лог запросов к серверу Mysql. Пишет он кстати очень понятно ,с временем запроса.Пишет в файл, который Вы ему укажите. Я выбрал путь и файл С:\mysql.log ( Дело было на windows и закапываться глубже не хотел -)) )

Ищем в каталоге с установленным Mysql файл настроек my.ini и добавляем в конец его инструкцию

log = C:\mysql.log

Не забываем после исследований поставить перед этим решетку # для отключения логов. А то диск C:\ очень быстро заполниться....

# log = C:\mysql.log
Теги: Mysql

LoadeR 24 февраля 2015

Тем, кто поднял Mysql на локалке в Windows ,будет полезно знать команды остановки и запуска снова демона mysqld

конечно можно через список процессов в диспетчере задач - но когда их много, то совсем не удобно

Итак остановка сервера

Windows+R NET STOP MYSQL

Запуск сервера (загрузка с новыми параметрами, если Вы меняли my.ini )

Windows+R NET START MYSQL

LoadeR 28 января 2015

Столкнулся с некорректной версткой у одного заказчика, состоящей в том что строка
поиска "наезжала" на модуль корзины, причем проявлялось это только в браузере FireFox.
Во всех других все было нормально.
Нашел решение с помощью этого хака @-moz-document url-prefix ()

 .input-group{
 position:relative;
 display:table;
 border-collapse: separate
 }
 @-moz-document url-prefix(http://sait.ru/){
 .input-group{
 position:relative;
 display:table;
 border-collapse:separate;
 margin-top:100px}
 }

На названия классов и свойства не обращаем внимание - главное тут то, что класс input-group
полностью копируется ниже, и в него добавляется дополнительное св-во margin-top ,
которое сдвигает вниз на 100px класс "input-group"(в данном случае класс строки поиска)
и это св-во будет применятся только тогда, когда на sait.ru зайдут через браузер Mozilla. Важно написать после url-prefix в скобках название ресурса и обратить внимание на две скобки
{.input-group{*****************}}

P.S

@-moz-document url— задает url страницы, к которой применяются стили

@-moz-document url-prefix — задает url, с которого начинаются все страницы, к которым применяются стили

@-moz-document domain — задает адрес домена, ко всем страницам которого применяются стили

В моем случае я выбрал "все страницы" sait.ru

Теги: CSS