Ответы пользователя по тегу PHP
  • Как оптимизировать выборку из 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; ?>
    Ответ написан
  • Как исключить 0 из рандомной генерации чисел rand(-9,9)?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    while( in_array( ($a = random_int(-9,9)), [0] ) );
    Ответ написан
  • Запись условия if в переменную?

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

    $if = (0.5 < 0.6); //true
    if ($if) {
        echo 'YES';
    } else {
        echo 'NO';
    }


    Внимание, прежде чем использовать eval() в своём коде внимательно изучите документацию по этой функции https://www.php.net/manual/ru/function.eval.php

    Особенно обратите внимание на это предупреждение
    Предостережение
    Языковая конструкция eval() может быть очень опасной, поскольку позволяет выполнить произвольный код. Использование данной функции не рекомендуется. Если вы полностью убеждены, что нет другого способа, кроме использования этой конструкции, обратите особое внимание на то, чтобы не передавать какие-либо данные, предоставленые пользователем, без предварительной проверки.

    Автор данного ответа не несёт ответственности за простреленные ноги.

    Через eval()
    <?php
    $if = eval('return 0.5 < 0.6;');
    var_dump($if); //true
    
    eval('$if = 0.5 < 0.6;');
    var_dump($if); //true
    Ответ написан
    1 комментарий
  • Как отправить фото от имени бота?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Неправильно используете curl_file_create(). Первым параметром надо передать путь до файла.

    curl_file_create ( string $filename [, string $mimetype [, string $postname ]] ) : CURLFile

    https://www.php.net/manual/en/curlfile.construct.php
    Ответ написан
    Комментировать
  • Есть ли возможность у cURL на PHP кешировать запросы?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    В самом cURL такой функциональности нет, но можно без проблем добавить её самому.
    Кешировать результаты запроса можно в любое удобное хранилище: файлы, memcached, APCu, любая БД.
    Ответ написан
    1 комментарий
  • Как сделать чтобы все ссылки в парсере php открывались в новой вкладке?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $url = "http://hurtworld.pro/vkrss-master/index.php?id=[xfvalue_vk]&access_token=e3a2f8bbe3a2f8bbe3a2f8bb95e3cfdcb4ee3a2e3a2f8bbbe323a8a6ed61cd403611649"; // Адрес до RSS-ленты
    $rss = simplexml_load_file($url);
    foreach ($rss->channel->item as $items) {
    
    //добавляем target="_blank"
    $items->description = str_ireplace('<a href=', '<a target="_blank" href=', $items->description);
    
    echo <<<HTML
    <h5><font color="white"><code>{$items->pubDate}</code></font></h5>
    <p><font color="white">{$items->description}</font></p>
    <a target="_blank" href="{$items->link}"><button class="label label-success" style="text-decoration: none;">
    <font color="white"> Подробнее</font> 
    </center>
    </button>
    </a>
    <hr>
    HTML;
    
    }
    Ответ написан
    1 комментарий
  • Как в imap_search задать точное соответсвие SUBJECT?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Цитирую RFC
    In all search keys that use strings, a message matches the key if the string is a substring of the field. The matching is case-insensitive.


    Значит для решения вопроса про "соответствие на 100%", надо делать проверку на уровне приложения, дополнительно обрабатывая результаты поиска.
    Ответ написан
  • Как проверить наличие переменной в POST?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    опечатка в имени переменной. Потеряна одна буква "r"
    $fistname = $_POST['firstname']; 
    !empty($firstname)


    $fistname
    $firstname

    А проверка через isset() + empty()
    $firstname = isset($_POST['firstname']) ? $_POST['firstname'] : '';
    if(!empty($firstname))
    { 
     ///
    }
    Ответ написан