Ответы пользователя по тегу PHP
  • Использование методов со своими свойствами, внутри методов других классов со своими свойствами?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Вы затрудняетесь в выборе между шаблонами 'внедрение зависимостей' и 'инверсия зависимостей'. Тут нет однозначно верного решения, поскольку для этого нужно знать каким образом будет (и будет ли) расширяться поведение ваших классов в будущем.
    Исходя из описанного, я думаю, что оба способа будут иметь одинаковый результат. А в будущем вы легко сможете изменить выбранную архитектуру, если возникнет такая необходимость.
    То есть, речь о том, что проблемы можно решать по мере их поступления.
    Ответ написан
    Комментировать
  • Определение ассциативности массива, php

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    В php 8.1 появилась встроенная функция array_is_list()
    Примеры

    array_is_list([]); // true
    array_is_list(['apple', 2, 3]); // true
    array_is_list([0 => 'apple', 'orange']); // true
    
    // Массив начинается не с 0
    array_is_list([1 => 'apple', 'orange']); // false
    
    // Ключи массива не по порядку
    array_is_list([1 => 'apple', 0 => 'orange']); // false
    
    // Ключи массива не являются целыми числами
    array_is_list([0 => 'apple', 'foo' => 'bar']); // false
    
    // Непоследовательные ключи
    array_is_list([0 => 'apple', 2 => 'bar']); // false

    Ответ написан
    Комментировать
  • Не работает INSERT INTO, почему?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если insert into вызывает ошибку из-за дубликата, это можно решить разными способами.
    1. Перед вставкой выполнить запрос, проверяющий, есть ли такая запись.
    2. Использовать insert ignore into. Это приведёт к тому, что при наличии дубликата запись не будет добавлена, но при этом выполнение скрипта продолжится.
    3. Использовать replace into. В этом случае старая запись будет заменена новой. Но если у какой-то другой таблицы создана связь с этой посредством foreign key с каскадной реакцией, это приведёт к удалению всех ссылающихся на этот ключ записей.
    4. Использовать on duplicate key update:
    insert into films (img, img_vertical, trayler...) values (:img, :img_vertical, :trayler...)
      on duplicate key update  
    set img = :imgUpd , img_vertical = :img_verticalUpd, trayler = :trayler итд  ...;

    прочее

    Часть ответа пришлось удалить, поскольку за педагогические услуги мне не платят.
    Ответ написан
  • Как сделать редирект на ссылку в новом окне в php?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    window.open(<?php echo $r['Id']; ?>, '_blank')

    Но лучше стремиться к тому, чтобы js и php жили порознь:
    <input type="hidden" id="url" value="<?php echo $r['Id']; ?>"/>
    window.open($('#url').value, '_blank')
    Ответ написан
    4 комментария
  • Где можно показать свой код?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если это код товара, его длины не хватит в том случае, если у вас будет больше 10000 товаров.
    Это никак не связано с количеством покупателей.
    id покупателя - совершенно другое значение.
    Поэтому записывать в базу нужно id покупателя и id товара.
    А если в сессию, то можно только id товара, потому что у каждого покупателя своя сессия.
    Ответ написан
  • Как сделать так чтобы, при отправки ajax события в data: { art: }, выходила два input и между ними -?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Исходя из поставленной задачи:
    data: { art: $('#artnumber1').val() + ' - ' + $('#artnumber2').val() }
    Тогда на сервер придёт $_Post['art'] содержащий "artnumber1-artnumber2"

    Но, более правильно будет:
    data: { 
        art1: $('#artnumber1').val(), 
        art2: $('#artnumber2').val()
    }
    Тогда на сервер придут $_Post['art1'] и $_Post['art2'], содержащие "artnumber1" и "artnumber2" по отдельности. Соединить их в одну строку с " - " можно уже потом ближе к выводу данных.
    Чем дольше данные живут раздельно, тем лучше.
    Ответ написан
    Комментировать
  • Как определить интервал в расписание на php?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    $minutes = ['03', '09', '13', '18', '23', '28'];
    var_dump(getRange($minutes));
    
    function getRange($minutes): array
    {
        if(count($minutes) < 5) return $minutes;
    
        $minutes = array_map(fn($m) => intval($m), $minutes);
        rsort($minutes);
        $ranges = [];
        foreach ($minutes as $k => $minute){
            if($k){
                $ranges[] = $prev - $minute;
            }
            $prev = $minute;
        }
        $min = min($ranges);
        $max = max($ranges);
        return $min === $max
            ? [$max]
            : [$min, $max];
    }
    Ответ написан
    1 комментарий
  • Как остановить выполнение вышестоящей функции?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Остановить: return;

    Если чекеров много и вы хотите знать какой из них остановил выполнение, то это можно сделать при помощи
    конструкции match.
    function calculate($num){
        return match (false) {
            isPositive($num) => 'Значение отрицательное',
            !isFignya($num) => 'Значение фигня',
            !isOtherFignya($num) => 'Значение другая фигня',
            default => '$num - положительное число'
        };
    }

    ЗЫ
    В будущем, вероятно появятся чекеры, которые вызывают другие чекеры, тогда вам потребуется протаскивать ответы функций через всю иерархию. Это вызовет головную боль и раздражение. Тогда вы станете оборачивать родительскую функцию в блок
    try{
        //пробуем выполнить
        calculate($num);
    }catch(MyCustomException $e){
        //если не получилось, смотрим причину в $e и решаем что делать.
    }
    , а останавливать чекеры при помощи throw new MyCustomException()
    Ответ написан
    Комментировать
  • Как правильно использовать PDO если несколько php скриптов?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    1. В обычном штатном случае скрипт один, если вы сознательно не запускали каких-либо асинхронных процессов.
    Даже если в ходе выполнения подключаются другие файлы (include или require), то скрипт всё равно один.
    Когда скрипт выполнен, открытые соединения прекращаются автоматически.

    2. Я делаю примерно так:
    class DB
    class DB
    {
        public ?PDO $pdo;
        private ?array    $opt;
        public ?string $pHolders;
        public ?array  $parArr;
    
        public function __construct(
            string $connectName = '',
            string $charset = 'utf8mb4',
            bool $flat = false
        )
        {
            if($flat) return;
    
            $con = ConnectDB::byName($connectName);
    
            $dsn = "mysql:host=$con->host;dbname=$con->name;charset=$charset";
            $this->opt = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => FALSE
            ];
            $this->pdo = new PDO($dsn, $con->user, $con->pass, $this->opt);
        }
    
        public function qwe($sql, $args = NULL): bool|PDOStatement
        {
            if (!$args) {
                return self::query($sql);
            }
            return self::execute($sql, $args);
        }
    
        private function execute(string $sql, array $args): PDOStatement
        {
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute($args);
            return $stmt;
        }
    
        private function query($sql): PDOStatement
        {
            return $this->pdo->query($sql);
        }
    }


    Объявляю функцию в файле и подключаю его с помощью autoload в composer.json
    spoiler
    function qwe(string $sql, array $args = null): bool|PDOStatement
    {
        global $DB;
    //Синглтон
        if(!isset($DB)){
            $DB = new DB();  
        }
        return $DB->qwe($sql,$args);
    }


    Вызываю:
    $qwe = qwe("Select * from users where id = :id", ['id' => $id]);
    Ответ написан
    Комментировать
  • Не добавляется строка в Бд через postman что делать?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Гуглите:
    1. PDO
    2. Логирование ошибок MYSQL
    mayton2019 правильно говорит, что вставка в бд выполняется командой INSERT INTO
    Ответ написан
    Комментировать
  • Почему возникает PHP Notice при запросе get_the_terms?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    if (empty($_POST)) {
    $post = (object) json_decode(file_get_contents('php://input'), true)['params'] ?? (object) [];
    }
    Если запрос сделан с помощью axios, то приходит в php://input
    ЗЫ: Я не в курсе как ВП валидирует запросы. Из того что я предложил придёт то, что было отправлено.
    Ответ написан
  • Как передать путь к файлу в базу данных?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    1. Вам следует почитать о разнице между mysql и mysqli, использовать PDO и передавать данные в бд исключительно при помощи плейсхолдеров.
    2. Вы должны проверить, что полученные данные действительно являются изображением, а не вредным кодом.
    3. Загруженный файл может не открываться из-за отсутствия слеша в начале пути. Или иной опечатки в url файла.
    Но, в свете предыдущих пунктов, это не основная проблема. Первые два значительно важнее.
    Ответ написан
    Комментировать
  • Как получить трек вызовов методов и время их выполнения?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если предположить, что при вызове каждого метода происходит измерение времени начала, времени окончания и запись в лог, то единственное, что можно по нему определить - это глубину метода в стеке.
    Целесообразно добавить функцию с логированием в те методы, которые в чем-то подозреваете.
    А еще лучше посмотреть логи sql.
    Ответ написан
  • Как исправить ошибку синтаксиса mysql?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Если вы не используете PDO, то по крайней мере уж не пихайте выражения в формирование строки sql.
    И константы тоже не пихайте.
    Подготовьте переменные заранее. Так, чтобы они без закрытия кавычек и конкатинации вставлялись.
    Тогда IDE сама всё подскажет и вам не придётся насиловать мозг ни себе ни окружающим.
    Ваш sql сейчас настолько нечитаем, что в нём даже нет смысла ковыряться.

    P.S. Если этот код - часть какого-то модуля, который вы не можете изменить, то дело в каких-нибудь символах, которых он не ожидает. Нужно во вторых избавить все входящие данные от любых символов кроме букв и цифр, во первых - прекратить с ним любые производственные отношения.
    Ответ написан
    1 комментарий
  • В каких ситуациях можно обойтись без плейсхолдеров в запросе?

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

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    До завершения цикла никому во всей вселенной неизвестно присваивать ли класс active первому элементу.
    А ваш выводит данные во время выполнения.
    Если он уже вывел на экран первый элемент, ему до фени что там в следующих.
    Принятие решения должно произойти до вывода.
    Пройдите в цикле $Array, поймайте что нужно, измените первый элемент, если требуется.
    А потом уже выводите на экран в новом цикле.
    У меня тоже всегда какие-нибудь траблы возникают, если смешивать логику и вывод данных.
    Лучше мухи отдельно, котлеты отдельно.
    Ответ написан
    Комментировать
  • Какое приложение написать для понимания ООП?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Полноценного понимания не существует.
    Я долго писал в процедурном стиле и долго не мог понять зачем вообще нужны эти классы какие-то.
    Всё решалось функциями. С ростом сложности проекта приходилось передавать в функции всё больше и больше аргументов. Когда аргументов стало слишком много, я стал передавать в качестве аргумента массив с переменными.
    Функция изменяла значения в этом массиве и возвращала.

    Иногда (часто) функция должна была вызвать другую функцию и передать туда этот массив. Количество функций росло, цепочки из них становились всё длиннее и я даже стал путаться в том, какая функция в какой цепочке (трейсе) участвует.
    Тогда я стал раскладывать группы функций по разным подключаемым файлам и называл эти файлы так, чтобы по названию понять какой группе переменных они нужны.

    А потом я случайно узнал, что эти какие-то непонятные методы, которые "являются поведением объектов класса" (как это обычно объясняют) на самом деле просто функции и есть. И оказалось, что можно не пропихивать массив через них, а наоборот - функции сложить в этот массив. Получилось, что класс это такой "массив" в котором есть не только переменные, но и функции. И эти функции могут видеть все эти переменные, даже если не написать global $var. И это было как раз тем, чего я очень желал и радости моей не было предела.
    Кстати, узнал я это, когда забавы ради кодил 2D платформер на C# в Unity.
    Ответ написан
    Комментировать
  • Заказывать CMS с 0 или использовать существующие?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Выбор фреймворка - это не ваша зона ответственности. Не потому что вы некомпетентны, а потому, что не вам его поддерживать.
    Вероятно, вы захотите, чтобы у вас было и мобильное приложение, которое "питается" от того же бэкенда.
    А значит бэкенд не должен заниматься никаким html, отдавать только json.
    И WP я тут вообще не могу как-то серьёзно рассматривать. А если проект надо будет поддерживать и расширять, то останется либо уволиться либо повеситься.
    Фронтенду до фени кто ему отдаст этот json. Даже если там нэтивный php.
    Поэтому более актуальными вопросами будут: Vue vs React, SPA vs PWA.
    А что работает с сервером и бд не важно. Laravel / Yii / Simfony / phpOnly - разработчик сам разберётся.
    Ответ написан
    Комментировать
  • Обледенение двух массива данных, как сделать?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    // $row->name выглядит опрятнее, чем $row['name']
    // Для этого превращаем массив в объект. (object)
    while ($row = (object) mysqli_fetch_assoc($result)) {
    
        //$kol_grop++; Это не нужно
    
        // $name_grop .= $row['name'] . ',';
        // Не следует использовать конкатенацию в цикле.
        // Лучше собрать в массив и склеить в implode после цикла.
    
    
        // array_push($array_nama_g, array('name'=>$row['name'], 'subscriber_bes'=>$row['subscriber_bes']));
        // Это можно выразить иначе:
        // 'name' кладем в ключ, 'subscriber_bes' в значение
        $array_nama_g[$row->name] = $row->subscriber_bes;
    
    }
    
    // $name_grop .= $row['name'] . ','; <-- это было в цикле while
    // Вместо этого берём ключи из $array_nama_g и клеим в строку:
    $name_grop = implode(',', array_keys($array_nama_g));
    // А вообще я так и не понял зачем нужна эта переменная.
    // Да еще совпадающая с именем ключа в res_raspi. Очень запутывает.
    
    //api
    // Вместо array() можно использовать []
    $res_raspi = [
        ['name_grop'      => 158,
         'subscriber_bes' => '125588,87156978,899'],
    
        ['name_grop'      => 668,
         'subscriber_bes' => '188,8799']
    ];
    
    /*
    for ($i = 0; $i < $kol_grop; $i++) {
        $fed_key_array = array_search($res_raspi[$i]['name_grop'], array_column($array_nama_g, 'name'));
        $users_id = $array_nama_g[$fed_key_array]['subscriber_bes'];
        // $users_id будет перезаписываться каждую итерацию цикла.
        // Или планируется его применить до наступления следующей?
    }
    */
    
    // Записываем это более понятным образом
    foreach ($res_raspi as $rapi) {
        $users_id = $array_nama_g[$rapi['name_grop']];
    }


    убираем комментарии
    while ($row = (object) mysqli_fetch_assoc($result)) {
        $array_nama_g[$row->name] = $row->subscriber_bes;
    }
    $name_grop = implode(',', array_keys($array_nama_g));
    
    $res_raspi = [
        ['name_grop'      => 158,
         'subscriber_bes' => '125588,87156978,899'],
        
        ['name_grop'      => 668,
         'subscriber_bes' => '188,8799']
    ];
    foreach ($res_raspi as $rapi) {
        $users_id = $array_nama_g[$rapi['name_grop']];
    }

    Это в более цивилизованно выглядит, но работает так же.
    Чтобы что-то исправить надо задачу понимать.
    Что с чем нужно объединить?
    Ответ написан
    Комментировать