Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » Простенький вопрос по PHP

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Открыть новую тему     Написать ответ в эту тему

kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
 
Решил немного экспериментировать и с помощью ChatGPT 3.5 создать админ панель для сайта, где все страницы на HTML. Сам процесс интересен, и это будет какой-то опыт.
 
Идея заключается в том, чтобы изначально отслеживать просмотры каждой страницы (html) и выводить все данные в админ панель. В дальнейшем, возможно, улучшить и добавить новый функционал. С некоторыми сложностями, но мне удалось создать и оформить все как мне нужно при помощи ChatGPT.
 
Теперь возникла проблема. Как подключить PHP файл на HTML страницах, чтобы он срабатывал и выполнял указанные в нем функции, а также записывал нужные данные в БД. ChatGPT предлагал разные варианты, такие как include, AJAX, но особо ничего не получилось. При прямом обращении к PHP файлу все работает, все данные записываются в БД, но нужно чтобы все это работало на HTML страницах сайтах, так как именно в этом заключается суть. У меня есть базовые знания HTML, CSS, но, к сожалению, PHP изучал только в общих чертах.  
 
Буду признателен за любые советы и подсказки, заранее спасибо.
 
 
stats.php

Код:
<?php
// Включение отображения ошибок на странице
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
 
// Включение логирования ошибок в файл
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/error.log');
 
// Подключение к базе данных
function connectToDatabase() {
    $servername = "localhost"; // Имя сервера
    $username = "dbusername"; // Имя пользователя базы данных
    $password = "dbpassword"; // Пароль пользователя базы данных
    $dbname = "dbname"; // Имя базы данных
 
    // Создание подключения
    $conn = new mysqli($servername, $username, $password, $dbname);
 
    // Проверка соединения
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
     
    return $conn;
}
 
// Получение HTML-контента с использованием cURL
function getHTMLContent($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $content = curl_exec($curl);
    curl_close($curl);
    return $content;
}
 
// Получение данных из HTML-контента
function getDataFromHTML($html) {
    preg_match('/<title>(.*?)<\/title>/', $html, $matches);
    $gameName = isset($matches[1]) ? trim(explode('-', $matches[1])[0]) : "Unknown";
    return $gameName;
}
 
// Обновление счетчика просмотров страницы
function updatePageViews($conn, $date, $gameName, $gameLink, $ipAddress) {
    // Проверка, считался ли уже уник для данного IP
    $stmt = $conn->prepare("SELECT COUNT(*) AS count FROM visit_statistics WHERE ip_address = ? AND visit_date = ?");
    if (!$stmt) {
        error_log("Ошибка подготовки запроса: (" . $conn->errno . ") " . $conn->error);
        return;
    }
    $stmt->bind_param("ss", $ipAddress, $date);
    if (!$stmt->execute()) {
        error_log("Ошибка выполнения запроса: (" . $stmt->errno . ") " . $stmt->error);
        return;
    }
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $stmt->close();
 
    if ($row['count'] == 0) {
        // Уника не считался для этого IP в текущий день, добавляем новую запись
        $stmt = $conn->prepare("INSERT INTO visit_statistics (visit_date, game_name, game_link, hits, uniques, ip_address) VALUES (?, ?, ?, 1, 1, ?)");
        if (!$stmt) {
            error_log("Ошибка подготовки запроса: (" . $conn->errno . ") " . $conn->error);
            return;
        }
        $stmt->bind_param("ssss", $date, $gameName, $gameLink, $ipAddress);
        if (!$stmt->execute()) {
            error_log("Ошибка выполнения запроса: (" . $stmt->errno . ") " . $stmt->error);
            return;
        }
        $stmt->close();
    } else {
        // Уника уже считался для этого IP в текущий день, увеличиваем только счетчик hits
        $stmt = $conn->prepare("UPDATE visit_statistics SET hits = hits + 1 WHERE game_name = ? AND game_link = ? AND visit_date = ? AND ip_address = ?");
        if (!$stmt) {
            error_log("Ошибка подготовки запроса: (" . $conn->errno . ") " . $conn->error);
            return;
        }
        $stmt->bind_param("ssss", $gameName, $gameLink, $date, $ipAddress);
        if (!$stmt->execute()) {
            error_log("Ошибка выполнения запроса: (" . $stmt->errno . ") " . $stmt->error);
            return;
        }
        $stmt->close();
    }
}
 
