• Как правильно читать(видеть) счетчик(рекламную вставку) на сайте? И правильно интерпретировать?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Похоже на скрипт для сбора статистики о посетителях сайта, такой как количество просмотров страницы, источник трафика, поведение пользователя на сайте и другие метрики.

    src="URI#1.px.png?r=123123&pr=false&u=URI#2" - ссылка на изображение, которое загружается на страницу
    Параметры в URL (r=123123&pr=false&u=URI#2) могут использоваться для передачи информации на сервер. Например, r может быть случайным числом для предотвращения кэширования, pr может указывать на какой-то параметр (например, pr=false может означать "промоция отсутствует"), а u может содержать информацию об URL, с которого был совершен переход.
    Ответ написан
    Комментировать
  • Как на сайте отобразить MJPG поток, который требует digest авторизации?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Это не будет работать в таком виде, потому что это на уровне браузера стоит защита от таких вот конструкций. Вы правильно указали, что без PHP тут не обойтись. Я бы как-то решила этот вопрос:

    <?php
    $url = 'http://192.168.1.8/cgi-bin/mjpg/video.cgi?channel=1&subtype=1';
    
    // Функция для digest-авторизации
    function digest_parse($txt)
    {
        $needed_parts = array('nonce'=>1, 'realm'=>1, 'qop'=>1);
        $data = array();
        $keys = implode('|', array_keys($needed_parts));
    
        preg_match_all('@('.$keys.')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
    
        foreach ($matches as $m) {
            $data[$m[1]] = $m[3] ? $m[3] : $m[4];
            unset($needed_parts[$m[1]]);
        }
    
        return $needed_parts ? false : $data;
    }
    
    // Инициализация cURL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    
    // получения заголовков www-Authenticate
    $response = curl_exec($ch);
    
    // разбор заголовк а WWW-Authenticate
    if (preg_match('/^WWW-Authenticate: Digest (.*)$/im', $response, $matches)) {
        $digest_parts = digest_parse($matches[1]);
    
        // Создание заголовка Authorization
        // Здесь также надо сгенерить правильный ответ на основе полученных данных и вашего логина и пароля
        // наподобие этого
        $digest_response = ''; // ответ
    
        // Установка опций для cURL с заголовком Authorization
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Digest username="adminka", realm="'.$digest_parts['realm'].'", nonce="'.$digest_parts['nonce'].'", uri="/cgi-bin/mjpg/video.cgi?channel=1&subtype=1", response="'.$digest_response.'", qop='.$digest_parts['qop'].', nc=00000001, cnonce="d41d8cd98f00b204e9800998ecf8427e"'));
    }
    
    // Удаление предыдущих заголовков
    curl_setopt($ch, CURLOPT_HEADER, 0);
    
    // Передача потока клиенту
    curl_exec($ch);
    curl_close($ch);
    ?>


    Ну а потом уже смело в теге img можно сделать так:
    <img src="вашскрипт.php" width="720" height="480">

    Пример с PHP кодом не полный - я лишь натолкнула вас на мысль, как это может работать. Удачи!
    Ответ написан
    1 комментарий
  • Почему nginx выдает 403 ошибку?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Ну, вообще ошибка 403 - это явно то что Nginx не имеет прав на доступ к файлам или директориям, которые пытается открыть.

    Попробуйте еще раз изменить владельца и права такой командой:

    sudo chown -R www-data:имя_пользователя /home/dkfire/code/php/dkfire
    sudo chmod -R 755 /home/dkfire/code/php/dkfire


    Попробуйте, ошибка 403 должна исчезнуть.
    Ответ написан
    4 комментария
  • Как правильно задать запрос UPDATE где название столбца переменная?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Как насчет оператора CASE?

    $sql = "UPDATE `list` 
            SET count1 = CASE WHEN id = ? AND ? = 1 THEN count1 - ? ELSE count1 END,
                count2 = CASE WHEN id = ? AND ? = 2 THEN count2 - ? ELSE count2 END,
                count3 = CASE WHEN id = ? AND ? = 3 THEN count3 - ? ELSE count3 END
            WHERE id = ?";
    
    $stmt = $conn->prepare($sql);
    
    foreach ($data as $id => $value) {
        $idParts = explode("-", $id);
        $count = $value['count'];
        $stmt->execute([$idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0]]);
    }


    Здесь используется оператор CASE для обновления нужного столбца в зависимости от значения $idParts[1]. Если $idParts[1] не соответствует ни одному из условий, то значение столбца остается неизменным. Ну и не забываем про подготовленный запрос prepare чтобы избежать возможной инъекции
    Ответ написан
    7 комментариев
  • Как заменить хештеги в html документе на ссылки, за исключением фрагментов исходного кода?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Может так получится?

    function replaceHashtagsWithLinks(html) {
      // Регулярное выражение для поиска хештегов
      const hashtagRegex = /(?<!\<code\>|\<pre\>)#\w+/g;
    
      // Функция для замены найденных хештегов на ссылки
      function replaceHashtagWithLink(match) {
        const hashtag = match.substring(1); // Убираем # из хештега
        return `<a href="https://example.com/hashtag/${hashtag}">${match}</a>`;
      }
    
      // Заменяем хештеги на ссылки
      const replacedHtml = html.replace(hashtagRegex, replaceHashtagWithLink);
    
      return replacedHtml;
    }
    
    const processedHtml = replaceHashtagsWithLinks(html);
    console.log(processedHtml);


    Ну а код статьи выглядел бы так:

    <p>Это #хэштег в тексте, а это <code>#код</code>.</p>
      <pre>#Это тоже код</pre>
      <p>Другой #тег и другая жизнь</p>
    Ответ написан
    Комментировать
  • Как в PHP выполнить запрос, который постоянно (?) отвечает?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Работа с потоками данных может быть сложной задачей, особенно если вы хотите обработать каждый отдельный ответ независимо. Тут без фреймворка или какой-то спец библиотеки будет тяжело.

    Но, я бы на основе этих данных вот так сделала, а вдруг прокатит?)))

    <?php
    $url = 'http://my-ip/cgi-bin/eventManager.cgi?action=attach&codes=[All]&heartbeat=5';
    
    $context = stream_context_create([
        'http' => [
            'method' => 'GET',
            'header' => 'Connection: close\r\n'
        ]
    ]);
    
    $resource = fopen($url, 'r', false, $context);
    
    while (!feof($resource)) {
        $line = fgets($resource);
        if (strpos($line, '--myboundary') !== false) {
            // Начало нового ответа
            $response = '';
            while (!feof($resource)) {
                $line = fgets($resource);
                if (strpos($line, '--myboundary') !== false) {
                    // Конец ответа
                    break;
                }
                $response .= $line;
            }
            // Обработка ответа
            echo $response;
        }
    }
    
    fclose($resource);
    ?>
    Ответ написан
  • Как решить ошибку отправки почты, с использованием PHPMailer?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Да, без логов определить что именно не так с формой будет сложно
    Ответ написан
    Комментировать
  • После регистрации пользователь в базу таблицы users не попадает..В чем проблема?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Ошибка может быть связана с неправильным использованием fetch в методе user_exist класса Auth. fetch возвращает массив, который содержит все столбцы из следующей строки результирующего набора. Если тебе надо проверить, существует ли пользователь с определенным адресом электронной почты, то нужно проверить, что $result не пустой.

    Также, в методе register класса Auth, ты не проверяешь, успешно ли выполнен запрос. Добавь проверку, чтобы убедиться, что запрос был успешно выполнен.

    Типа того:
    public function user_exist($email){
        $sql = "SELECT email FROM users WHERE email = :email";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute(['email'=>$email]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
    
        return $result ? true : false;
    }
    
    // Новый юзер
    public function register($name, $email, $password){
        $sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :pass)";
        $stmt = $this->conn->prepare($sql);
        $stmt->execute(['name'=>$name, 'email'=>$email, 'pass'=>$password]);
        return $stmt->rowCount() > 0;
    }
    Ответ написан
  • Как сделать, чтобы при каждом обращении к РНР скрипту, он выводил по две новые строки из текстового файла?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    нужно использовать array_slice без shuffle

    Если ты хочешь выводить строки с конца файла, то нужно будет использовать array_slice после array_reverse:
    Вывод по две строки с начала файла:
    $arr = file("reviews.dat");
    $res = array_slice($arr, 0, 2);
    
    foreach ($res as $str) {
        echo $str;
    }


    Вывод по две строки с конца файла:
    $arr = file("reviews.dat");
    $arr = array_reverse($arr);
    $res = array_slice($arr, 0, 2);
    
    foreach ($res as $str) {
        echo $str;
    }
    Ответ написан
    5 комментариев
  • Как вывести на одной странице несколько яндекс карт путем перебора кординат на js?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Вот так попробуйте
    var maps = [];
    var placemarks = [];
    let coordListMap2 = document.getElementsByClassName("contacts-title")
    for(let i = 0; i < coordListMap2.length; i++) {
        (function(i) {
            ymaps.ready(function(){
                var mapId = 'map' + coordListMap2[i].dataset.id;
                maps[i] = new ymaps.Map (mapId, {
                    center: [coordListMap2[i].dataset.coord],
                    zoom: 10
                });
                placemarks[i] = new ymaps.Placemark([coordListMap2[i].dataset.coord], { 
                    iconContent: 'Москва', 
                    balloonContent: 'Столица России' 
                }, {
                    preset: 'twirl#blueStretchyIcon'
                });
            });
        })(i);
    }
    Ответ написан
  • Как расположить элемент в grid контейнере?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    .choice-top-item {
      grid-column: 1 / 3; /* Этот элемент занимает первые две колонки */
      grid-row: 1; /* Это поместит элемент в первую строку */
    }
    Ответ написан
    Комментировать
  • Как убрать scroll у body при открытии модальных окон через vue watch?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    export default {
      data() {
        return {
          isModalAddVisible: false,
          activeId: null,
        };
      },
      watch: {
        isModalAddVisible(newValue) {
          if (newValue || this.activeId) {
            document.body.style.overflow = 'hidden';
          } else {
            document.body.style.overflow = 'auto';
          }
        },
        activeId(newValue) {
          if (this.isModalAddVisible || newValue) {
            document.body.style.overflow = 'hidden';
          } else {
            document.body.style.overflow = 'auto';
          }
        },
      },
    };


    Только не забудь удостовериться, что isModalAddVisible и activeId являются реактивными свойствами в компоненте. Иначе работать не будет
    Ответ написан
    Комментировать
  • Почему вылезает ошибка doc.head is null при полной замене html страницы?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Попробуйте удалить старый "head" с содержимым

    $('head').remove();
    $('html').html(result.code);
    Ответ написан
    Комментировать
  • Как ограничить доступ к странице сайта на устройстве пк браузеров?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Один из способов определения мобильного устройства является глобальный массив $_SERVER. Нас интересует $_SERVER[‘HTTP_USER_AGENT’]:

    function check_mobile_device() { 
    	$mobile_agent_array = array('ipad', 'iphone', 'android', 'pocket', 'palm', 'windows ce', 'windowsce', 'cellphone', 'opera mobi', 'ipod', 'small', 'sharp', 'sonyericsson', 'symbian', 'opera mini', 'nokia', 'htc_', 'samsung', 'motorola', 'smartphone', 'blackberry', 'playstation portable', 'tablet browser');
    	$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    	foreach ($mobile_agent_array as $value) {
    		if (strpos($agent, $value) !== false) return true;
    	}
    	return false;
    }


    Используем так:

    if (check_mobile_device()) {...}
    Ответ написан
    2 комментария
  • Лучше самописный интернет-магазин или на конструкторе?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Если вы будете нанимать разработчиков и скажете им что вам нужен интернет магазин с нуля, то ориентируйтесь на минимум в 4-5 миллионов рублей и сроки в 6-12 месяцев.

    Если делать на готовой CMS - то ориентируйтесь на 50-100 на разработку шаблона, какого-то доп функционала.

    Если делать на готовой CMS но самому - то 0 рублей.

    Если использовать облачный SaaS конструктор - то от 1.5 до 3 т.р. в месяц.
    Ответ написан
    Комментировать
  • Как сохранять высоту textarea при вводе?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Попробуйте так

    <textarea id="myTextarea" oninput="autoResize()"></textarea>


    <script>
    function autoResize() {
          const textarea = document.getElementById('myTextarea');
          textarea.style.height = '';
          textarea.style.height = textarea.scrollHeight + 'px';
    }
    </script>
    Ответ написан
  • Как оформлять телефоны на странице?

    Anastasia2306
    @Anastasia2306
    PHP-разработчик.
    Если сайт на PHP, то проверяйте устройство пользователя и выводите соответствующую ссылку.

    <?php if($devise_type == 'pk') { echo '<span>+7-123-456-78-90</span>'; } ?>
    <?php if($devise_type == 'smartphone') { echo '<a href = "tel:+7-123-456-78-90">+7-123-456-78-90</a>'; } ?>
    Ответ написан
    Комментировать