• Как можно get запрос превратить в POST?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    1) Если есть доступ к скрипту голосования, то просто поменяй $_POST на $_REQUEST
    $_REQUEST = содержит данные из $_GET и $_POST

    2) Если по каким-то причинам, не хочется использовать $_REQUEST, но есть доступ к скрипту, то можно просто пересетить параметры в самом начале скрипта
    if (empty($_POST) && $_GET) {
        foreach($_GET as $k=>$v) {
            $_POST[$k] = $v;
        }
    }


    3) можно прямо в скрипте выполнить запрос, переместив все параметры в POST через curl
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,"http://www.site.com/vote.php");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_GET));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec($ch);
    curl_close ($ch);
    
    var_dump($server_output)


    4) Делаем отдельную страницу, на ней делаем скрытую POST форму значения которой заполняются используя get параметры, при загрузке страницы с помощью JS сабмитим форму. Что-то вроде http://site.com/vote-redirect.php
    с таким кодом
    <form action="http://www.site.com/vote.php" method="POST" id="form">
    <input type="hidden" name="vote[1]" value="<?=intval($_GET['vote_1']??1)?>">
    <input type="hidden" name="vote[2]" value="<?=intval($_GET['vote_2']??0)?>">
    </form>
    <script>
    document.getElementById('form').submit();
    </script>

    и дальше
    http://site.com/vote-redirect.php?vote_1=1&vote_2=0
    Ответ написан
  • Как вывести текст, если логин или пароль неверны?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Если у тебя, не будет логина, то SQL запрос вернет 0 результатов и цикл while не отработает.
    Соответственно тебе надо предусмотреть ошибку на такой случай.
    $sql = mysqli_query($link, "SELECT * FROM reg WHERE name='$name' LIMIT 1");
    if (!mysqli_num_rows($sql)) { // логин не найден
        echo 'неверный логин и пароль'; 
    } else { // логин найден
        $result = mysqli_fetch_array($sql)
        if($result['password'] == $password){ // пароль верный
            echo 'логин и пароль верные';
        }else{ // пароль не верный
            echo 'неверный логин и пароль';
        }
    }
    Ответ написан
  • Как вывести категории а под ними дочерние?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Тут есть несколько варианта:

    1) Если у тебя есть только категория+саб-категория, то выбираешь главные и в момент их отображения выбираешь вложенные, псевдокод
    $items = SELECT * FROM table WHERE parent_id=0
    foreach($items as $item)
    {
        echo $item->name
        $subitems = SELECT * FROM table WHERE parent_id={$item->id}
         foreach ($subitems as $subitem) {
             echo $subitem->name
         }
    }


    2) другой вариант, это выбрать все категории и сортировать их во вложенные массивы и потом вывести, что-то вроде
    $items = SELECT * FROM table
    $menu = [];
    foreach($items as $item) {
        if ($item->parent_id == 0) {
            $menu[$item->id]['parent'] = $item;
        } else {
            $menu[$item->parent_id]['items'][] = $item;
        }
    }
    
    foreach ($menu as $item) {
        echo $item['parent']->name;
        if (!empty($item['items'])) {
            foreach ($item['items'] as $subitem) {
               echo $subitem->name;
            }
        }
    }


    3) Это та же разновидность первого и второго вариантов, но с обеспечением бесконечного уровня вложенностей. В этом случае обычно используется рекурсия, что-то вроде
    $printer = function printNode($items) {
       foreach($items as $item) {
          echo $item->name
          $subitems = SELECT * FROM table WHERE parent_id={$item->id}
          if ($subitems) {
              printNode($subitems);
          }
       }
    }
    
    $items = SELECT * FROM table WHERE parent_id=0
    printNode($items)
    Ответ написан
  • Есть ли уязвимости если я не буду обрабатывать строку?

    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?
    Ответ написан