// Основная логика
$conn = connectToDatabase();
$url = 'https://site.ru';
$html = getHTMLContent($url);
$gameName = getDataFromHTML($html);
$date = date("Y-m-d");
$pageUrl = $_SERVER['REQUEST_URI'];
$ipAddress = $_SERVER['REMOTE_ADDR'];
$gameLink = "https://site.ru" . parse_url($pageUrl)['path'];
 
updatePageViews($conn, $date, $gameName, $gameLink, $ipAddress);
 
$conn->close();
?>
 

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 21:13 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77
так чем мой ответ не устраивает?
расширение файла для веба роли не играет, важно как его понимает сервер и какие заголовки возвращаются.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 21:15 21-02-2024 | Исправлено: Mavrikii, 21:16 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, вполне устраивает)  
Я понял, что можно изменить все расширения .html на .php, но как в итоге подключить мой stats.php, чтобы он срабатывал правильно и корректно, как указано в самом коде?

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 21:23 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
но как в итоге подключить мой stats.ph

вставить, где хочется

Код:
<?php
include 'stats.php';
?>

https://php.ru/manual/function.include.html

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 21:27 21-02-2024 | Исправлено: Mavrikii, 21:28 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, все бы хорошо, но у меня сервер зависает из-за такого подключения. По-видимому, файл постоянно начал выполняться без остановки, а не только при посещении или обновлении страницы.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 21:38 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
По-видимому, файл постоянно начал выполняться без остановки,

у вас нет в нем циклов, чтобы подвешивать.
 

Цитата:
$url = 'https://site.ru';

сайт запрашивает сам себя?

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 21:41 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, более 600 просмотров добавилось в статистике и БД при одном посещении страницы. Из за этого и все зависло, впечатление что файл выполняется без остановки. Сделал повторный тест подключив снова инклуд, и опять более 400 просмотров добавилось.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 21:50 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77
на вопрос ответите?
 

Цитата:
сайт запрашивает сам себя?


Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 21:51 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, я не понял суть вашего вопроса, если честно. Как сайт может запрашивать сам себя? Какие факторы могут влиять на это?
 
Вот что мне GTP ответил:
"Например, в вашем случае, когда PHP-скрипт stats.php выполняется на сервере при запросе страницы index.php, он обновляет счетчик просмотров страницы. Таким образом, сервер фактически "запрашивает" сам себя, когда PHP-скрипт выполняется на сервере."

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 21:55 21-02-2024 | Исправлено: kodex77, 21:57 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
я не понял суть вашего вопроса, если честно. Как сайт может запрашивать сам себя? Какие факторы могут влиять на это?

я показал кусок, там URL этой же страницы, в которую подключается php скрипт?

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 21:57 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, нет, там URL моего сайта стоит, я просто решил не выставлять на форуме само название.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 22:01 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
нет, там URL моего сайта стои

я об этом и спросил. ессно при каждом запросе скрипта к сайту, как у вас написано, он снова запускает этот скрипт и так в рекурсии.
не нужно "писать" с помощью GPT если не понимаете, что за код получается и как он работает.
 
делать http запрос к странице на сайте же, только для того, чтобы получить title.. это так расточитально и задерживает отрисовку страницы.
 

Код:
<?php
$title = 'Тайтл страницы';
?><!doctype html>
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
...
<?php
include 'stats.php';
?>
</body>
</html>

 
тогда в stats.php нижний кусок просто

Код:
// Основная логика
$conn = connectToDatabase();
$date = date("Y-m-d");
$gameLink = $_SERVER['REQUEST_URI'];
$ipAddress = $_SERVER['REMOTE_ADDR'];
 
updatePageViews($conn, $date, $title, $gameLink, $ipAddress);
 
