Задать вопрос
Ответы пользователя по тегу PHP
  • Let's Encrypt конфликтует с MySQL?

    @Hanneman
    ' в строке let's encrypt портит запрос, так эта строка в запросе выглядит так: ' let's encypt'.
    Читайте про экранирование символов.
    Ответ написан
    Комментировать
  • Почему не работает SOAP запрос?

    @Hanneman
    Ну, факт, что у вас с namespace где-то намудрено или отсутствует составная часть тела запроса:
    Постарайтесь сделать так: либо распечатайте весь текст SOAP-запроса, либо перехватите пакеты с помощью, к примеру, Wireshark или smsniff. Рабочий запрос должен выглядеть как-то так:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0">
       <soapenv:Header/>
       <soapenv:Body>
          <ns:GetMessageRequest>
             <ns:Message>
                <AuthRequest xsi:schemaLocation="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0 schema.xsd" xmlns="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                   <AuthAppInfo>
                      <MasterToken>eyJhbGciOiJIUzI1NiIsInR5cCI6...</MasterToken>
                   </AuthAppInfo>
                </AuthRequest>
             </ns:Message>
          </ns:GetMessageRequest>
       </soapenv:Body>
    </soapenv:Envelope>

    Ответ (потому что не из РФ):
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
       <soap:Body>
          <soap:Fault>
             <faultcode>soap:Server</faultcode>
             <faultstring>Доступ к сервису для переданного IP, запрещён</faultstring>
          </soap:Fault>
       </soap:Body>
    </soap:Envelope>


    Я вот к чему: если у вас пусто, как в примере (или namespace чего-то там не того), то при запросе вида
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0">
       <soapenv:Header/>
       <soapenv:Body>
          <ns:GetMessageRequest>
             <ns:Message>
                <!--You may enter ANY elements at this point-->
             </ns:Message>
          </ns:GetMessageRequest>
       </soapenv:Body>
    </soapenv:Envelope>

    То получите и ответ, как в вашем примере:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
       <soap:Body>
          <soap:Fault>
             <faultcode>soap:Client</faultcode>
             <faultstring>Unmarshalling Error: cvc-complex-type.2.4.b: The content of element 'ns:Message' is not complete. One of '{WC[##other:"urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0"]}' is expected.</faultstring>
          </soap:Fault>
       </soap:Body>
    </soap:Envelope>
    Ответ написан
  • Как мне вставить JS в PHP код?

    @Hanneman
    Очень просто:
    <?php
    $a = true;
    if ($a) {
        echo "<script>alert(\"Hello\");</script>";
    }
    ?>

    Учитывая ваш "я хочу изменять текст под паролем", то вот подробнее:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
    <p id="someid"></p>
        <?php
        $a = true;
        if ($a) {
            echo "<script>document.getElementById(\"someid\").innerHTML = \"Пароль неверен!\";</script>";
        }
        ?>
    </body>
    </html>
    Ответ написан
    3 комментария
  • Как передать заголовки в POST запросе через CURL?

    @Hanneman
    Вот так:
    // Пример набора заголовков
    $headers = [
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Encoding: gzip, deflate',
        'Accept-Language: en-US,en;q=0.5',
        'Cache-Control: no-cache',
        'Content-Type: application/x-www-form-urlencoded; charset=utf-8',
        'Host: www.example.com',
        'Referer: http://www.example.com/index.php', 
        'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0'
    ];
    
    $curl = curl_init();
    curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $link_zapros, //Адрес запроса
    CURLOPT_USERAGENT => 'ctrlv cURL Request',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $data, //Параметры
    CURLOPT_HTTPHEADER => $headers // Заголовки
    ));
    $response = curl_exec($curl);
    curl_close($curl);

    P.S. Логически же легко понять как добавлять в curl_setopt_array, причем в документации прямо и указано
    Ответ написан
    2 комментария
  • Как решить проблему с кавычками?

    @Hanneman
    Не "портя" ваш замысел относительно того, как должен выглядеть ваш результат в виде HTML, то тогда так надо:
    echo "</div><div class=\"buttons\"><a data-fancybox data-src=\"#call\" href=\"javascript:;\" class=\"order button\">Заказать выезд мастера</a><br><a href=\"https://api.whatsapp.com/send?phone=";
    echo the_field('whatsapp', 17);
    echo "\" class=\"whatsapp messenger-buttons\" title=\"WhatsApp\" onclick=\"ym(66111247, 'reachGoal', 'WhatsApp'); return true;\"><span>Написать в WhatsApp</span></a></div></div></div>";
    Ответ написан
    Комментировать
  • Почему не записывает запись в MySQL?

    @Hanneman
    Как минимум, вы должны:
    1. Проверить/предоставить структуру таблицы (мало ли типы данных не совпадают или структура?)
    2. Проверить, работает ли сам запрос, если в него подставить данные и напрямую через консоль базы запустить.
    3. Проверить, что за данные передаете в код для переменных $email, $pass и $pass2 (откуда всем знать, что там в них?)
    4. Использовать PDO, так как mysql_query устарел и больше так никто не пишет, как в вашем допотопном примере чужого кода, взятого с просторов Интернета.
    Ответ написан
  • Почему не срабатывает PHP на Open Server?

    @Hanneman
    Потому что путь до php в системном пути не прописан.
    5eeb3abbea21c906549488.png
    Кнопка Environment Variables -> в новом окне выделить Path, нажать Edit и добавить путь до php. Открыть терминал заново и попробовать.
    Либо без всего этого указывать полный путь до php.exe в терминале каждый раз.
    Ответ написан
    6 комментариев
  • Как перенаправить на другую страницу?

    @Hanneman
    Так:
    window.location.href = "http://www.example.com";
    Или так:
    window.location.replace("http://www.example.com");
    Ответ написан
  • Как увеличить время жизни Cookie?

    @Hanneman
    Их сайт выставляет, а не ваш. Они мониторят посетителя, который перешёл с вашего сайта и посылают ему cookies, срок у которых 24 часа - это их политика. То есть человек, который перешёл по ссылке с вашего сайта, будет считаться перешедшим по партнёрской программе сутки и не более. Если человек перешёл от вас, но не купил ничего за 24 часа, а потом через 2 дня зашёл на их сайт, то cookies уже просрочены и их сайт не засчитает вам партнёрский переход.

    А вы "свои" cookies хоть на 10 лет выдавайте - вашему партнерскому сайту это по барабану. Они не ваши cookies читают, а свои.
    Ответ написан
    Комментировать
  • Как правильно подключиться через PHP SOAP к API booking-manager?

    @Hanneman
    Выношу в ответ: ошибки технической нет, так как, применяя ваши реальные параметры авторизации, все работает. Что касается ошибки 102, то это функциональная логическая ошибка со стороны сервера - ему не нравится значение компании 635, так как элементарно подставляя компанию с идентификатором 634, все работает на техническом уровне и ответ возвращается корректный (проверьте, что не так с компанией 635):

    P.S. Уберите реальные данные авторизации из темы и из вашего ответа кода (на всякий случай).

    Запрос:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:cbm="http://cbm.mmk.com">
        <soapenv:Header/>
        <soapenv:Body>
            <cbm:getAvailabilityInfo>
                <cbm:in0>2547</cbm:in0>
                <cbm:in1>info@xxxx-xxxxxxx.de</cbm:in1>
                <cbm:in2>yourPassword</cbm:in2>
                <cbm:in3>634</cbm:in3>
                <cbm:in4>2019</cbm:in4>
                <cbm:in5>false</cbm:in5>
                <cbm:in6>1970-01-01T03:00:00</cbm:in6>
            </cbm:getAvailabilityInfo>
        </soapenv:Body>
    </soapenv:Envelope>


    Ответ:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Body>
            <ns1:getAvailabilityInfoResponse xmlns:ns1="http://cbm.mmk.com">
                <ns1:out><![CDATA[<root company_id="634" checktime="1566366427662">
    <reservation id="1806870766300634" resourceid="279865120000100634" status="Reservation" blocksavailability="1" datefrom="2018-12-31" dateto="2019-01-14" basefrom="85" baseto="85" optionexpirydate="2018-08-22" created="2018-08-15" lastmodified="2018-08-15" companyid="634" />
    <reservation id="2090990766300634" resourceid="1684801290000100634" status="Reservation" blocksavailability="1" datefrom="2019-02-04" dateto="2019-02-07" basefrom="85" baseto="85" optionexpirydate="2019-02-05" created="2019-02-04" lastmodified="2019-02-04" companyid="634" />
    <reservation id="2206700766300634" resourceid="1684387260000100634" status="Canceled" blocksavailability="0" datefrom="2019-12-13" dateto="2019-12-25" basefrom="85" baseto="85" optionexpirydate="2019-06-05" created="2019-05-28" lastmodified="2019-06-06" companyid="634" />
    <reservation id="1818390766300634" resourceid="279866040000100634" status="Reservation" blocksavailability="1" datefrom="2019-03-16" dateto="2019-03-26" basefrom="85" baseto="85" optionexpirydate="2018-08-23" created="2018-08-16" lastmodified="2018-08-16" companyid="634" />
    <reservation id="2198150766300634" resourceid="2178580766300634" status="Canceled" blocksavailability="0" datefrom="2019-08-17" dateto="2019-08-24" basefrom="85" baseto="85" optionexpirydate="2019-05-26" created="2019-05-20" lastmodified="2019-05-27" companyid="634" />
    </root>]]></ns1:out>
            </ns1:getAvailabilityInfoResponse>
        </soap:Body>
    </soap:Envelope>
    Ответ написан
    Комментировать
  • Как отправить json файл?

    @Hanneman
    Endpoint работает, но токен устарел:
    POST /core/latest/api/devices/343438357237630F/downlinkMessages HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA3NSJdLCJleHAiOjM2NzIxNDY2NTEsImp0aSI6ImY4MDFkODcyLWNlYjMtNDY0MS1iNmZiLWU2N2NlZmM0MGMzYiIsImNsaWVudF9pZCI6ImVydGVsZWNvbS1hcGkvdmFydmFyYS5ydWRlbmtvMUBkb21ydS5ydSJ9.kdQqIHpVdTE-1N5K9cTC872TkzhCKMIH0uU2FGWHW3n3nSGiDlP5pG5rs4jb_4xRmvZ4hJ20IsgXNj5-hcmuw
    Content-type: application/json
    Accept: application/json
    Content-Length: 44
    Host: dx-api-ru1.thingpark.com
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
    
    {"payloadHex": "030100", "targetPorts": "2"}


    Ответ от сервера:
    HTTP/1.1 400 Bad Request
    Server=nginx
    Date=Mon, 05 Aug 2019 14:25:40 GMT
    Content-Length=103
    Connection=keep-alive
    {
      "code" : 400,
      "message" : "Bad request: Invalid token or token has expired",
      "errorId" : null
    }


    Вот сам CURL:
    curl -s -X POST -H "Content-type: application/json" -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA3NSJdLCJleHAiOjM2NzIxNDY2NTEsImp0aSI6ImY4MDFkODcyLWNlYjMtNDY0MS1iNmZiLWU2N2NlZmM0MGMzYiIsImNsaWVudF9pZCI6ImVydGVsZWNvbS1hcGkvdmFydmFyYS5ydWRlbmtvMUBkb21ydS5ydSJ9.kdQqIHpVdTE-1N5K9cTC872TkzhCKMIH0uU2FGWHW3n3nSGiDlP5pG5rs4jb_4xRmvZ4hJ20IsgXNj5-hcmuw' -d '{"payloadHex": "030100", "targetPorts": "2"}' https://dx-api-ru1.thingpark.com/core/latest/api/devices/343438357237630F/downlinkMessages


    Ну и разжеванный код на PHP:
    <?php
        $url = 'https://dx-api-ru1.thingpark.com/core/latest/api/devices/343438357237630F/downlinkMessages';
        $ch = curl_init($url);
        $data = array(
            'payloadHex' => '030100',
            'targetPorts' => '2'
        );
        $payload = json_encode($data);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA3NSJdLCJleHAiOjM2NzIxNDY2NTEsImp0aSI6ImY4MDFkODcyLWNlYjMtNDY0MS1iNmZiLWU2N2NlZmM0MGMzYiIsImNsaWVudF9pZCI6ImVydGVsZWNvbS1hcGkvdmFydmFyYS5ydWRlbmtvMUBkb21ydS5ydSJ9.kdQqIHpVdTE-1N5K9cTC872TkzhCKMIH0uU2FGWHW3n3nSGiDlP5pG5rs4jb_4xRmvZ4hJ20IsgXNj5-hcmuw'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        echo $result = curl_exec($ch);
        curl_close($ch);
    ?>
    Ответ написан
    Комментировать
  • Почему не работает код?

    @Hanneman
    Потому что надо экранировать
    while($row = mysqli_fetch_assoc($query)) echo "<h1><div class=\"film-card\">".$row['name']."</h1></div><p>".$row['year']."</p><br>";
    Ответ написан
    1 комментарий
  • Как подключить сервис бронирования по SOAP XML API к сайту на wordpress?

    @Hanneman
    Здесь проблема в том, что ваше понимание сути того, что необходимо сделать, расходится с реальным положением дел.

    Скажем так: вам «подключение сервиса бронирования» кажется задачей на раз-два: есть некий WSDL у них, а у вас WordPress, – так что бы такое в WordPress включить, чтобы вся та информация с того сайта красиво отобразилась бы у вас на странице.

    SOAP API – это интерфейс, позволяющий получать данные или их логические порции. Порядком вызова методов SOAP API, обработкой информации, построением логики вызовов и сборкой этих данных должны заниматься вы, а не WordPress – то есть необходимо написать некий серверный сценарий, который будет общаться с SOAP API, вызывая методы в нужном вам, и в какой-то мере определенной логикой сервиса, порядке.

    Т.е. SOAP API не дает вам за один присест получить какой-то правильный набор данных вместе с логикой – это интеракция, которая основана на сборе данных их формы, расположенной на вашем сайте, компоновке запроса в формате SOAP, получении данных в ответе, при необходимости, вызове следующего метода (или методов) SOAP API, обработке ответа, и подстановка структурированных данных из ответа в тот же самый HTML вашей страницы.

    Допустим, ваш посетитель сайта хочет получить список свободных яхт, удовлетворяющих условиям (указанным им же в форме поиска на сайте) - клиент ищет яхту на Кипре, на 15-е июля, на 4-х человек, цена 500-800$, с рулевым, плюс какие-то дополнительные параметры. После нажатия символической кнопки «Искать» данные из формы передаются в некий серверный скрипт, в котором описана логика взаимодействия с SOAP API.

    Далее будет приблизительное и возможное описание логики (за подробной в документацию) – как это может выглядеть.

    Скрипт:
    1. Берет параметры из формы
    2. Вызывает, к примеру, метод «getBases», передавая код страны аргументом
    3. Получает список портов
    4. Вызывает, к примеру, метод «getResources», передавая код порта (или коды портов) аргументом
    5. Получает список яхт
    6. Вызывает, к примеру, методы «isResourceAvailable» и «getReservations», передавая желаемые даты
    7. Получает ответы
    8. Отображает на странице
    9. Пользователь нажимает «Подробно» на конкретном варианте
    10. Скрипт вызывает, к примеру, методы «getResourceDetails», «getResourceDiscount» и «getActiveReservation»
    11. Отображает подробное описание яхты с параметрами скидок, графика, цены
    12. Пользователь нажимает «Заказать»
    13. Заполняет форму с данными пасажиров
    14. Скрипт заносит данные, вызывая методы «insertCrewMember» и «confirmReservation»
    15. Пользователь нажимает «Оплатить»
    16. Скрипт заносит данные, вызывая метод «insertPayment» и производит все, связанное с оплатой, вызывает «getInvoices» и отправляет его на почту пользователю.

    Все выше – это приблизительный сценарий, само собой. Если вы внимательно посмотрите на доступные методы (они все описаны в документации), то вынесете идею из всего этого – методы представляют собой логически завершенные единицы получения/занесения информации. Это логические блоки, которые вы вызываете в том порядке, который подходит вашей логике – в этом смысл такого рода API: есть страна – смотрим, есть ли такая в базе, если есть страна в списке обслуживаемых – то какие порты, есть порты – то какие яхты есть вообще там, если есть яхты – то смотрим, удовлетворяют ли заданным пользователем характеристикам, отображаем на странице списком, пользователь выбирает детальную информацию – берем детальную, отображаем, пользователь начинает процесс – вызываем методы резервации и оплаты и т.д. Все зависит от вашей бизнес-логики. Да, конечно, могут быть у них и веб-сервисы, которые за раз (за один запрос) могут принимать на вход все параметры, указанные пользователем в форме (зависит от разработчика на стороне того сервиса яхт - но стоит помнить, что в программировании приветствуется принцип "один метод - одна задача") - страна, порт, количество людей, время, ценовой диапазон и пр., но это опять же не меняет суть - поиск осуществляться будет посредством вызова одного метода, резервация - вызовом другого, оплата - вызовом третьего и т.д.

    Так что здесь нет какой-то простой интеграции API с WordPress - чтобы «одним нажатием» бизнес-логику наворотить. Это не только вёрстка, а программная логика многошаговой интеракции с пользователем плюс отображение на странице.

    Ну а сам XML-SOAP запрос-ответ выглядит так

    Запрос:
    POST /cbm_web_service2/services/CBM HTTP/1.1
    Accept-Encoding: gzip,deflate
    Content-Type: text/xml;charset=UTF-8
    SOAPAction: ""
    Content-Length: 352
    Host: www.booking-manager.com
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:cbm="http://cbm.mmk.com">
       <soapenv:Header/>
       <soapenv:Body>
          <cbm:getCompanies>
             <cbm:in0>1000</cbm:in0>
             <cbm:in1>username</cbm:in1>
             <cbm:in2>password</cbm:in2>
          </cbm:getCompanies>
       </soapenv:Body>
    </soapenv:Envelope>


    Ответ (здесь код 500, так как у меня же нет реальных username/password - но это не суть важно)
    HTTP/1.1 500 Internal Server Error
    Date: Mon, 01 Jul 2019 06:58:23 GMT
    Server: Apache/2.4.25 (Debian)
    Content-Type: text/xml;charset=UTF-8
    Connection: close
    Transfer-Encoding: chunked

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Body>
            <soap:Fault>
                <faultcode>soap:Server</faultcode>
                <faultstring>XML disabled for company 1000</faultstring>
                <detail>
                    <errorcode>-1</errorcode>
                    <errormessage>XML disabled for company 1000</errormessage>
                </detail>
            </soap:Fault>
        </soap:Body>
    </soap:Envelope>
    Ответ написан
  • Как в консоли SSH следить за работой PHP?

    @Hanneman
    Запустите от пользователя root (ну или через sudo) и наблюдайте за трафиком:

    tcpdump -vvv -i any port 80

    Это самый банальный пример для tcpdump с минимальным количеством опций. Если нужно что-то добавить или изменить (порт, например) - в сети масса примеров.
    Ответ написан
    2 комментария
  • Как реализовать смс валидацию номера перед регистрацией в форме?

    @Hanneman
    Схема предельно проста:
    1. Заключаете договор с компанией, занимающейся рассылкой СМС, например CMC Аэро
    2. Получаете доступ к их API
    3. При регистрации пользователя генерируете код, например 234567, сохраняете в базе
    4. Отправляете через API СМС пользователю
    5. Пользователь вводит код в форму
    6. Сверяете с тем, что в базе

    Ну вот и всё.
    Ответ написан
    Комментировать
  • MySQL+PHP: Почему не могу записать данные в структуру?

    @Hanneman
    В коде принято выводить и обрабатывать ошибки - возьмите за правило.

    В коде хотя бы сейчас:
    1. Выведите сформированный запрос на экран с помощью print.
    2. Его же и с консоли в базу напрямую запустите.

    Если не сработает, смотрите соответствия типа данных с полями таблицы.

    Ну а далее сюда скиньте, так как без ошибок и конфигурации полей мало кто вам чем поможет.
    Ответ написан
    1 комментарий
  • Как подключиться к mysql серверу с другого сервера?

    @Hanneman
    Тот факт, что внешний доступ открыт в настройках базы, не отменяет того, что в настройках firewall на том самом сервере открыт порт.
    Порт может быть и отличным от стандартного 3306.
    В настройках базы внешний доступ может быть открыт не для всех IP.
    Для таких целей, если не имеется доступа прямого на тот сервер (чтобы проверить настройки), берете типичный анализатор пакетов, например, Wireshark, запускаете локально и смотрите, что там у вас на уровне TCP в момент подключения. Ну или, если Linux локально, то можно и tcpdump-ом смотреть.
    Пока что эти шаги выполните, напишите что и как, а дальше посмотрим.
    Ответ написан
    1 комментарий
  • Почему не работает namespace (php)?

    @Hanneman
    lexstile, Скачал ваш архив. Ну так у вас же в Router.php перед объявлением символ табуляции. И в слове namespace вместо английской 'c' символ в другой кодировке. Исправьте.
    5baf9ad9aca95089441904.png5baf9ae44e063667634509.png
    В любом редакторе видно:
    5baf9e5dbe22a420329949.png
    И ваш файл создан в ANSI (и этот символ не различишь визуально в том же самом Notepad++, пока не Encode in UTF-8 не сделаешь). Здесь вам совет: все файлы создавайте и храните в кодировке Unicode/UTF-8 (пока не потребуется иначе).

    P.S. Вы ни разу не скопировали хотя бы разок мой код из комментариев и не запустили? Визуально сравнивали только? :)
    Ответ написан
    3 комментария