• Как в ссылке на картинку добавить размер?

    @dtBlack
    Обычно стоит указывать о чем конкретно вы спрашиваете, правильно заданный вопрос уже, как минимум, половина ответа... Стоило бы указать что это yii2...

    <?= Html::img("@web/images/products/{$hit->img}", ['alt' => $hit->name])?>


    Стоит поинтересоваться что такое ['alt' => $hit->name]... Полезно почитать документацию...

    Решить задачу можно добавив в этот массив класс и задав в CSS размеры, или напрямую прописать стиль.

    <?= Html::img("@web/images/products/{$hit->img}", ['alt' => $hit->name,  'style' => ['width' => '100px', 'height' => '100px'], 'class' => 'my_img'])?>
    Ответ написан
    Комментировать
  • Как перенести форму на свой сайт, но отправлять данные на их JS/PHP?

    @dtBlack
    Самый простой способ это изучить это. А более сложные способы, я думаю не стоит и рассматривать, так как они по сложности сопоставимы с написанием такого калькулятора.

    Только учти некоторые сайты защищают свой контент от встраивания и тогда просто не получится.
    Ответ написан
    Комментировать
  • Как вывести посты в разных местах на странице, используя цикл только 1 раз?

    @dtBlack
    get_post возвращает вам массив.
    Сколько раз его крутить в цикле не имеет значения, так же как не имеет значения в каком из типов циклов будет идти работа, тем более по задаче for подходит больше.
    Но в вашем случае при фиксированном количестве позиций вывода цикл не обязателен.
    Можно обращаться к элементам напрямую:
    $args = array('posts_per_page' => 13, 'order' => 'desc');
    $myposts = get_posts( $args ); 
    
    ......
    
    if (isset($myposts[0])){
       //выводим первый пост $myposts[0]
    }

    Из минусов некрасивый код на выходе, но из плюсов предельная простота.

    Для написания более компактного кода можно воспользоваться функциями для работы с массивами, а конкретно array_slice, и уже над полученными в итоге массивами работать с foreach .

    $mypost1 = array_slice($myposts, 0, 4);
    $mypost2 = array_slice($myposts, 4, 3);
    $mypost3 = array_slice($myposts, 7, 6);
    
    if (!empty($mypost3)){
      foreach ($mypost3 as $post){
        //вывод поста
      }
    }
    Ответ написан
  • Зависимые таблицы Yii2, как обходится без дополнительной модели?

    @dtBlack
    Ваш вопрос очень сложен для понимания.
    Как я понял вам хочется писать короче и понятней?
    Тем более для избежания ошибок вероятно придется писать не $item->book->title, а что то похожее на !empty($item->book)?$item->book->tytle:''

    Я так понимаю проблема у тебя в построении модели и возможно не знание что такое hasMany и hasOne (ссылку на документацию и примеры использования обсуждали на этом же сайте), а так же возможно вам не известно такое явление как магические методы, и конкретно __get ().

    Так что у тебя должно быть что то примерное:
    class Genre extends ActiveRecord
    {
        public function getBooks()
        {
            return $this->hasMany(Book::className(), ['id' => 'book_id'])
                ->viaTable('genre_book', ['genre_id' => 'id']);
        }
    }

    И тогда у тебя в атрибуте $genre->books будет список книг по этому жанру.
    Ответ написан
  • Как лучше хранить информацию об авторизованном пользователе?

    @dtBlack
    1. Хранить в сессии обычно будет экономичней.
    2. Сказать что то про нагрузку по вашим вводных ничего нельзя. Я тут поправил структуру кода и данных на одном из рабочих сайтов, а то на одной страничке со списком было 8000+ запросов, при каждом показе. После правки кода удалось сократить до 12 запросов. и при этом сайт заметно не тормозил, просто сервер мощный и кушал этот мусор довольно легко.
    2.1 Сказать что то о нагрузке так же нельзя не зная тип сайта и интенсивность его использования, например на сайте онлайн библиотеки-читальни, в среднем, 1000 пользователей онлайн создаст намного меньше нагрузки, чем на сайте магазина, в котором будет постоянное шастанье по товарам.
    3. Никогда не делайте так:
    потом выводить как $_SESSION['user_avatar']


    сделайте функцию обертку, например:
    class Session {
        
        public static function getAvatar(){
            if (!isset($_SESSION['user_info']['user_avatar'])){
                $_SESSION['user_info'] = $this->controller->user->getProfileInfo(Session::getUserId());
            }
            return $_SESSION['user_info']['user_avatar'];
        }
    }

    И использовать уже Session::getAvatar().
    Такой подход позволит вам более гибко управлять данными, например организовать устаревание информации о пользователе по таймеру и тп.
    Ответ написан
    Комментировать
  • $_SESSION отчистка кеша требуется?

    @dtBlack
    Я так понимаю, что вы используете Laravel?

    Я не знаком с ним, но мой опыт подсказывает, что вы поздно меняете шаблон, то есть в данном рендеринге информация уже была использована старая, а новая начнет использоваться со следующего процесса рендеринга страницы, как у вас и получается.

    То есть присваивать $_SESSION['skin']='faq'; вам нужно не в шаблоне, а до начала вывода данных (рендеринга страницы).
    Или если вы любите костыли, то сделайте ручное обновление страницы после присвоения редиректом или как вам удобно...
    Ответ написан
  • Как передавать значение чекбоксов и выбранных файлов на почту?

    @dtBlack
    Есть несколько замечаний:
    1. Узнайте что такое $_REQUEST
    2. Присмотритесь к именам полей ввода в верстке, разберитесь что значит name="file[]" и что в итоге будет в поле $_POST['file'].
    spoiler
    Там будет массив, на что указывают [] в имени

    3. Обрабатывайте все данные пришедшие от пользователя, и только потом используйте.
    4. Познакомьтесь с функцией print_r или var_dump для просмотра того что у вас в переменой. print_r будет полезней из-за второго параметра.

    Насчет спама, все очень сложно, нужно читать про фильтры спама и тп. Так же полезно поискать такую информацию на этом сайте. Например IP адрес вашего сайта может быть в черном списке спамеров, что часто бывает на недорогих хостингах.
    Ответ написан
    Комментировать
  • Как решить задачу с параллельной обработкой данных?

    @dtBlack
    Вариантов решения, на скорый взгляд, я вижу два:
    1. Создать таблицу(массив) блокировок, то есть при начале обработки данных пользователя добавляем его в таблицу блокировки. по окончанию удаляем. При выборе задания пропускаем те на пользователе которого есть блокировка. Из минусов, возможно придется городить костыль для пропуска элемента в списке, я с redis-ом не работал.
    1.1. то же самое, что и 1, но не пропускать, а взять данные и ждать удаления пользователя из блокировки. Из минусов, потеря времени на ожидании, зато без костылей.
    2. Уйти от очереди данных, к очереди пользователей. То есть одномерной очереди к "двумерной очереди". Первый минус, придется менять логику и тд., а второй то что в итоге вместо очереди мы получим какую то дикость и redis возможно уже не подойдет. :)
    Ответ написан
    Комментировать
  • Возникла проблема с запросом к бд, в чем проблема?

    @dtBlack
    $hash = $query->fetch_assoc()['password'];
    $query = mysqli_fetch_assoc($query);

    Уточните в первую очередь, что вы пытаетесь получить этими строками кода? Зачем вызывать одно и тоже в двух разных формах?

    Так же вопрос к именованию переменных, что происходит по коду с $query?

    Что вам мешает вызвать один раз $data = $query->fetch_assoc() и далее работать с $data.

    Подумайте внимательно что происходит при первом вызове fetch_assoc() и повторном вызове?

    Возможно раньше работало так как у вас было две записи возвращаемых запросом а теперь одна?
    Ответ написан
    9 комментариев
  • Как после "10" вызовов function write() в сек, блокировать её на "10мин"?

    @dtBlack
    Примерный код для ограничения по пользователю на сервере:
    На стороне браузера примерно то же самое но использовать куки
    //Проверяем наличие блокировки и время с ее выставления
            //В $_SESSION['blocked-write'] храним время выставления блокировки
            $time = time();
            if (isset($_SESSION['blocked-write']) && $_SESSION['blocked-write'] > 0){
                if (($time - $_SESSION['blocked-write'] <= 600)){
                    return null;
                }else{
                    $_SESSION['blocked-write'] = 0;
                }
            }
            //$_SESSION['time-write'] - храним секунду для которой считаем количество
            //$_SESSION['count-write'] - количество срабатываний
            //Проверили какую секунду считаем
            if ($_SESSION['time-write'] == $time){
                $_SESSION['count-write']++;
                if ($_SESSION['count-write'] >= 10){
                    $_SESSION['blocked-write'] = $time;
                }
            }else{
                $_SESSION['time-write'] = $time;
                $_SESSION['count-write'] = 1;
            }


    PS: Вместо сессии можно использовать любое хранилище, хоть файл)
    Ответ написан
    Комментировать
  • Не могли бы вы ,уважаемые пользователи, помочь с заданием по php?

    @dtBlack
    Я как понимаю отсортировать одноуровневый массив у вас не вызывает трудностей?
    Так почему тогда не использовать рекурсивный вызов такой функции? Тем более в первом примере рекурсия используется.

    Простой пример с методом пузырька будет выглядеть так:
    function mySort($array){
        // перебираем массив
        for ($j = 0; $j < count($array) - 1; $j++){
            for ($i = 0; $i < count($array) - $j - 1; $i++){
                // если текущий элемент больше следующего
                if ($array[$i] > $array[$i + 1]){
                    // меняем местами элементы
                    $tmp_var = $array[$i + 1];
                    $array[$i + 1] = $array[$i];
                    $array[$i] = $tmp_var;
                }
            }
        }
        //Производим сортировку во вложенных массивах, по необходимости можно выполнить перед основной сортировкой
        foreach ($array as $key => &$item){
            if (is_array($item)){
                $item = mySort($item);
            }
        }
        return $array;
    }
    $arr = array(7,9,8,array(3,2,1),1,2,3,4,5,6);
    print_r(mySort($arr));


    Все кроме строк:
    foreach ($array as $key => &$item){
            if (is_array($item)){
                $item = mySort($item);
            }
        }

    является реализацией метода пузырька.

    PS: для реализации сортировки вложенных уровней достаточно слегка изменить пример с quicksort, но я думаю автор это сделает самостоятельно...
    Ответ написан
    Комментировать