• Как запустить асинхронно функцию PHP?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Многопоточный curl: https://www.php.net/manual/en/function.curl-multi-...
    Промисы: https://github.com/guzzle/promises
    Потоки: https://github.com/krakjoe/pthreads
    Полностью асинхронный сервер: https://reactphp.org/
    Ответ написан
    Комментировать
  • О чем говорит такой sql запрос?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    h - это алиас к таблице history. Нужен, чтобы при указании столбца из таблицы в других частях запроса не писать слово "history" целиком.
    ->>' - это получение данных из поля, в котором записан json-объект (подробнее в документации: https://dev.mysql.com/doc/refman/8.0/en/json.html)

    Правильно ли выглядит аналогичный запрос методом QueryBuilder?

    Нет, вы потеряли кавычки и вторую "r" в слове "current". Должно быть так:
    ->andWhere('h.context->>"current_user" = :id')


    Подскажите, что говорит следующий код:

    Вычитать данные всех столбцов из таблицы "history". Искать только строки, в которых значение поля "message" равно "Blah-Blah", а также значение параметра "current_user" json-объекта, хранящегося в поле "context", равно переменной "$id"
    Ответ написан
    3 комментария
  • Как через BD добавить символ сразу во все названия статей (при учете того, что все названия содержат одинаковое слово)?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Если в названии объеетов нет пробелов, то так:
    UPDATE
    	`wp_posts`
    SET
    	`post_title` = CONCAT(
    		LEFT(post_title, LOCATE(' ', post_title)-1), 
    		' №',
    		SUBSTR(post_title, LOCATE(' ', post_title))
    	)
    WHERE
    	`post_type`='post'
    ORDER BY
    	`post_date`


    Если пробелы есть, то запрос составить можно, но вручную будет исправить гораздо быстрее.
    Ответ написан
    Комментировать
  • Как определить, запись была обновлена или добавлена?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Ответ написан
    Комментировать
  • Можно ли запускать цикл в цикле?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Это абсолютно нормально. Так делать допустимо.
    Ответ написан
    Комментировать
  • Как правильно объединить массив?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Сама функция:
    function mergeAs($key, $arr, $to) {
        if (count($arr) !== count($to)) {
            throw new \InvalidArgumentException ("Arrays must have the same size");
        }
        
        $merged = [];
        foreach ($to as $index=>$element) {
            $element[$key] = $arr[$index];
            $merged[] = $element;
        }
        
        return $merged;
    }


    Использовать так:
    $orderIds = ["7", "4", "3", "5", "6", "1"];
    $files = [
        [
            'name' => "Screenshot from 2019-01-10 15-04-58.png", 
            'type' => "image/png",
            'tmp_name' => "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a70d8",
            'error' => 0,
            'size' => 249784
        ],
        [
            'name' => "Screenshot from 2019-01-09 16-29-26.png", 
            'type' => "image/png",
            'tmp_name' => "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a7179",
            'error' => 0,
            'size' => 440472
        ],
        [
            'name' => "Screenshot from 2019-01-07 18-10-31.png", 
            'type' => "image/png",
            'tmp_name' => "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a71cb",
            'error' => 0,
            'size' => 175614
        ],
        [
            'name' => "par-de-ruedas-dentadas-dos-tamanos_318-44594.jpg", 
            'type' => "image/jpeg",
            'tmp_name' => "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a721c",
            'error' => 0,
            'size' => 26891
        ],
        [
            'name' => "300614.png", 
            'type' => "image/png",
            'tmp_name' => "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a7264",
            'error' => 0,
            'size' => 11784
        ],
        [
            'name' => "0.jpeg", 
            'type' => "image/jpeg",
            'tmp_name' => "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a72ac",
            'error' => 0,
            'size' => 291469
        ]
    ];
    
    $files = mergeAs("order", $orderIds, $files);
    var_dump($files);
    
    /* Result */
    /*
    array(6) {
      [0]=>
      array(6) {
        ["name"]=>
        string(39) "Screenshot from 2019-01-10 15-04-58.png"
        ["type"]=>
        string(9) "image/png"
        ["tmp_name"]=>
        string(107) "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a70d8"
        ["error"]=>
        int(0)
        ["size"]=>
        int(249784)
        ["order"]=>
        string(1) "7"
      }
      [1]=>
      array(6) {
        ["name"]=>
        string(39) "Screenshot from 2019-01-09 16-29-26.png"
        ["type"]=>
        string(9) "image/png"
        ["tmp_name"]=>
        string(107) "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a7179"
        ["error"]=>
        int(0)
        ["size"]=>
        int(440472)
        ["order"]=>
        string(1) "4"
      }
      [2]=>
      array(6) {
        ["name"]=>
        string(39) "Screenshot from 2019-01-07 18-10-31.png"
        ["type"]=>
        string(9) "image/png"
        ["tmp_name"]=>
        string(107) "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a71cb"
        ["error"]=>
        int(0)
        ["size"]=>
        int(175614)
        ["order"]=>
        string(1) "3"
      }
      [3]=>
      array(6) {
        ["name"]=>
        string(48) "par-de-ruedas-dentadas-dos-tamanos_318-44594.jpg"
        ["type"]=>
        string(10) "image/jpeg"
        ["tmp_name"]=>
        string(107) "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a721c"
        ["error"]=>
        int(0)
        ["size"]=>
        int(26891)
        ["order"]=>
        string(1) "5"
      }
      [4]=>
      array(6) {
        ["name"]=>
        string(10) "300614.png"
        ["type"]=>
        string(9) "image/png"
        ["tmp_name"]=>
        string(107) "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a7264"
        ["error"]=>
        int(0)
        ["size"]=>
        int(11784)
        ["order"]=>
        string(1) "6"
      }
      [5]=>
      array(6) {
        ["name"]=>
        string(6) "0.jpeg"
        ["type"]=>
        string(10) "image/jpeg"
        ["tmp_name"]=>
        string(107) "/var/www/product/public/website/content/tmp/apartment_images_1927b69a6e00d870384ad6877cc50ece_5c3854e9a72ac"
        ["error"]=>
        int(0)
        ["size"]=>
        int(291469)
        ["order"]=>
        string(1) "1"
      }
    } 
    */
    Ответ написан
    Комментировать
  • Как правильно выводить товары по категориям на php + sql?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Если предположить, что категория у продукта может быть одна, то так.
    Если категорий может быть несколько, то надо будет поправить связь.
    Данные о продуктах запакованы в JSON, можете какие угодно поставить.
    SELECT 
    	`category`.`title`,
    	 CONCAT(
    		'{',
    			'"hasMore":', IF(COUNT(`product`.`id`)>3, 'true', 'false'), ', ',
    			'"products":[',
    				COALESCE(GROUP_CONCAT(
    					JSON_OBJECT('id', `product`.`id`, 'title', TRIM(`product`.`title`))
    					ORDER BY `product`.`title` ASC
    					LIMIT 3
    				)),
    			']',
    		'}'
    	) AS product
    FROM 
    	`category`
    	LEFT JOIN `product` ON (`category`.`id`=`product`.`category_id`)
    GROUP BY `category_id`


    PS Чтоб строка в GROUP_CONCAT не обрезалась рекомендуется увеличть максимальную длину GROUP_CONCAT до максимально возможной цфиры. Если это невозможно сделать глобвально, то хотя бы на сессию (выполнять сразу после подключения к БД):
    SET SESSION group_concat_max_len = 1000000;

    Ну и потом в коде как-то так (предположим, что результаты выполнения запроса вы сложили в переменную $categories и это массив/итератор):
    <?php foreach ($categories as $category) { ?>
        <h3><?= $category->title ?></h3>
        <?php $products = json_decode($category->products) ?>
        <?php if (!empty($category->hasMore)) { ?>
            <?php foreach ($products as $product) { ?>
                 <span>Id: <?= $product->id ?>, Title: <?= $product->title ?></span>
            <?php } ?>
        <?php } ?>
        <?php if (!empty($category->hasMore)) { ?>
            <a>Смотреть больше</a>
        <?php } ?>     
    <?php } ?>
    Ответ написан
    Комментировать
  • Как исправить кодировку в excel файле?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Формируйте XLS-файл корректно в соответствии со спецификацией ( https://interoperability.blob.core.windows.net/fil... ) с помощью библиотеки или без оной.
    Сейчас вы просто делаете .html-файл, но задаете ему некорректное расширение .xls
    Ответ написан
  • Как убрать запятую в массиве и сделать сложение значений?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    $ids = implode(", ", $arItems["PRODUCT_ID"]);
    $sum = array_sum($arItems["PRICE"]);
    Ответ написан
  • Почему скрипт срабатывает всего 1 раз?

    Immortal_pony
    @Immortal_pony Куратор тега PHP

    Теперь нужно найти потомков категории(если таковые имеются). Вот скрипт который отвечает за эту работу:
    getParentId

    Для начала я бы рекомендовал называть вещи своими именами. Если выхотите потомков, то и назвайте функцию getDescendants или getDescendantsIds.

    Ваш код вполне рабочий. Если не обращать внимания на то, что в конце строки всегда будет запятая.
    И для других категорий тоже работает. Проверка

    Что же касается выбранной архитектуры БД - она неудачная.
    В текущем виде для получения данных о какой-то ветви вам необходимо всегда получать из БД все категории целиком, а потом уже рабираться с ними на стороне PHP. На малых объемах проблем не будет, но если данных будет много, то подобная система будет работать неспешно.
    Я рекомендую ознакомиться с постом, который описывает другие архитектурные подходы для хранения иерархических структур данных в БД.
    Ответ написан
    Комментировать
  • На чем лучше всего генерить pdf?

    Immortal_pony
    @Immortal_pony
    Лучшее из того, что есть - https://github.com/spipu/html2pdf
    Ответ написан
    Комментировать
  • Как загрузить фото на сервер согласно exif?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    if (move_uploaded_file($_FILES['afile']['tmp_name'], $uploadfile)) {
        /* Черная магия */
        $uploaded_img = $uploadfile;
    
        /* Код советчиков с Тостера */
        ...
    }
    Ответ написан
    Комментировать
  • Почему периодически появляется ошибка: "Call to a member function toArray() on null" и как ее решить?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Видимо, в случае отсуствтия метаданных в некоторых случаях в перемнную metadata попадает null, а не класс, у которого есть метод toArray.
    В принципе, в этом нет ничего криминального и эту ошибку можно смело игнорировать, так как она не влияет на работоспособность. Желательно также написать об этом разработчикам Joomla, чтобы они проблему все же исправили.

    Также, можете исправить ошибку самостоятельно (учтите, что при обновлении исправление может "слететь")
    $mdata = !empty($this->item->metadata) ? $this->item->metadata->toArray() : [];
    Ответ написан
    Комментировать
  • Как изменить иконку из дочерней темы wordpress?

    Immortal_pony
    @Immortal_pony
    В дочерней теме создайте функцию child_theme_get_post_views_count_html. Измените ее необходимым образом.
    Скопируйте все файлы родительской темы, где используется вызов theme_get_post_views_count_html. Замените на вызов child_theme_get_post_views_count_html
    Ответ написан
    Комментировать
  • Как вернуть значение кнопки после удаление из корзины?

    Immortal_pony
    @Immortal_pony Куратор тега JavaScript
    Функция "remove" у вас принимает некий "key", который, предположу, является уникальным ключом для продукта+комбинации значени его дополнительных опций.
    Можно попробовать дополнительно передавать product_id в явном виде.

    Тогда функцию "remove" надо изменить примерно следюущим образом:
    'remove': function(key, product_id) {
    ...            
    }


    Далее, необхомио будет изменить все места где эта функция вызывается, добавив передачу параметра "product_id"
    Примерно так:
    <button onclick="cart.remove('<?= $product['cart_id'] ?>', '<?= $product['product_id'] ?>');">Удалить</button>


    Возможно также понадобится внести измнения в контроллер, чтобы в представлении была возможность использовать перемнную product_id. Примерно так:
    $data['products'][] = [
        'product_id'   => $product['product_id'],
        ...
    ]
    Ответ написан
    2 комментария
  • "ленивый" __set(), есть идеи?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Сеттер должен быть у того класса, который вы отдаете через "быстро сляпанный геттер". А у вас там stdClass.
    Можно сделать, например, так:
    <?php
    class Fields
    {
        protected $parent;
        
        public function __construct(\Data &$parent) 
        {
            $this->parent = $parent;
        }
        
        public function __get($name) 
        {
            return array_key_exists($name, $this->parent->fields) ? $this->parent->fields[$name] : false;
        }
    
        public function __set($name, $value) {
            $this->parent->fields[$name] = $value;
        }
    }
    
    class Data
    {
        public $fields = [
            'foo' => "bar"
        ];
        
        public function __get($name){
            if($name == 'f'){
                return new \Fields($this);
            }
            else {
                return false;
            }
        }
    }
    
    $data = new Data();
    $data->f->testInfo = "test passed";
    echo $data->fields['testInfo']; // выведет "test passed"
    Ответ написан
    1 комментарий
  • Как выбрать одну случайную запись из таблицы MySQL?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Можно попробовать рандомизировать только id. Однако это не панацея. Выборка случайных данных при больших объемах медленная и с этим ничего не поделать.
    Ответ написан
    Комментировать