• Как организовать связь "родительской" таблицы с 2мя одинаковыми наборами данных в "дочерних"?

    Decadal
    @Decadal
    Сделайте промежуточную таблицу с ключами id_a, id_b1, id_b2. У вас появится сущность, которая описывает сложную связь между А и B, только учтите симметричность id_b1 id_b2
    Ответ написан
  • Почему две параллельные транзакции не блокируют друг друга?

    Decadal
    @Decadal
    думаю, идею можно подсмотреть здесь: dr-magic.blogspot.com/2010/01/3.html
    и ещё один ресурс: https://msdn.microsoft.com/ru-ru/library/aa0416cz(...
    то есть, при сохранении нужно сначала проверить, совпадает ли версия записи, которая бралась транзакцией в начале, с версией, которая на сервере сейчас. Если нет - повторно совершать транзакцию с обновлёнными данными.
    в Gii, генераторе для yii2, есть даже поле под такие потребности - lock называется.

    Также, если говорить конкретно про вашу ситуацию, можно переопределить ActiveQuery - чтобы он выполнял апдейт в таком стиле -
    UPDATE Table1 Set Col1 = :new_val1, lock = :old_lock + 1
    WHERE (lock = :old_lock)
    Ответ написан
  • Как составить кросс-доменный запрос?

    Decadal
    @Decadal
    ajax работает для кросс-доменных запросов только если на сервере стоит Access-Control-Allow-Origin - * заголовок.
    можете убедиться, что проблема именно в этом, открыв консоль браузера и посмотрев на лог ошибок. Вам придётся задействовать back-end, скорее всего.
    Ответ написан
    Комментировать
  • Как защититься от mysql запросов?

    Decadal
    @Decadal
    Если вам тематика не интересна, то просто оберните все переменные, которые передаются в запрос, функцией mysqli_real_escape_string();
    Если интересна - вперёд, к PDO
    *ой, у вас mysql, господи. Тогда mysql_real_escape_string();
    но это очень грустно, да
    Ответ написан
    5 комментариев
  • VK API photos.saveWallPhoto возвращает Invalid hash. Что не так?

    Decadal
    @Decadal
    Постит сам себе на стену фотку.
    VK.Api.call('photos.getWallUploadServer', {}, function (answer) {
        up_url = answer.response.upload_url; // получаем upload_url, куда загружать фото
        $.ajax({
            'type': 'POST',
            'url': apiPoint + '/post-send', //экшн моего сервера, ниже приведу его текст
            data: {
                link: up_url, 
                file: fileName //имя файла, который я хочу загрузить в вк. Лежит на моем сервере
            },
            success: function (request) {
                request = JSON.parse(request);// параметры для сохранения
                //  request.user_id = response.session.mid; 
                VK.Api.call('photos.saveWallPhoto',  // сохраняем
                    request, // передаем параметры полученные от post + uid_того_кому_отправляешь
                    function (result) { // данные о сохраненном фото
                        console.log(result.response[0].id);
                        VK.Api.call('wall.post', // постим на стену
                            { 
                                //   owner_id : result.response[0].owner_id,
                                attachments: result.response[0].id,
                                message: inputedTxt
                            }, 
                            function (r) {
                                if (r.error) {
                                    console.log(r.error);
                                    return false;
                                }
                            });
                    }
                );
            }
        });
    });


    public function actionPostSend() // это то что было в js как apiPoint + '/post-send'
        {
            $this->returnFormatJson(); //выставляю возвращаемый формат
            $fileName = $this->getRequest('post','file'); // принимаю имя файла
            $curl = new CurlHelper();
            $rez = $curl->sendFile([
                'url' => $this->getRequest('post','link', ''),
                'file' => $this->userUpload . DIRECTORY_SEPARATOR . $fileName //физический путь к файлу
            ]);
            return (isset($rez["html"]))
                ? $rez["html"]
                : false;
        }


    пардон, что пришёл с этим своим php.
    Надеюсь, поможет.
    Ответ написан
  • При сохранение в базу - сохраняет знаки ????? а не кириллицу?

    Decadal
    @Decadal
    $mysqli->set_charset("utf8")
    указывается ли кодировка для базы данных (если не используется фреймворк)?
    убедитесь, что кодировка при соединении с базой данных тоже задаётся и что таблицы ей соответствуют.
    JavaScript работает только в utf8. К слову, если вывести полученные данные в php, вы сразу увидите, портит ли их JavaScript или они попадают на сервер целыми, а портятся уже в самой бд.
    Ответ написан
    5 комментариев
  • Как выкачивать страницы второго уровня simple_html_dom.php?

    Decadal
    @Decadal
    //в теле цикла
    $linkPage = file_get_html($element->href);
    // и лучше сделать рекурсивно - оформить парсинг страниц как функцию, принимающую html и кинуть этот контент в неё же 
    //а это для решения вашей задачи
    file_put_contents(<хэш имени файла>, $linkPage);

    если вам нужно спарсить не только страницу, но и всё, на что ссылается целевая страница, то лучше использовать cURL. По крайней мере, если уровень вложенности будет больше двух.
    Ответ написан
    Комментировать
  • Как исправить ошибку в phpmyadmin?

    Decadal
    @Decadal
    Права на базу данных opencart отсутствуют у того юзера, под которым вы залогинены
    Зайдите под юзером с правами или переназначьте их на этого пользователя
    Ответ написан
    Комментировать
  • Как сказать серверу, что все абсолютные пути должны начинаться с текущей директории?

    Decadal
    @Decadal
    опция DocumentRoot определяет где лежат файлы для веб доступа. Обычно эта опция находится в файле:
    /etc/apache2/httpd.conf или /etc/apache2/apache.conf
    если её там нет, то добавить в файл конфигурации строку
    DocumentRoot "C:/Sites/home/localhost/www"
    или
    DocumentRoot "/var/www/your_domain/a/b"
    после чего перезагрузить апач
    возможно, это подойдёт для решения вашей проблемы
    Ответ написан
    3 комментария
  • Правильно ли я делаю подзапрос?

    Decadal
    @Decadal
    upd: Убери as x и лишние скобки. должно быть in (запрос).
    Ответ написан
  • Чем отличается Riot.js от react.js?

    Decadal
    @Decadal
    Ответ написан
    Комментировать
  • Как реализовать следующее в JS?

    Decadal
    @Decadal
    (".open-1").click(function() {
       var opened = $(this).data("opened"),
       $bTag = $("b");
       if(opened)
       {
          $(this).html("+");
          $bTag.fadeIn(0);
          $(this).data("opened","");
       }
       else 
       {
          $(this).html("-");
          $bTag.fadeOut(0);
          $(this).data("opened","1");
       }
        $(".answer-one").slideToggle();
      })

    но учтите, что при использовании нескольких элементов такого вида вы должны оборачивать каждый элемент в некоторый родительский контейнер, и указывать родителя при работе с тегом b. На данный момент код, который подхватывает "b", будет работать со всей страницей вообще.

    каждая конструкция такого вопроса должна представлять из себя следующее:
    <div class="quest-content">
    <div class="open">+</div>
    <b>Вопрос? </b>
    <div class="answer">Всплывающий текст-подсказка</div>
    </div>


    тогда вы сможете создать несколько экземпляров (просто копировать-вставить разметку выше), задать в каждом - свой текст, вопрос и прочее, и написать общий код:

    (".open").click(function() {
       var opened = $(this).data("opened"),
       $parent = $(this).parent(".quest-content"),
       $bTag = $parent.find("b");
       if(opened)
       {
          $(this).html("+");
          $bTag.fadeIn(0);
          $(this).data("opened","");
       }
       else 
       {
          $(this).html("-");
          $bTag.fadeOut(0);
          $(this).data("opened","1");
       }
        $parent.find(".answer").slideToggle();
      })


    это, наверное, плохо оптимизировано, но должно работать.
    Ответ написан
    5 комментариев
  • Кнопка показать больше, как сделать что бы скрывала только часть текста?

    Decadal
    @Decadal
    А вы сделайте блок, в который не всё влазит. CSS-класс с конкретной высотой и overflow-y: hidden;
    По нажатию на "показать всё" CSS-класс удалять, и блок сам развернётся "во весь рост".
    Ответ написан
  • Готовый плагин vs самописный костыль?

    Decadal
    @Decadal
    Ответ на ваш вопрос зависит от контекста применения того или иного решения. Работаете ли вы над проектом сам или командой? Документируете ли свои костыли или такой привычки не имеете? Может возникнуть потребность отдать все исходники кому-то, или приобщить юниора к сопровождению вашей системы, и всякое такое.
    Слишком мало сказано, чтобы дать вам конкретный ответ.
    Если над проектом работает больше одного человека или проект в перспективе будет развиваться, просто используйте плагин. Гибкость это вклад в будущее.
    Если вы решите, что ваш костыль достаточно прост, юзабелен, понятно описан, а в будущем быстро и безболезненно может быть заменён на плагин, оставьте костыль.
    Ответ написан
    Комментировать
  • Будет ли выполнятся PHP скрипты при закрытие веб страницы?

    Decadal
    @Decadal
    1) Браузер или его альтернатива отправляет запрос на сервер. 2) Сервер обрабатывает запрос (этот момент и есть началом работы php-скрипта). 3) Сервер возвращает ответ на запрос (факт отправки ответа говорит о том, что php-скрипт прекратил своё выполнение, т.е., результатом выполнения php-скрипта есть ответ браузеру).

    Если вы не дождались ответа от сервера и покинули страницу, но скрипт ещё выполнялся, то он продолжает своё выполнение до тех пор, пока не превысит лимит отведенного времени либо пока не выполнится, но вы результат выполнения словить уже не сможете. При возврате на страницу запустится тот же скрипт в другом потоке, с самого начала.
    А то, о чем пишите вы, не означает, что php-скрипту обязательно работать всё то время, которое пользователь не находится на связи. Непрерывное выполнение сценария это уже в сторону веб-сокетов.
    Ответ написан
    Комментировать
  • Пустой аргумент в методе?

    Decadal
    @Decadal
    учитывая то что по умолчанию в функции render $actionData = [], вы подразумеваете, что это нормально. Нет возможности выбирать, какому параметру оставлять значение по умолчанию, а какому присваивать, поэтому выживаем как можем
    upd:
    если вас этот факт смущает, сделайте часть параметров передаваемыми через ассоциативный массив.
    и будет у вас
    function render($actionView, $params = []) {
    // понеслось 
     $actionData = (isset($params["actionData"]) && $params["actionData"]) 
     ? $params["actionData"]
    : [];
    //и тд
    }
    Ответ написан
    Комментировать
  • Подойдет ли Флэнаган книг для js?

    Decadal
    @Decadal
    если вы про ту, которая на 1000+ страниц, то она не скоро устареет, но изучение js лучше начать с электронных ресурсов наподобиe https://learn.javascript.ru/
    Флэнаган скорее как справочник хорош.
    Ответ написан
    Комментировать
  • Не работает preventDefault Что я неправильно сделал?

    Decadal
    @Decadal
    https://jsfiddle.net/0mn1L72m/

    Всё нормально работает. Скорее всего, у вас в другой части JavaScript есть ошибка, которая не позволяет выполнить данный фрагмент кода, и вас кидает по ссылке как обычно.
    Ответ написан
  • Как добавить переменные в модель формы?

    Decadal
    @Decadal
    Модель описывает структуру сущности как таковой. Если вы извлекаете все записи из БД, то формируете массив данных, описывающих одну и ту же сущность. Поэтому для обработки массива нужно создать другую модель, которая будет содержать в себе массив Names, и вот уже в него будут попадать ваши чекбоксы. Кстати, было бы проще вам помочь, если бы вы сказали, что делает форма на главной.

    Во вьюхе, чтобы передать массив данных, нужно рендерить что-то вроде <input name="names[]" type="checkbox">
    в цикле
    как сделать это в стиле yii2, не знаю, не задавался вопросом (кстати, yii в теги)
    upd:
    Вот и вопрос, как добавлять в модель формы эти переменные?

    ещё раз: эти переменные не требуют того, чтобы быть описаными в модели поимённо, поскольку смыславая нагрузка у них одна и та же - это значения поля "name".
    Поэтому хранить их следует в другой модели, у которой есть поле names, обозначающее массив имён. Тогда ваш вопрос уйдёт в сторону от создания динамической модели с полями на основе данных, и упрётся только в рендер чекбоксов из массива данных и передачу массива в поле модели.
    Ответ написан
    1 комментарий
  • Форма обратной связи на php работает не корректно. В чем может быть проблема?

    Decadal
    @Decadal
    собственно, я не нашел даже где используется номер телефона при обработке запроса. Как будто он там никогда не был нужен, но вот понадобился, и его добавили на клиент-сайд, а про сервер забыли.
    Либо вы пытались передать телефон слитно с сообщением? для этого стоит писать разные имена для элементов форм, иначе $_POST["txtDescription"] будет содержать значение только того элемента с именем "txtDescription", который встретился самый крайний раз.

    upd:
    собственно, что делать:
    в первую очередь, исправляем
    <input name="txtDescription" id="txtDescription" class="form-control" placeholder="89651572788" required  title="89651572788" />

    вот эту штуку, а конкретнее: name="txtDescription"
    мы заменяем на name="phone"
    все, теперь клиент будет кидать на сервер данные с телефоном.
    В серверной части:

    $strMessage = nl2br($_POST["txtDescription"]);  
    //после этой строки добавляем следующее:
    $phone = $_POST["phone"]; 
    // тут желательно пихнуть регулярку для проверки телефона, но если вы не поняли, что это значит, не обращайте внимания.


    Все, на сервере теперь есть информация о телефоне. Главный вопрос: что с ней делать?

    можно прикрепить к письму, после текста:
    $strMessage.= "<br /> Обращаться по телефону: ". $phone; 
    //это добавлять сразу после $phone = $_POST["phone"];


    можно прикрепить к теме:

    $strSubject.= " связь: ".$phone;
    и тому подобные действия, смотря что вам нужно
    Ответ написан
    3 комментария