• В чём проблема с запросом?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Не массив ли тут надо передавать?
    Ответ написан
  • Как удалить пробелы в строке PHP и SQL?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Вот такой адовый кусочек кода поможет выдрать пробельные символы из строки, полученной из внешних источников.
    function stripWhitespaces(string $string): string {
            $old_string = $string;
            $string = strip_tags($string);
            $string = preg_replace('/([^\pL\pN\pP\pS\pZ])|([\xC2\xA0])/u', ' ', $string);
            $string = str_replace('  ',' ', $string);
            $string = trim($string);
    
            if ($string === $old_string) {
                return $string;
            } else {
                return stripWhitespaces($string);
            }
        }
    Ответ написан
    Комментировать
  • Записать в базу случайную выборку из строк?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Можно например так:
    $strings = ['one', 'two', 'three', 'four', 'five']; //массив строк
    $p_array = []; // массив выбранных строк
    for ($i = 0; $i < 2; $i++) {
      //Элементы не будут повторятся. Если нужно, чтобы элементы повторялись - нужно юзать array_rand
      $p_array[] = pop(array_shuffle(&$strings)); //собственно выбираем случайный элемент
    }
    $peremennaya = implode("\n", $p_array); //имплодим через нужный разделитель
    Ответ написан
    Комментировать
  • Код, который откроет файл в той же папке?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    $file = __DIR__ . "/data/data.xml";
    $f = file($file);
    $XML = simplexml_load_file($file);


    Ну или любым другим нужным способом )
    Ответ написан
    4 комментария
  • Почему не валидный токен?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Кхм... Вся суть этого токена в гарантии того, что формы не будут подделаны. Для каждой сессии он генерируется заново. Соответственно вы не сможете вырезать токен и использовать его для посторонних скриптов.
    Ответ написан
  • Как правильно наследовать и соединить классы?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    У вас Invoice должен зависеть от объектов User и Organisation. Соответственно внутри Invoice вы работаете с параметрами переданных объектов.
    $uid = $this->User->getId();
        $oid = $this->Organisation->getId();

    Их нужно передать в конструкторе или отдельными методами. Код без комментов, ну уж очень не удобный тут редактор.
    class Invoice
    {
        protected $User;
        protected $Organisation;
    
        public function __construct(User $User = null, Organisation $Organisation = null)
        {
            if (!is_null($User)) {
                $this->setUser($User);
            }
            if (!is_null($Organisation)) {
                $this->setOrganisation($Organisation);
            }
        }
        public function setUser(User $User)
        {
            $this->User = $User;
        }
        public function setOrganisation(Organisation $Organisation)
        {
            $this->Organisation = $Organisation;
        }
    }

    Такой подход поможет вам получать дополнительные поля объектов User и Organisation и не переживать, что вы поменяете таблицу.
    Ответ написан
    7 комментариев
  • Как сделать чтоб в 'opportunities' был array?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Вероятно стоит переименовать переменную с массивом $opportunies в $opportunities

    Ну или присвоить $opportunies вместо $opportunities
    =))
    Ответ написан
    Комментировать
  • Как правильно составить условие IF PHP?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    $codes = [4, 16 ... 125];
    if (isset($result['error']) && in_array($result['error']['code'], $codes)) {
         //что-то делаем.
    }


    Вам подойдет функция in_array. В итоге сильно сократит условие.
    Ответ написан
    Комментировать
  • Как из конструктора класса вернуть массив?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Не смог пройти мимо. Жесть же, коллеги )))

    Если очень хочется классов и получать данные одним вызовом используйте статические методы.

    class MyClass
    {
        //Публичный метод для получения данных
        public static function getSomeData()
        {
            $result = self::someAction();
            
            return $result;
        }
        
        //Скрытый служебный метод
        protected static function someAction($data = null)
        {
            //Тут что-то делаем
            return $result;
        }
    }
    
    $result = MyClass::getSomeData(); //Так получаем данные. Без фанатизма с конструктором.


    Не надо жести, потомки вас не простят ))))

    Рекомендую почитать на досуге: клац (без рефки).
    Ответ написан
    Комментировать
  • Возможно-ли временно сделать запись в базу данных не используя cron?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Можно хранить в поле метку UNIX time stamp. И при выборке из бд учитывать это значение.
    SELECT * FROM products WHERE uts < :uts
    Где :uts = time() - 7200, те самые 2 часа.

    Тогда можно обойтись без CRON и планировщика MySQL, но придется заплатить дополнительным int полем в таблице.

    Или можно добавить еще одну таблицу, в которой будет 2 поля: id товара и UNIX time stamp. Тогда в запрос нужно будет добавить JOIN.
    SELECT p.* FROM products as p 
    LEFT JOIN rel_table as rt
    ON rt.id = p.id 
    WHERE rt.uts IS NOT NULL AND rt.uts < :uts

    Такой подход несколько более гибок.
    Ответ написан
  • Как сделать построчный вывод переменных в CSV?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    $file = '/path/to/file/file_name';
    $string = 'Тут ваша переменная';
    if (file_exist($file)) {
        file_put_contents($file, $string, FILE_APPEND | LOCK_EX); //Добавит строку в файл
    } else {
        file_put_contents($file, $string);//Создаст файл и положит в него строку
    }


    Как-то так можно.
    Ответ написан
    Комментировать
  • Как запустить один файл из другого?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    $php_file = "path/to/file/filename";
    $cmd = "nohup nice -19 php {$php_file} > /dev/null 2>&1 &";
    exec($cmd);


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

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    echo "Тут заголовок, с разделителем \t", "\n";
    foreach ($array as $arr) {
        echo $arr['name'], "\t", $arr['value_1'], "\t", $arr['value_2'], "\n";
    }


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

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    В принципе ничего особо криминального здесь нет. Код выглядит страшно и запутанно.... Но работает ))

    Зачем нужна переменная с количеством ошибок? Можно замечательно использовать count($errors) или empty($errors) - результат будет ровно тот-же, но без кучи повторяющихся лишних действий. И да, если в foreach предать пустой массив - он выполнится 0 раз, и это нормальное поведение.

    И очень здорово разбить программу на функции. Для каждой проверки сделать свою функцию, которая будет возвращать true/false.
    И совсем здорово будет вынести работу с DB в отдельные функции.
    Ответ написан
    Комментировать
  • Как построить запрос в MySQL?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    "SELECT u1.name, u1.age, g.name as group FROM users as u1 
    LEFT JOIN users as u2 
    ON u1.ref_id = u2.id 
    LEFT JOIN group as g 
    ON u1.group_id = g.id 
    WHERE u1.age > u2.age"


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

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Добавляешь сущность "кошелек", в которой будет лежать итоговое значение суммы (по умолчанию 0);
    Добавляешь сущность "операция", которая будет отражать поступление и расходование бонусных баллов;
    При любом движении баллов изменяешь сумму в кошельке.

    Для отслеживания движений имеет смысл завести отдельную таблицу.
    id, user_id, sum, type, status, comments, source, date_create, date_confirm где:
    • id - идентификатор операции
    • user_id - ид пользователя
    • sum - сумма операции
    • type - тип операции: пополнение/списание
    • status - подтверждена/не подтверждена
    • comments - комментарий к движению
    • source - источник движения
    • date_create/date_confirm - дата создания/подтверждения операции


    Собственно при регистрации пользователя делаешь движение с поступлением бонусов;
    Потом изменяешь данные для кошелька;
    Потом пишешь любое движение в таблицу и изменяешь состояние кошелька.

    В самом простом случае можно сделать прям через один класс, но это не очень комильфо.
    Ответ написан
    Комментировать
  • Можно ли добавить div class во вставку?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    $Draw .= '<div class="allusers-wrapper" style="padding-top:10px;">';//стили нужно запихать в css
    $Query = mysqli_query($CONNECT, 'SELECT `login`, `fname`, `lname`, `oname` FROM `users` ORDER BY `id` DESC LIMIT 15');
    while ($Row = mysqli_fetch_assoc($Query)) $Draw .= '<div class="allusers"><br>Логин: '.$Row[login].' (фамилия: '.$Row[lname].'	имя: '.$Row[fname].')</div>';
    $Draw .= '</div>';


    Что-то такое....
    Ответ написан
    2 комментария
  • Ошибка Cannot redeclare radio(), почему?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Cannot redeclare radio() (previously declared in C:\OpenServer\domains\hostTraining\frontend\views\test\update.php:6)


    Вам интерпретатор так и говорит, что он не может переопределить функцию, она уже определена в файле update.php на 6 строчке. И этот файл подключен к текущему.
    Ответ написан
  • Как использовать класс mysqli в собственном классе с namespace?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    $mysqli = new \mysqli($sr, $lg, $ps, $tb);

    Используйте символ "\" перед именем класса.

    Немного скучной документации.
    Доступ к глобальным классам, функциям и константам из пространства имен.
    Ответ написан
    Комментировать
  • Как получить "случайно сформированное" значение json массива?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Попробуйте вот так:
    $arr = json_decode($json, true);
    foreach ($arr['result'] as $k => $in_arr) {
        echo "Имя внутреннего элемента: {$k}<br>";
        echo "Перебор вложенных элементов:<br>";
        foreach ($in_arr as $in_k => $in_v) {
            echo "{$in_k} => {$in_v} ";
        }
        echo "<br>";
        echo "Только определенный элемент внутреннего массива:<br>";
        echo $in_arr['pair'], "<br>";
    }

    Если нужны только имена:
    $arr = json_decode($json, true);
    echo "<pre>";
    var_dump(array_keys($arr['result']));
    echo "</pre>";


    Собственно вариант решения зависит от задачи.
    Ответ написан
    Комментировать