Ответы пользователя по тегу PHP
  • Как в выборке yii2 работать с дополнительными полями и связанными моделями?

    v3shin
    @v3shin Автор вопроса
    Веб-шаман
    Так как задача была срочной, сделал свою кривую кастомку, позволяющую управлять выборками полей. Я воспользовался тем фактом, что при отдаче ответа в формате Response::FORMAT_JSON для каждой модели вызывается toArray() без параметров, что, в свою очередь, опирается на fields().
    class MyActiveRecord extends \yii\db\ActiveRecord
    {
        public static $usedExtraFields = [];
        public static function getExtraFields(): array
        {
            return [];
        }
        public static function useExtraFields(?array $keys = null): void
        {
            if (($keys[0] ?? null) === '*') $keys = null;
            static::$usedExtraFields[static::class] = $keys;
        }
        public function fields(): array
        {
            $extraFields = static::getExtraFields();
            if ((static::$usedExtraFields[static::class] ?? null) !== null) {
                $extraFields = ArrayHelper::filter($extraFields, static::$usedExtraFields[static::class]);
            }
            return array_merge(parent::fields(), $extraFields);
        }
    }
    
    // классы наследуются от MyActiveRecord и перегружают getExtraFields()
    class MyClass extends MyActiveRecord
    {
        public static function getExtraFields(): array
        {
            return [
                'param' => 'param',
                'child' => static function ($model) {
                    return $model->getSubClass()->select('c')->one();
                },
            ];
        }
    }
    
    // используется это так:
    Yii::$app->response->format = Response::FORMAT_JSON;
    MyClass::useExtraFields([]); // запретить дополнительные поля
    MyClass::useExtraFields(['param']); // ограничить дополнительные поля
    MyClass::useExtraFields(['child']); // ограничить дополнительные поля
    MyClass::useExtraFields(); // разрешить все дополнительные поля
    $models = MyClass::find()->where(...)->all();
    return [
        'models' => $models,
    ];

    Но все еще в поиске элегантного решения.
    Ответ написан
    Комментировать
  • Как реализовать генератор title заголовков на PHP?

    v3shin
    @v3shin
    Веб-шаман
    По идее, после того, как система разобралась с url'ом, она должна передавать управление обработчику, в котором уже можно определять title. В частном случае это представлено в схеме MVC (Model-View-Controller): в контроллере есть action'ы, в которых подтягиваются данные моделей и передаются в представления (читай: шаблоны страниц). Вот в этих action'ах обычно описывается, каким образом формируется title, который потом передается в представление.
    Ответ написан
    Комментировать
  • Помогать в regex можете?

    v3shin
    @v3shin
    Веб-шаман
    Есть два стула:
    $a = "[480p]\/storage\/458f706a\/hls\/stream_2.m3u8,[720p]\/storage\/458f706a\/hls\/stream_1.m3u8,[1080p]\/storage\/458f706a\/hls\/stream_0.m3u8";
    preg_match_all('/(\[480p\].*?),/', $a, $m);
    var_dump($m[1][0]);

    $a = "[480p]\/storage\/458f706a\/hls\/stream_2.m3u8,[720p]\/storage\/458f706a\/hls\/stream_1.m3u8,[1080p]\/storage\/458f706a\/hls\/stream_0.m3u8";
    $a = explode('[480p]', $a);
    if (isset($a[1])) {
    	$a = explode(',', $a[1]);
    	var_dump('[480p]' . $a[0]);
    }
    Ответ написан
    Комментировать
  • Как замокать внутренние вызовы методов?

    v3shin
    @v3shin Автор вопроса
    Веб-шаман
    Всем спасибо за участие. Мой косяк: я указал functionToTest() статической. Переписал все на обычные методы - тесты заработали.
    Ответ написан
    Комментировать
  • Ошибки в плагине WordPress при переходе с PHP 7.4 на 8.1. Как их исправить?

    v3shin
    @v3shin
    Веб-шаман
    Красота. Прямо как будто отображение ошибок включили, и тут все посыпалось. =)
    Пишет, что:
    $_REQUEST["wpc_random_total"], $_REQUEST["wpc_random_number1"] и $_REQUEST["wpc_random_number2"] не заданы, а к ним идет обращение.
    sanitize_text_field($this->wpc_string()) в этом случае возвращает не число, а потом в плагине происходит сложение двух не чисел.
    Вот тут php сдается и выдает Fatal error.
    Отключите этот плагин или обновите до совместимого с php 8.1.
    Ответ написан
  • Как в yii2 сделать очень сложный where запрос?

    v3shin
    @v3shin
    Веб-шаман
    Попробуйте:
    eventsSeances.id IS NULL = ['eventsSeances.id' => null]
    eventsSeances.id IS NOT NULL = ['<>', ['eventsSeances.id' => null]]
    Ответ написан
    Комментировать
  • Как из текстового файла вывести 15 случайных строк?

    v3shin
    @v3shin
    Веб-шаман
    $arrLength = count($arr);
    $lines = [];
    while (count($lines) < 15) {
    	$n = mt_rand(0, $arrLength-1);
    	$lines[$n] = $n;
    }
    ksort($lines);
    var_export($lines); // номера нужных строк

    Ну, и запилите проверку на количество строк в файле, чтобы не улететь в бесконечный цикл.
    Ответ написан
  • Можно ли использовать код PHP в таблице mysql?

    v3shin
    @v3shin
    Веб-шаман
    Можно, но не нужно. Простой контрпример: у вас в БД данные 10к человек и тут меняется сценарий обработки их сценариев. А у каждого пользователя свой код в БД. Удачного исправления! =)
    Поэтому в БД лучше писать указания к действию, а обрабатывать их уже на php.
    Ответ написан
    Комментировать
  • Строка из БД как условие сравнения в if?

    v3shin
    @v3shin
    Веб-шаман
    Можно как-то так, в зависимости от вашего кода и нужд:
    if ($row['compareSign'] === '<=') {
        return $a <= $b;
    } elseif ($row['compareSign'] === '>') {
        return $a > $b;
    }
    Ответ написан
    Комментировать
  • Как задать set_time_limit для одного php в nginx?

    v3shin
    @v3shin
    Веб-шаман
    ini_set('max_execution_time', 60);
    Ответ написан
    Комментировать
  • Как добавить selected, при выборе option?

    v3shin
    @v3shin
    Веб-шаман
    <option value="<?= $modell ?>" <?= $modell === $someValue ? 'selected' : '' ?>>

    Но, черт, побери, уберите логику от представления и перепишите код для защиты от sql-инъекций.
    Ответ написан
    Комментировать
  • Как сделать запись и получение данных?

    v3shin
    @v3shin
    Веб-шаман
    Каким образом здесь утроена структура бд?

    Произвольным. Здесь, похоже, вы видите результат какой-то выборки.

    Какой тип имеют поля address, company?

    String. А данные - либо array, либо stdClass, смотря как делали json_decode().

    Как мне их записать в бд

    Получить id нужных пользователей, затем сделать один insert для создания задачи и еще один insert для связывания задачи с пользователями.
    Но при чем тут задачи и пользователи, если разговор идет про адреса и компании?

    получать их в таком виде

    Один запрос на задачу и один запрос на ее пользователей. На php сформировать массив в нужном формате.
    Технически, запрос можно сделать один на все данные, но данные будут избыточны.
    Ответ написан
    Комментировать
  • Не получается написать нормальный SQL запрос в Yii2?

    v3shin
    @v3shin
    Веб-шаман
    Сделайте наподобие:
    Course::find()
        ->alias('course')
        ->select('course.name, lesson.name, theme.name')
        ->leftJoin(['lesson' => Lesson::tableName()], 'lesson.course_id = course.id')
        ->leftJoin(['theme' => Theme::tableName()], 'theme.lesson_id = lesson.id')
        ->where(['theme.id' => $theme_id])
        ->asArray()
        ->all();

    Что же до геттеров, то у вас с ними какая-то логическая проблема: выбираете модель по id, а потом сортируете ее одну и возвращаете all(). Сортировку можно убрать и возвращать one().
    Ответ написан
  • Как конвертировать png в webp без белого фона?

    v3shin
    @v3shin Автор вопроса
    Веб-шаман
    Разгадка оказалась проста и заковыриста. На проекте для генерации изображений разных размеров использовались две библиотеки: встроенная gd и yii\imagine. В некоторых случаях изображение генерировалось напрямую через gd - тогда фон получался прозрачным. А в некоторых - через yii\imagine, и тогда фон получался белым. Проблема решилась установкой прозрачного фона по умолчанию:
    yii\imagine\Image::$thumbnailBackgroundAlpha = 0;
    Ответ написан
    Комментировать
  • Как отсортировать массив в php?

    v3shin
    @v3shin
    Веб-шаман
    function transpose($array) {
        array_unshift($array, null);
        return call_user_func_array('array_map', $array);
    }
    $array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
    var_dump(call_user_func_array('array_merge', transpose(array_chunk($array , 6))));
    Ответ написан
    2 комментария
  • Как исправить ошибку?

    v3shin
    @v3shin
    Веб-шаман
    У вас $_SESSION['games'] = null, о чем и написано в тексте ошибки.
    if (in_array("футбол", $_SESSION['games'] ?? []))
    Ответ написан
    Комментировать
  • Как отсортировать массив?

    v3shin
    @v3shin
    Веб-шаман
    Извращение, конечно, но я бы сделал так:
    $ar1 = [
    	['a' => 1, 'b' => 2],
    	['a' => 2, 'b' => 11],
    	['a' => 3, 'b' => 12],
    ];
    $ar2 = [
    	['a' => 1, 'b' => 2],
    	['a' => 2, 'b' => 11],
    	['a' => 3, 'b' => 13],
    ];
    
    $hashedArray1 = [];
    foreach($ar1 as $ar) {
    	$hashedArray1[json_encode($ar)] = $ar;
    }
    $hashedArray2 = [];
    foreach($ar2 as $ar) {
    	$hashedArray2[json_encode($ar)] = $ar;
    }
    var_dump(array_intersect_key($hashedArray1, $hashedArray2));
    Ответ написан
  • Как достать переменную из объекта?

    v3shin
    @v3shin
    Веб-шаман
    preg_match('/\'ru\' => \'(.*?)\'/', $row->CustomSettings, $match);
    var_dump($match[1]);
    Ответ написан
  • Вывести другое значение если оно пустое?

    v3shin
    @v3shin
    Веб-шаман
    'TEXT' => PT_ShortText($post->text ?: $post->description, 190),
    Ответ написан
    Комментировать
  • Как реализовать поиск по файлу?

    v3shin
    @v3shin
    Веб-шаман
    $lines = file($pathToFile);
    $lineIds = [];
    foreach ($lines as $line) {
        if (strpos($line, $word) !== false) {
            $lineIds[] = explode('<|>', $line)[0];
        }
    }
    var_dump($lineIds);
    Ответ написан
    7 комментариев