$conn->close();

 
и вот это не нужно

Код:
// Получение HTML-контента с использованием cURL
function getHTMLContent($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $content = curl_exec($curl);
    curl_close($curl);
    return $content;
}
 
// Получение данных из HTML-контента
function getDataFromHTML($html) {
    preg_match('/<title>(.*?)<\/title>/', $html, $matches);
    $gameName = isset($matches[1]) ? trim(explode('-', $matches[1])[0]) : "Unknown";
    return $gameName;
}

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 22:06 21-02-2024 | Исправлено: Mavrikii, 22:12 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
не нужно "писать" с помощью GPT если не понимаете, что за код получается и как он работает.

Это во первых интересный процесс, во вторых есть некоторое базовое понимание кода, к сожалению его не хватает чтобы разобраться в таких ситуациях, но думаю это вполне неплохой опыт изучить и познать что-то новое.  
 
Mavrikii, получается, если полностью убрать $gameName из кода (по идее он не так важен, ссылки хватит) из stats.php, то проблемы не будет больше?

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 23:01 21-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
получается, если полностью убрать $gameName из кода (по идее он не так важен, ссылки хватит)

Я его не совсем убрал, а определил как переменная в странице. Она отображает значение в  <title> страницы и передаётся в stats.php, чтобы не делать ненужные и проблемные запросы к сайту.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 23:08 21-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, спасибо большое за ответы и помощь.  
 
Исходя из того примера что вы написали, я решил немного переделать. Чтобы не передавать длинные названия из title в админ панель, я решил оставить title как есть, вместо этого использовать $gameName и указывать названия вручную. Как раз в БД у меня есть таблица game_name и данные будут также там записаны.  
 
stats.php  
 

Код:
// Основная логика
$conn = connectToDatabase();
$date = date("Y-m-d");
$gameLink = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$ipAddress = $_SERVER['REMOTE_ADDR'];
 
updatePageViews($conn, $date, $gameName, $gameLink, $ipAddress);
 
$conn->close();
?>

 
Подключаю файл в index.php, все отлично работает, данные записываются в БД и передаются в админ панель.  
 

Код:
<?php
$gameName = 'Главная страница';
include 'admin/stats.php';
?>
<!DOCTYPE html>
<html>

 
   
 
Пробую подключить stats.php на других страницах, но ничего не работает, никакие данные в БД не добавляются. Каждая игра находится в отдельной папке со своим шаблоном, для информации.
 

Код:
<?php
$gameName = 'Топ игра';
include '../admin/stats.php';
?>

 
Путь к stats.php пробовал указывать по разному, не помогает.  
Где я допускаю ошибку, что на других страницах не работает?

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 13:44 22-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
Путь к stats.php пробовал указывать по разному, не помогает.  
Где я допускаю ошибку, что на других страницах не работает?

файловую структуру показывайте. либо замените include на require, тогда будет вылетать с ошибкой, если файл stats.php не найден.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 23:31 22-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, попробовал require, указанный вариант выше правильный.  
 
Структура такая:  
 
/index.php
 
/game1/index.php
/game2/ndex.php
 
/admin/admin.php
/admin/stats.php
 
В error.log тоже ошибок нет.  
Не понимаю почему тогда работает только на главной - index.php

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 14:08 23-02-2024 | Исправлено: kodex77, 14:08 23-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
попробовал require,

Страница при этом отображается нормально?
И других файлов нет в папках? index.html, к примеру

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 15:35 23-02-2024 | Исправлено: Mavrikii, 15:46 23-02-2024
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, да, проблем никаких нет.  
Я даже попробовал изменить адрес stats.php для проверки, тогда страница не открывалась и возникала ошибка.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 15:37 23-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
И других файлов нет в папках? index.html, к примеру


Цитата:
страница не открывалась и возникала ошибка.

Значит проблема не в этом. Почему решили, что не работает?

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 15:46 23-02-2024 | Исправлено: Mavrikii, 15:48 23-02-2024
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » Простенький вопрос по PHP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru