• Есть ли уязвимости если я не буду обрабатывать строку?

    orlov0562
    @orlov0562
    I'm cool!
    При подготовленных параметрах не стоит. Только не используй параметр в Raw Expression, которые не будут подвергаться дополнительной обработке. Т.е. вот так не надо делать
    $users = DB::table('users')
                         ->select( DB::raw($_GET['select_only_columns']) )
                         ->where('status', '<>', 1)
                         ->groupBy('status')
                         ->get();
    Ответ написан
  • Как создать новый блок?

    orlov0562
    @orlov0562
    I'm cool!
    Привет!

    В твоем случае цикл лишний, но если он нужен, тогда просто анализируй итерацию и обновляй нужными данными, типа того


    я бы убрал цикл и рендерил весь блок как единую часть или ввел бы еще одну сущность "blockCol" в которую передавал бы меняющийся контент
    Ответ написан
  • Как перевести python код на php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Привет
    <?php
    $data = [
        'type' => 'buy',
        'pair' => 'BTC_USD',
        'amount' => '1.0',
        'price' => '870.69',    
    ];
    ksort($data);
    $msg = 'your key'.http_build_query($data);
    $sign = hash_hmac('sha256', $msg, 'your keys secret');
    echo $sign;
    Ответ написан
  • Поведение PHP На разных ОС?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Могу предположить, что проблема тут не в скрипте, а в том, что было два запроса.

    Попробуй использовать в $data microtime() или rand() чтобы понять что это не запись была два раза, а именно был вызван метод два раза

    Кроме этого, погуглить советую про flock и fclose
    Ответ написан
  • Как сделать простой php-роутер?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    .htaccess
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule ^(.+)$ index.php?route=$1 [QSA,L]


    index.php
    try {
        // берем переданный роут
        $route = trim($_REQUEST['route']??'index');
    
        // проверяем, если в конце слеш, то это index роут
        if (substr($route,'-1') == '/') $route.='index';
    
        // минимальная защита от инклуда неожидаемых файлов
        // ограничиваем имена до символов a-b, 0-9, тире, нижнее подчеркивание и слеш
        if (!preg_match('~^[-a-z0-9/_]+$~i', $route)) throw new Exception('Not allowed route');
    
        // генерим путь к файлу
        $filePath = dirname(__FILE__).'/pages/'.$route.'.php';
    
        // если не существует выкидываем ошибку
        if (!file_exists($filePath)) throw new Exception('Route not found');
    
        // если существует, инклудим файл
        include $filePath;
    } catch (Throwable $ex) {
        // в случае любых ошибок, показываем 404
        // тут обычно делают разные типы эксепшенов и разделяют 400 и 500 ошибки
        include dirname(__FILE__).'/pages/404.php';
    }


    структура вызова
    / => /pages/index.php
    /index => /pages/index.php
    /about => /pages/about.php
    /user/ => /pages/user/index.php
    /user/index => /pages/user/index.php
    /user/hello => /pages/user/hello.php
    ...
    /404 => /pages/404.php
    /<not-found> => /pages/404.php
    /user/<not-found> => /pages/404.php

    Далее доработать по потребностям.

    Но, я бы не советовал самому пилить, т.к. есть много всяких нюансов. Кроме того, есть куча готовых, проверенных, решений. Разве что, просто для интереса.
    Ответ написан
  • Почему не работает оператор If?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Я думаю, у тебя в условиях ошибка

    Попробуй вывести переменную
    $type = $_POST['type'];
    var_dump($type);

    и посмотреть что там оказывается в итоге

    так же назначь $question значение по-умолчанию, чтобы понимать что ни одно из условий не отработало
    $question = 'n/a';
    ...
    If($type == 'surname'){
      echo "1";
      $question = $_POST['surname_3'];


    кроме того, обрати внимание на оператор switch с ним было бы удобнее
    $type = $_POST['type'];
    
    switch($type) {
        default: // если тип не опознан сгенерировать ошибку
            throw new Exception('Undefined type: '.$type);
        break;
        case 'surname': 
            $question = $_POST['surname_3'];
        break;
        case 'id_publick': 
            $question = $_POST['id_3'];
        break;
        case 'phone_num': 
            $question = $_POST['phone_num_3'];
        break;
    }
    Ответ написан
  • Как реализовать подтверждение удаления записи из БД?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Это чистый JS, в обработчике onclick вызывается диалоговое окно, которое или пропускает или отменяет действие, самый простой пример
    <a onclick="if (!cofirm('Точно удалить?')) return false" href="#">удалить</a>


    Еще пример


    Вроде можно с помощью JS, но я в нём не особо разбираюсь пока что

    Для этой задачи придется разобраться, ничего не поделать.

    Хотя, не совсем точно, можно и на чистом php построить что-то типа "мастера", где у тебя будут в зависимости от параметров рендерится разные страницы, но это извращение.. Что-то типа

    Шаг 1. Рендерится страница с кнопкой удаления
    Шаг 2. Рендерится страница с диалогом удаления, на котором две ссылки
    ?=action=delete&confirm=yes
    ?=action=delete&confirm=no
    Шаг 3. Чекаем что выбрал пользователь в параметре confirm
    Ответ написан
  • Как быстрее всего обновить товары на сайте из xml файла?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Все очень зависит от того как происходит сравнение, если это вложенный цикл, что-то типа
    foreach($newItems as $newItem) {
        foreach($oldItems as $oldItem) {
        }
    }

    то конечно это будет долго. В этой ситуации наиболее простая оптимизация, это при нахождении старой записи, удалять ее из массива, тогда чем дольше будет работать скрипт, тем меньше будет oldItems и тем больше будет скорость.
    $existedItems = [...]
    foreach($newItems as $newItem) {
        $oldItems = $existedItems;
        foreach($oldItems as $k=>$oldItem) {
             unset($existedItems[$k]);
        }
    }


    Более логичный вариант, если хватает ресурсов, это загрузить оба массива в память, для каждого из них составить составной ключ "СкладКод+НоменклатураКод" и искать элементы по нему

    $newItems = [];
    foreach($newItemsXml as $newItemXml) {
        $hash = $newItemXml->storeId.'::'.$newItemXml->sku; // генерим хеш
        $newItems[$hash] = $newItemXml;
    }
    ...
    // то же самое для $oldItems
    ...
    foreach ($newItems as $hash=>$newItem) {
        $oldItem = $oldItems[$hash]; // максимально быстрая выборка
        ...
    }


    Если памяти не так много, тогда тот же подход но разделенный по складам, т.е. сначала один склад прогоняем, потом второй.

    Если же памяти не хватает или большой расход, тогда да, загоняем в базу, можно в memory table, с индексом и перебираем уже там.
    Ответ написан
  • Как из суммы md5 получить содержимое обратно?

    orlov0562
    @orlov0562
    I'm cool!
    Посчитай самостоятельно хеш всех цифр от 1 до 100.000.000 и сохрани в быстрое хранилище или вообще в память, если ее достаточно и используй поиск по нему вместо сторонних сервисов.
    Ответ написан
  • Как взять данные из API?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Я не знаком с этой библиотекой, но пример на гите выглядит так
    var_dump ($zaif->fetch_ticker ('BTC/JPY'));
    если это и есть аналогичный вывод (т.е. var_dump), то тебе надо просто получить данные в массив и затем вывести их в соответствии с ключами

    У тебя сейчас такой вывод
    array(20) {
      ["symbol"]=>
      string(7) "XMR/ETH"
      ["timestamp"]=>

    значит тебе надо сделать что-то типа
    $data = $zaif->fetch_ticker ('BTC/JPY')
    вместо
    var_dump($zaif->fetch_ticker ('BTC/JPY'))
    и потом ты сможешь использовать значения обращаясь по ключу
    echo $data ["symbol"]; // выведет XMR/ETH
    Ответ написан
  • Как повлияют php include пути на сео?

    orlov0562
    @orlov0562
    I'm cool!
    Много вопросов, по-порядку:
    - Пути у меня типа index.php?id=about типа таких. Как вообще это скажется на сэо?
    всего скорее никак, но для обычного человека прятнее будет если ты разберешься с htaccess и сделаешь вместо
    /index.php?id=about
    /about
    делается это 1 строчкой примерно так
    RewriteEngine On
    RewriteRule ^.+$ index.php?id=$0 [L,QSA]


    - Будет ли робот понимать их как отдельные страницы?
    Будет, елси меняется url, то и для робота это разные страницы
    За настройку индексации отвечает robots.txt, поэтому можешь там указать нужные страницы

    - вот все мои кусочки с которых я собираю сайт типа header.html, они будут индексироваться как отдельные страницы?
    если робот найдет, то да, если нет, то нет
    чтобы он не нашел, можешь их добавить в robots.txt или в папку которая закрыта от индексации, например подключать их в index.php по типу
    include 'inc/header.php';
    где inc - это папка
    затем в неё же надо добавить .htaccess с таким содержимым
    Require all denied
    тогда php сможет подключить файл, но по url он не будет доступен и роботы его не найдут
    Ответ написан
  • Как вместо таймера прописать дату?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Делай по аналогии с тем, что уже есть + нужна функция склонения существительных
    <?php
    function tpl_tpluralForm($n, $form1, $form2, $form3)
    {
        $n = abs($n) % 100;
        $n1 = $n % 10;
    	
        if ($n > 10 && $n < 20) {
            return $form3;
        }
    	
        if ($n1 > 1 && $n1 < 5) {
            return $form2;
        }
    	
        if ($n1 == 1) {
        return $form1;
        }
    	
        return $form3;
    }
    
    $seconds = 2*24*60*60 + 8*60*60;
    
    $days = floor( $seconds / (24*60*60) );
    $hours = $seconds < 24*60*60
                  ? floor( $seconds / (60*60) )
                  : floor( ($seconds % (24*60*60)) / (60*60) )
    ;
    echo $days.' '.tpl_tpluralForm($days, 'день', 'дня', 'дней')
         .' '.$hours.' '.tpl_tpluralForm($hours, 'час', 'часа', 'часов');


    Выведет: 2 дня 8 часов
    Ответ написан
  • Ошибка в Laravel ( Whoops, looks like something went wrong.), как ее исправить?

    orlov0562
    @orlov0562
    I'm cool!
    В ошибке у тебя написано
    ErrorException in 2c05e1cb686ec3fadc7085b804e2e46b line 124: Trying to get property of non-object (View: /home/admin/web/site.com/public_html/resources/themes/boxed/views/pages/users/userapp.blade.php) (View: /home/admin/web/site.com/public_html/resources/themes/boxed/views/pages/users/userapp.blade.php)


    На русском это значит, что в строке 124 файла userapp.blade.php у тебя идет вызов поля, которого не существует в объекте. Вот пример попроще, в котором будет такая же ошибка
    <?php
    $obj = null;
    $obj->a;


    Сходи в указанную строку и разберись почему у тебя там пустой объект или не объект вовсе. Или сделай, что то вроде
    <?php
    $obj = null;
    if (is_object($obj) && property_exists($obj, 'a')) {
        $obj->a;
    }
    Ответ написан
  • Можно ли переопределять переменную во время запуска playbook?

    orlov0562
    @orlov0562
    I'm cool!
    Вот порядок приоритета от наименьшего к наибольшему (последние перечисленные переменные выигрывают по приоритетам):
    1. command line values (eg “-u user”)
    2. role defaults [1]
    3. inventory file or script group vars [2]
    4. inventory group_vars/all [3]
    5. playbook group_vars/all [3]
    6. inventory group_vars/* [3]
    7. playbook group_vars/* [3]
    8. inventory file or script host vars [2]
    9. inventory host_vars/* [3]
    10. playbook host_vars/* [3]
    11. host facts / cached set_facts [4]
    12. play vars
    13. play vars_prompt
    14. play vars_files
    15. role vars (defined in role/vars/main.yml)
    16. block vars (only for tasks in block)
    17. task vars (only for the task)
    18. include_vars
    19. set_facts / registered vars
    20. role (and include_role) params
    21. include params
    22. extra vars (always win precedence)

    Variable precedence: Where should I put a variable?
    Ответ написан
  • Как решить ошибку с Warning: count(): Parameter must be an array or an object that implements Countable in ....?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Эту ошибку возвращает count когда в него передается null. До версии php 7.2 вернет 0, а с версии php 7.2 будет описанная ошибка.

    Исправить можно, вот так
    $products = $this->getProductList();
    if ($products) {


    а лучше так
    $products = $this->getProductList();
    if (is_iterable($products)) {


    а еще лучше вот так
    $products = $this->getProductList();
    if (is_countable($products)) {

    но для этого варианта нужен или php 7.3 или полифил который можно найти в комментариях к описанию функции https://www.php.net/manual/ru/function.is-countable.php
    Ответ написан
  • Почему WordPress через некоторое время выполнения PHP скрипта дает 404?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Это не проблема WP. Это ограничение или веб-сервера или времени выполнения скрипта (гугли set_time_limit). Запускай парсер через cron, напрямую, без участия веб-сервера и увеличенным временем выполнения скрипта.
    Ответ написан
  • Как проверить повторы в бд и не вносить запись при их нахождении?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Почитай про конструкцию: INSERT IGNORE ..

    $stmt = mysqli_prepare($link, "INSERT IGNORE INTO Users (a1, a2, a3, s1, s2) VALUES (?, ?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt, 'sssss', $a1, $a2, $a3, $s1, $s2);
    
    foreach($json['object'] as $item) {
      $a1 = $item['a1'];
      $a2 = $item['a2'];
      $a3 = $item['a3'];
      $s1 = $item['s1'];
      $s2 = $item['s2'];
      mysqli_stmt_execute($stmt);
    }
      mysqli_stmt_close($stmt);
      mysqli_close($link);
    Ответ написан
  • Архитектура БД и сортировка?

    orlov0562
    @orlov0562
    I'm cool!
    Штука в чем - насколько неправильно и награможденно выглядит база для решения моей задачи? Что убрать, а что добавить?

    Выглядит все нормально. Особенно если это все работает. Т.к. сделать структуру в бд это пол проблемы, нужно её еще наполнять и делать по ней выборки.

    Может есть замечания и советы, буду предельно благодарен за любую, конструктивную критику и советы.


    1) Похоже, что ты изобретаешь паттерн EAV. Советую погуглить как его используют в связке с БД.

    2) Я не уверен, но могу предположить, что у тебя могут возникнуть проблемы на большом кол-ве товаров и составных фильтрах. Поэтому советую подумать какой реальный объем записей у тебя будет +/-. И сгенерировать это кол-во данных в базе. И тестить твое решение на нем.
    Ответ написан