Задать вопрос
Ответы пользователя по тегу PHP
  • Почему ничего не происходит каксделать чтоб что-то происходило?

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

    <?php
    function myChown($fname, $attr) {
            if (PHP_OS == "UNIX") {
                // Функция-заглушка
                // Ничего не делает
                 return 1;
            } else {
                  return chown($fname, $attr);
            }
        }
    Ответ написан
    Комментировать
  • Сертификат по ГОСТ-2012?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    openssl вполне подходит для этих целей

    статья с подробным разбором и докер образами
    https://habr.com/ru/post/353534/

    Пару ссылок для общего ознакомления с болью
    https://www.cryptopro.ru/forum2/default.aspx?g=pos...
    http://wiki.rosalab.ru/ru/index.php/OpenSSL_и_ГОСТ
    Ответ написан
    Комментировать
  • Как перебирать такие массивы/объекты?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Это не массивы. Для работы со строками столбцами и данными нужно использовать специальные методы (гетеры и тд) которые предоставляет данная бибилотека.

    К сожалению Вам придётся всё-таки изучить документацию
    https://phpspreadsheet.readthedocs.io/en/latest/

    а так же можно ознакомится с примерами кода тут
    https://github.com/PHPOffice/PhpSpreadsheet/tree/m...

    Получить данные из ячейки или строки
    https://phpspreadsheet.readthedocs.io/en/latest/to...
    Ответ написан
    Комментировать
  • Как найти ссылку в тексте с якорем (#anchor)?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Есть даже целый сайт с регулярками по матчингу url для разных ЯП - https://urlregex.com/

    %^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu


    <?php
    $str = 'Здесь ссылка должна быть в теге <a> https://example.ru/ru/task#348141 конец текста';
    
    $re = '%(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}'.
    '|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)'.
    '(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)'.
    '*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?%usi';
    
    $result = preg_replace($re, '<a href="$0" target="_blank">$0</a>', $str);
    
    var_dump($result);
    
    //string(167) "Здесь ссылка должна быть в теге <a> <a href="https://example.ru/ru/task#348141" target="_blank">https://example.ru/ru/task#348141</a> конец текста"
    Ответ написан
    4 комментария
  • Сбилась кодировка у страницы, как исправить?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    whatislov, хочу заметить, что на скриншоте редактируемого файла и скриншоте страницы всё в порядке с кодировкой и отображением.
    Вы редактируете текст с места "... инвестиционный проект и тд" и он нормально тображается.

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

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    HellFingers,
    echo mb_substr($string, 0, 1);
    Ответ написан
    Комментировать
  • Как php повторно узнает о файлах в каталоге: из памяти или читает все занова?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    1. путь до файла (куда пишете) у вас в $path, а вы проверяете $name, что не верно
    2. проверку на существование делаете после curl, а значит даже если в файл не пишете, то всё-равно делаете http запрос что не имеет смысла

    Подправленный вариант
    <?php
    foreach($data as $k)
    {
        foreach($k as $kq => $v)
        {
            foreach(($v["photo_list"]) as $key => $url)
            {
                $name = (basename($url));
                $path = "/".$name;
                
                //если файл существует идём к следующему $url
                if(file_exists($path))
                {                
                    continue;
                }
    
                //скачиваем
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_HTTPHEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                $data = curl_exec($ch);
                curl_close($ch);
                
                //записываем
                $file = fopen($path, "w+");
                fwrite($file, $data);
                fclose($file);
            }
        }
    }
    Ответ написан
  • Как оптимизировать выборку из Mysql?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    И за какое время у вас отрабатывает 10000 SELECT'ов? Индекc на uid есть + LIMIT 1?

    10тыс SELECT'ов на таблице в 300тыс строк, при условии что на uid есть индекс должно выполняться за 1-2 секунды на нормальной машине.
    Не вижу необходимости что-либо оптимизировать.
    Можно разве что минимизировать кол-во данных передаваемых по сети и вместо SELECT * использовать SELECT type, lvl, country, isoc так как лишние данные, это лишние задержки.

    БД создана для того чтобы работать, нет смысла её жалеть.

    - Другой вариант, если позволяет память - выбирать все строки из базы одним SELECT'ом и потом фильтровать в приложении.
    - Можно прикрутить memсached для кеширования так как по сути у вас key-value выборка
    - Выбрать другое хранилище (Redis, tarantool) где скорость выборки по ключу будет выше

    upd. Можно несколько SELECT'ов группировать в один запрос через IN
    SELECT ... FROM table WHERE uid IN(uid1, uid2, uidN)

    Этим можно уменьшить суммарное кол-во SELECT'ов, но не факт что в итоге данные получите быстрее.
    Ответ написан
    4 комментария
  • В чем ошибка при обходе дерева?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Проблема в том что если в самой функции делаете echo да ещё и рекурсию, то не нужно результат работы функции помешать внутрь другого echo так как в таком случае сперва отрабатывает функция, и делает echo, а потом уже отрабатывает внешнее echo.

    Чтобы избежать этого, и вставлять функцию как вы хотите, нужно изменить код функции так чтобы вместо echo там был return;

    Исправленный код с echo.
    <?php
    function draw($array)
    {
        foreach($array as $item)
        {
            if(isset($item['CHILD']))
            {
                echo '<li>'.$item['NAME'].'<ul>';
                draw($item['CHILD']);
                echo '</ul></li>';
            }
            else
            {
                echo '<li>'.$item['NAME'].'</li>';
            }
        }
    }
    
    $arr = [
        'CHILD' => [
            '16' => [
                'NAME'  => '1',
                'CHILD' => [
                    '17' => [
                            'NAME' => 'a'
                    ],
    
                    '18' => [
                            'NAME' => 'b'
                    ]
                ]
            ]
        ]
    ];
    
    echo '<ul>';
    draw($arr['CHILD']);
    echo '</ul>';
    Ответ написан
    1 комментарий
  • Функция mkdir не создает папку с разрешениями 775 и 777, а создает в обоих случаях 755. В чем дело?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    $old_umask = umask(0);
    mkdir($_SERVER['DOCUMENT_ROOT'] . '/test/', 0777, true);
    umask($old_umask);
    Ответ написан
    Комментировать
  • Почему функция выдает false?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Kristina8787, ну значит на этих этапах ошибок нет. Вижу опечатку в самом конце кода.

    /*Сохранение результата в промежуточном массиве*/
        $orderinfo["goods"] = $items;
        /*добавление промежуточного массива в возвращаемый массив*/
        $allorders[]=$ordersinfo;


    $orderinfo
    $ordersinfo
    Ответ написан
    2 комментария
  • Telegram бот не выводит месседж?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если длина итогового сообщения больше 4096 символов (utf8), то разбиваем его на несколько сообщений и отправляем каждое отдельно.

    case
        ('Промо'):
            $sql = 'SELECT * FROM promo';
            $result = mysqli_query($link, $sql);
            $array = array();
            while($row = mysqli_fetch_array($result))
            {
                $item['promo_name'] = $row['promo_name'];
                $item['promo_descr'] = $row['promo_descr'];
                $item['promo_link'] = $row['promo_link'];
                $cod[] = $item;
            }
            
            $text = ''; // <---
            foreach($cod as $v)
            {
                $new_line = $v['promo_name'].' - '.$v['promo_descr'].' <a href="'.$v['promo_link'].'">перейти к акции</a><br/>';
                
                if(mb_strlen($text) + mb_strlen($new_line) > 4096) // <---
                {
                    file_get_contents($GLOBALS['api'].'/sendMessage?chat_id='.$chat_id.'&reply_markup='.$keyboard.'&text='.urlencode($text));
                    $text = '';
                }
                
                $text .= $new_line; // <---
            }
            
            if($text != '') // <---
            {
                file_get_contents($GLOBALS['api'].'/sendMessage?chat_id='.$chat_id.'&reply_markup='.$keyboard.'&text='.urlencode($text));
            }                
            // file_get_contents($GLOBALS['api'] . '/sendMessage?chat_id='.$chat_id.'&reply_markup='.$keyboard.'&text=' . urlencode("Код ".$row['promo_name']." \n ".$row['promo_descr']." \n Ссылка ".$row['promo_link']." "));
        break;
    Ответ написан
    1 комментарий
  • Как достучаться до вложенной функции?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Согласен с ответом выше, "код с душком".

    В вашему случае функция объявляемая внутри функции всё-равно будет доступна в глобальном неймспейсе, но вызвать её можно будет только после вызова внешней функции. То есть просто можно разделить это на 2 отдельных функции без вложенности.

    как вызвать, ничего не меняя
    func_a(3, 5); //у нас появляется функция func_arg которую теперь можем вызывать
    var_dump(func_arg(7, 9));


    для понимания механизмов
    var_dump(function_exists('func_arg')); //false
    func_a(3, 5);
    var_dump(function_exists('func_arg')); //true


    лучше разделить функции
    function func_a()
    {
    //
    }
    
    function func_arg()
    {
    //
    }
    Ответ написан
    Комментировать
  • Подключил функции к кнопке, но она не выводится?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    у вас 2 раза делается json_encode() кнопки
    $keyboard = json_encode(...) и потом второй раз в return;

    $inline_button = [
            'text' => "Показать список команд",
            'callback_data' => '/showcomands/',
        ];
        $inline_keyboard = [[$inline_button]];
        $keyboard = json_encode(["inline_keyboard" => $inline_keyboard]);
    
        return $keyboard;
    Ответ написан
  • Как не учитывать табуляцию?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Как вариант преобразовывем строку в массив, по символу "\n", каждый элемент массива фильтруем через trim() чтобы удалить пробельные символы по бокам и снова склеиваем

    https://3v4l.org/PnqZ9

    <?php
    $str = 
        "
        line 1
        line 2
        line 3\r
        line 4
        ";
    
    $str_cleared = join("\n", array_map('trim', explode("\n", $str)));
    
    var_dump($str);
    var_dump($str_cleared);


    string(50) "
        line 1
        line 2
        line 3
        line 4
        "
    string(29) "
    line 1
    line 2
    line 3
    line 4
    "
    Ответ написан
  • Почему stripslashes конвертирует ®ion в товарный знак?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Скорее всего где-то под капотом спрятана ещё html_entity_decode так как именно эта функция делает описанные вами вещи

    https://www.php.net/manual/ru/function.html-entity...
    Ответ написан
  • Как получить почту отправителя?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $header_str = '=?UTF-8?B?RnJlZS1QYXkg4oCTINCx0LjRgNC20LAg0YTRgNC40LvQsNC90YHQtdGA0L7Qsg==?= <emailglobal@gmail.com>';
    
    preg_match('!<([^>]+)>!', $header_str, $out);
    var_dump($out[1]); //string(22) "emailglobal@gmail.com"
    Ответ написан
    Комментировать
  • Как вывести историю статусов в measoft api?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    foreach ($results as $result) 
    {
        
        //получаем массив со списком статусов для заказа
        $statushistory = array();
        foreach($result->statushistory[0] as $child)
        {
            $attrsStatusHistory = $child->attributes();
            $status = array(
                'eventstore' => (string)$attrsStatusHistory['eventstore'],
                'eventtime' => (string)$attrsStatusHistory['eventtime'],
                'createtimegmt' => (string)$attrsStatusHistory['createtimegmt'],
                'title' => (string)$attrsStatusHistory['title']
            );
            $statushistory[] = $status;
        }
    
        $order = array(
             // ... код как у вас был
            'statushistory' => $statushistory,
      
        );
    
    }
    Ответ написан
  • Как задать клавиатуру из массива?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    use Telegram\Bot\Keyboard\Keyboard;
    $buttons = [
        ['qqq', 'www', 'eee'],
        ['rrr', 'ttt', 'yyy'],
        ['uuu', 'iii', 'ooo'],
    ];
    
    $keyboard = Keyboard::make()->setOneTimeKeyboard(false)->setResizeKeyboard(true);
    foreach($buttons as $row)
    {
        $keyboard->row(...$row);
    }

    обратите внимание на ТРОЕТОЧИЕ перед $row - https://wiki.php.net/rfc/argument_unpacking
    Ответ написан
    4 комментария
  • Почему не отображаются данные с БД?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    function get_post() {    
        global $link;
        
        $sql = "SELECT * FROM projects WHERE categoty = 'top' ORDER BY id desc"; 
        
        $result = mysqli_query($link, $sql);
       
        $posts = array(); // <---- инициализируем posts как пустой массив
        while ($row = $result->fetch_assoc()) {
            $posts[] = $row; // <---- наполняем массив данными из бд
        }
            
        return $posts;
    }


    На странице вывода достаточно будет этого варианта Вашего кода
    <?php
    $posts = get_post();
    ?>
    
    <?php foreach ($posts as $post) : ?>
       <div class="portfolio_project wow fadeInUp">
               <a href="/project.php?post_id=<?= $post['id'] ?>">
                           <h1><?php echo $post['title'] ?></h1>
                </a>
         </div>
    <?php endforeach; ?>
    Ответ написан