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

    HeadOnFire
    @HeadOnFire Куратор тега WordPress
    PHP, Laravel & WordPress Evangelist
    <?php the_field('important__title', $post->ID); ?>

    Функция the_field() принимает 2 параметра - название поля и ID объекта, которому это поле принадлежит (выборка значения из БД происходит по этим 2м параметрам). Если второй параметр не указать, то ACF попытается использовать ID глобального $post. И если делать это в рамках стандартного цикла WordPress Loop, то это всегда будет работать как положено, отсюда привычка вызывать the_field() без второго параметра. Но у вас нету глобального цикла, соответственно глобальная $post - скорее всего вообще пуста. Поэтому вам нужно принудительно передать ID нужно поста, в данном случае - 34, если поле принадлежит записи которую вы получали выше. Если же должно принадлежать глобальной записи - не используйте переменную $post.
    Ответ написан
  • Как сделать бота, который будет оформлять покупки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Мне кажется лучше сразу писать бота, который поедет в Китай, откроет там свою фабрику, которая будет фигачить нужные товары по прямому заказу мимо АлиЭкспресс, в идеале так чтоб заказ отправить можно было силой мысли. И при этом доставка бесплатная будет и вообще товар бесплатно - ведь фабрика то своя! Реально ли такое осуществить? Если да, то как, напишите пожалуйста в комментах.
    Ответ написан
  • Как исправить эту ошибку?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проблема в области видимости - переменная $mysqli недоступна в функции fakePayout(). Решается одним из способов:

    1. Явной передачей переменной внутрь функции function fakePayout($mysqli, ...) {
    2. Корректным доступом к данной переменной, поместив ее в свойство класса, содержащего функцию fakePayout():
    class SomeClass 
    {
        private $mysqli;
    
        public function __construct(DataBase $mysqli)
        {
            $this->mysqli = $mysqli;
        }
    
        public function fakePayout($user, $amount, $time)
        {
            // Теперь можно использовать
            $this->mysqli->query()
        }
    }

    3. Вариации #2 с dependency injection контейнерами, фасадами и прочее.

    ЗЫ: Можно еще внутри самой функции создавать соединение, или хранить его в глобальной переменной / синглтоне - но это уже совсем дичь.
    Ответ написан
  • Где могут быть заданы перенаправления сайта на другой домен?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Конфиг сервера. Это может быть .htaccess в корне проекта, а также кконфигурация самого virtual host. Еще вполне может оказаться что перед Apache стоит Nginx, тогда смотреть и его конфиг.
    2. Если п.1 мимо - смотрим wp-config.php, константы WP_HOME и WP_SITEURL
    3. Если п.2 мимо - константы не определены, то смотрим в базу данных, таблица wp_options, опции с такими же названиями (только в нижнем регистре).
    4. Если и в БД все ок, пробуем добавить выше упомянутые константы в конфиг и указать там нужные значения.
    5. Если это все не помогло - ищем по всему коду слово redirect.
    Ответ написан
  • Почему не работает elseif в цикле?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы не можете прерывать поток if/elseif/else циклом for. В данном случае elseif перестает быть веткой логики if, а становится самостоятельной веткой внутри for, соответственно должен быть записан как if.
    Ответ написан
  • Как изменить счетчик автоматического увеличения в MySQL на php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Как изменить счетчик автоматического увеличения в MySQL

    ALTER TABLE table_name AUTO_INCREMENT = value;

    на php?

    Выполнить этот запрос из PHP.
    Ответ написан
  • Стоит ли указывать, что свойство - массив?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я следую такой логике:

    - $var; если свойство будет инициализировано при создании (конструктор, boot и тд)
    - $var = null; если свойство хранит значение по умолчанию, которое не требует инициализации. С точки зрения языка это идентично предыдущему варианту, но видя явное = null я понимаю, что именно это значение будет у конкретного экземпляра. Просто упрощает чтение кода.
    - $var = []; вариант предыдущего, задает дефолтное значение которое поможет в дальнейшем избежать проверки is_array и дает возможность со старта юзать array_push например. Упрощает код. Ну и PhpStorm ругнется сразу если я попытаюсь в эту переменную записать данные другого типа.

    Последние 2 правила касаются не только null и array, но и других типов.
    Ответ написан
  • Как правильно избавиться от дублирования при описании структуры массива?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если это нужно только для подсказок в PhpStorm, то я бы рекомендовал использовать плагин deep-assoc-completion и не заморачиваться с docblock.
    Ответ написан
  • Как лучше хранить изображений? Одна папка или много?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Это называется "отношение 1 к многим", оно же one to many, оно же 1:n. На уровне базы данных выглядит так:

    Таблица tasks:
    - id
    - ...

    Таблица photos:
    - id
    - task_id (foreign key)
    - ...

    Все фотографии для конкретного задания получаются запросом:
    SELECT * FROM photos WHERE task_id=X

    В каких папках их хранить на самом диске - вопрос отдельный и по большому счету несущественный.
    Ответ написан
  • Как решить правильно простенькую задачку по php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    // По вашему коду:
    $source_string = 'abcdefghijklmnopqrstuvwxyz';
    $string_randomized = str_shuffle($source_string); // Перетасовали буквы внутри строки
    echo substr($string_randomized, 0, 6); // Вывели первые 6, без повторений и каждый раз после str_shuffle - уникально-рандомно (относительно, но задача именно этого и требует)
    
    // По красоте:
    $characters = 'abcdefghijklmnopqrstuvwxyz';
    echo substr(str_shuffle($characters), 0, 6);
    
    // Тестируем в psych:
    >>> $characters = 'abcdefghijklmnopqrstuvwxyz';
    => "abcdefghijklmnopqrstuvwxyz"
    >>> echo substr(str_shuffle($characters), 0, 6);
    fzpvad
    >>> echo substr(str_shuffle($characters), 0, 6);
    bzeiyj
    >>> echo substr(str_shuffle($characters), 0, 6);
    pgkuaq
    >>> echo substr(str_shuffle($characters), 0, 6);
    otjszx
    >>> echo substr(str_shuffle($characters), 0, 6);
    zjwaox
    >>> echo substr(str_shuffle($characters), 0, 6);
    rxuhnv
    >>> echo substr(str_shuffle($characters), 0, 6);
    rihoec
    >>> echo substr(str_shuffle($characters), 0, 6);
    uwdfgn
    >>>
    Ответ написан
  • Как правильно написать формулу для вывода элементов на экран?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для работы с кратностью есть такая штука как remainder или modulus. Тут подробнее. Условно проверка if ( $var % 6 ) возвращает 0 если переменная $var делится на 6 без остатка (то есть кратна 6). Все это есть и в документации PHP в разделе про арифметические операторы.
    Ответ написан
  • Как вывести список всех таблиц MySQL и количество строк в каждой из них впри помощи PHP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    SHOW TABLES FROM database_name прекрасно работает когда база не выбрана. Здесь мы показываем таблицы в базе, а не в $db_table. Исходя из вашего нейминга, вы просите таблицу показать ее таблицы, что абсурдно само по себе. Обращайтесь к базе. Или, если вы базу предварительно уже выбрали, то достаточно SHOW TABLES.

    Далее, для SELECT * FROM table_name уже сначала нужно выбрать базу данных (которую вы опрашивали на предмет таблиц в первом запросе), или же обращаться к таблице в формате database_name.table_name.

    Ну и, вместо того чтобы делать выборку всех строк со всеми колонками, спросите сразу SELECT COUNT(*) FROM database_name.table_name.

    Еще проще и быстрее это сделать с помощью такого запроса:

    SELECT table_name, table_rows
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'your_database_name';


    Результат этого запроса:

    +-----------------------+------------+
    | table_name            | table_rows |
    +-----------------------+------------+
    | wp_terms              |         10 |
    | wp_yoast_seo_meta     |         61 |
    | wp_yoast_seo_links    |         33 |
    | wp_commentmeta        |          0 |
    | wp_term_taxonomy      |         10 |
    | wp_ewwwio_queue       |        352 |
    | wp_usermeta           |        114 |
    | wp_options            |        281 |
    | wp_users              |          5 |
    | wp_term_relationships |         49 |
    | wp_ewwwio_images      |       1048 |
    | wp_links              |          0 |
    | wp_postmeta           |      21408 |
    | wp_termmeta           |          0 |
    | wp_comments           |          0 |
    | wp_posts              |        738 |
    +-----------------------+------------+


    Единственное, что нужно учесть - если таблицы у вас InnoDB, то данные цифры будут более-менее точными, но не совсем. В силу механизмов оптимизации. Так что если нужно "приблизительно" понимать - используйте данный метод. Если нужно с точностью до одной строки - тогда COUNT.

    Ну и еще можно сделать SHOW TABLE STATUS, находять в выбранной базе данных. Точность подсчета количества строк на InnoDB такая же, как и предыдущем методе, но зато здесь будет еще много полезной информации. Например - avg_row_length, data_length, index_length и другое.
    Ответ написан
  • Как определить переменную в зависимости от размера картинки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я бы определил пороговые значения, при которых считаем изображение "квадратным" и сверял с ними:

    // Пороговые значения
    $min_ratio = 0.8;
    $max_ratio = 1.2;
    
    // Берем изображение и получает размеры
    $image = "image/{$result['image']}";
    $image_size = getimagesize($image);
    
    // Определяем соотношение сторон c точностью до 1 знака после запятой
    $ratio = round($image_size[0] / $image_size[1], 1);
    
    // Определяем "квадратное" наше изображение или нет
    if( ($min_ratio <= $ratio) && ($ratio <= $max_ratio) ) {
    	dump( 'Оно квадратное!' );
    } else {
    	dump( 'Фигушки.' );
    }
    Ответ написан
  • Где найти расположение конфигурации php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В терминале php -i | grep php.ini покажет где лежит файл конфигурации.

    Но в вашем конкретном случае все серьезнее - для того чтобы письма не падали в спам недостаточно сказать sendmail от чьего имени вы отправляете. С имейлами все уже давно намного сложнее чем 20 лет назад. Нужна конфигурация на уровне DNS - SPF, DKIM, DMARC и вот это все. Гуглите и курите мануалы.
    Ответ написан
  • Лучший способ генерации текста?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Имхо, если уж писать свой велосипед, достаточно будет:
    1. Выберите один и тот же формат, фигурные {} значит везде фигурные, квадратные [] - значит везде квадратные.
    2. Вхождения ищите простой регуляркой.
    3. Найденные вхождения токенизируйте и выполняйте свою логику.
    Но лучше возьмите готовое решение, они есть. Вот быстрый поиск на packagist.org выдал:
    https://packagist.org/packages/aymanrb/php-unstruc...
    https://packagist.org/packages/zualex/parsertext
    и еще десятки либ.
    Ответ написан
  • Вернуть старую версию wordpress и php?

    HeadOnFire
    @HeadOnFire Куратор тега WordPress
    PHP, Laravel & WordPress Evangelist
    Во-первых, вы путаете версии движка PHP и движка WordPress. Это разные версии и их обе откатывать не нужно. Во-вторых, вероятнее всего вам вообще ничего не надо откатывать, а нужно устранить PHP Warning, то есть ошибку в коде, которая вызывает это сообщение. И хотя на первый взгляд ошибка ведет в wp-includes/blocks.php:183, в реальности наверняка она выше по стеку. Нужно смотреть все сообщение об ошибке целиком, включая Stack Trace.
    Ответ написан
  • Как лучше организовать код?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А я бы посоветовал начать с изучения концепта DDD - Domain Driven Design. Это позволит уложить в голове структуру по части бизнес логики и как это натянуть на код. А уже организация в конкретном фреймворке - дело второе.
    Ответ написан
  • Как отсортировать массив?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Функция uksort()

    // Берем входящий массив:
    $input = [
      [
    	  'gq_address'     => '188.120.254.140',
    	  'gq_hostname'    => '•   RGPlay | DarkRP [Быстрая загрузка]',
    	  'gq_maxplayers'  => 128,
    	  'gq_numplayers'  => 0,
    	  'gq_online'      => true,
    	  'gq_port_client' => 27015,
      ],
      [
    	  'gq_address'     => '62.109.18.242',
    	  'gq_hostname'    => 'Default Breach Server',
    	  'gq_maxplayers'  => 128,
    	  'gq_numplayers'  => 0,
    	  'gq_online'      => true,
    	  'gq_port_client' => 27015,
      ],
    ];
    
    // Определяем желаемый порядок ключей:
    $order = [
    	'gq_hostname',
    	'gq_address',
    	'gq_port_client',
    	'gq_online',
    	'gq_numplayers',
    	'gq_maxplayers',
    ];
    
    // Перебираем элементы входящего массива и сортируем их по ключам:
    $output = array_map( function($array) use ($order)
    {
            // Эта функция сортирует по ключам
    	uksort( $array, function($a, $b) use ($order)
    	{
    		$a_desired_position = array_search($a, $order, true);
    		$b_desired_position = array_search($b, $order, true);
    
                    // Вот тут вся магия:
                    // нужно вернуть отрицательное число, 0 или положительное число, 
                    // в зависимости от положения одного элемента относительно другого.
    		return $a_desired_position - $b_desired_position;
    	} );
    
    	return $array;
    }, $input );
    
    var_dump($input);
    var_dump($output);


    Вот что мы получаем в итоге:

    // Входящий массив:
    array:2 [▼
      0 => array:6 [▼
        "gq_address" => "188.120.254.140"
        "gq_hostname" => "•   RGPlay | DarkRP [Быстрая загрузка]"
        "gq_maxplayers" => 128
        "gq_numplayers" => 0
        "gq_online" => true
        "gq_port_client" => 27015
      ]
      1 => array:6 [▼
        "gq_address" => "62.109.18.242"
        "gq_hostname" => "Default Breach Server"
        "gq_maxplayers" => 128
        "gq_numplayers" => 0
        "gq_online" => true
        "gq_port_client" => 27015
      ]
    ]
    // Отсортированный массив:
    array:2 [▼
      0 => array:6 [▼
        "gq_hostname" => "•   RGPlay | DarkRP [Быстрая загрузка]"
        "gq_address" => "188.120.254.140"
        "gq_port_client" => 27015
        "gq_online" => true
        "gq_numplayers" => 0
        "gq_maxplayers" => 128
      ]
      1 => array:6 [▼
        "gq_hostname" => "Default Breach Server"
        "gq_address" => "62.109.18.242"
        "gq_port_client" => 27015
        "gq_online" => true
        "gq_numplayers" => 0
        "gq_maxplayers" => 128
      ]
    ]


    Вывод: учите матчасть.
    Ответ написан