Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2025, 10:47   #1
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 58
По умолчанию PDO-PHP

Привет. Есть рабочий счётчик посещений, на PHP+mySQL. Решил попробовать с PDO. Работаю на Apach 24+mySQL 8.0. Пообщавшись с ИИ, от гугла, получил следующий код:
Код:
<?php
// вывод предупреждений
Error_Reporting (E_ALL & ~E_NOTICE);
require_once("connect_db.php");
if (!extension_loaded("GD")) {echo"<font color='#ff0000'>Не загружен модуль GD</font>"; exit;}

// определяем ip-адрес и дату
$usip = (isset($_SERVER["REMOTE_ADDR"])) ? $_SERVER["REMOTE_ADDR"] : false;
$date = date("Y-m-d");                                
 
// 1. добавляем данные посетителя, в таблицу 'count' 
$sql = "INSERT INTO count VALUES (:usip, :cookie, :date)"; 
$res = $pdo->prepare($sql);
$par = ['usip' => $usip, 'cookie' => $cookie, 'date' => $date];
$res->execute($par);  
 
// 2. обновление 
$sql = "UPDATE countall SET countall = countall + 1";   
$res2 = $pdo->query($sql); 

// 3. просмотры, за все время  
$sql = "SELECT countall FROM countall";
$res3 = $pdo->query($sql);
$sult = $res3->fetchAll(PDO::FETCH_ASSOC);
foreach ($sult as $row) { 
    $all_hits = $row["countall"];
}

// 4. просмотры, за сегодня 
$sql = "SELECT * FROM count WHERE date = :date"; 
$res4 = $pdo->prepare($sql);
$res4->bindValue(":date", $date);
$res4->execute(); 
$sult = $res4->fetchAll(PDO::FETCH_ASSOC); 
foreach ($sult as $row) {
    $today_hits = $row["date"];
} 

// 5. посетители, за сегодня 
$sql = "SELECT DISTINCT usip FROM count WHERE date = :date"; 
$res5 = $pdo->prepare($sql);
$res5->bindParam(":date", $date); 
$res5->execute();
$sult = $res5->fetchAll(PDO::FETCH_ASSOC);
foreach ($sult as $row) {
    $today_hosts = $row["usip"]; 
} 
	
$cookie = $today_hosts; 

// если число будет длиннее 15 цифр или неизвестно, то выведем знак '?'
if (strlen($all_hits) > 15 || !isset($all_hits)) {$all_hits = "?";}             
if (strlen($today_hits) > 15 || !isset($today_hits)) {$today_hits = "?";}       
if (strlen($today_hosts) > 15 || !isset($today_hosts)) {$today_hosts = "?";}
   
// КАРТИНКА 
// запрещаем кэширование, что-бы картинка не сохранялась в кэше браузера, а обновлялась при каждой загрузке
header("Expires: Mon, 25 Jul 2005 10:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-type: image/png");
$image = imagecreatefrompng("./counter.png"); 
// выбираем цвет для текста счетчика                  
$color = imagecolorallocate($image, 255, 255, 0);        
$color2 = imagecolorallocate($image, 0, 0, 255);         
$color3 = imagecolorallocate($image, 0, 0, 0);
// добавляем текст/цифры на counter.png 
imagestring($image, 4, 2, 2, "$all_hits", $color);                                                      
imagestring($image, 4, 2, 21, "$today_hits", $color2);
imagestring($image, 4, 2, 40, "$today_hosts", $color3);
// создаём картинку
imagepng($image);
// очищаем память
imagedestroy($image);
?>
Ошибок - нет. Счётчика - то-же. По таблицам видно, что добавление (usip cookie date / ::1 NULL 2025-05-30) и обновление - есть.
cupoma58 на форуме Ответить с цитированием
Старый 02.06.2025, 11:01   #2
Liris
Пользователь
 
Регистрация: 09.05.2012
Сообщений: 35
По умолчанию

Попробуйте проверить отдельно работу генератора картинки, вместо запросов подставив цифры. Будет ли работать?

У вас есть возможность ошибиться в этой строчке:
Код:
$image = imagecreatefrompng("./counter.png");
Если картинка недоступна (нет прав или не существует), то скрипт ошибки не покажет, но и картинка не получится.
Liris вне форума Ответить с цитированием
Старый 02.06.2025, 12:08   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,845
По умолчанию

Цитата:
Сообщение от cupoma58 Посмотреть сообщение
Error_Reporting (E_ALL & ~E_NOTICE);
Поменяйте на error_reporting(E_ALL); чтобы все отображалось.

Если ошибка возникла в момент вывода картинки, то в браузере вы ее уже не увидите, так как браузеру передан контент-тайп image/png, то есть вы получите незагруженное изображение вместо текста. Чтобы глянуть, что там за ошибки могли быть, можно временно закомментировать команду header("Content-type: image/png");

Переменная $cookie = $today_hosts; у вас нигде не используется.

Последний раз редактировалось Arigato; 02.06.2025 в 12:10.
Arigato вне форума Ответить с цитированием
Старый 02.06.2025, 16:30   #4
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 58
По умолчанию

Цитата:
Переменная $cookie = $today_hosts; у вас нигде не используется.
Извиняюсь:
Код:
<script>
cookie_detect="";
document.cookie="kamsoft=1; path=/"; 
cookie_detect+="c="+(document.cookie?"Да":"Нет"); 
document.write('<img src="test.php"'+cookie_detect+'&rand='+Math.random()+'alt="counter" border="0" width="88" height="57"/>');
</script>
<noscript><img src="counter.png"><font color="#ff0000">JS - не поддерживается</font></noscript>
Это - добавление счётчика на страничку. Там, его - то-же нет. Он должен, сначала, появится в php-файле.
Обычный php-счётчик, без mySQL - появляется.

Последний раз редактировалось cupoma58; 02.06.2025 в 16:36.
cupoma58 на форуме Ответить с цитированием
Старый 02.06.2025, 16:41   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,845
По умолчанию

Цитата:
Сообщение от cupoma58 Посмотреть сообщение
document.write('<img src="test.php"'+cookie_detect+'&ran d='+Math.random()+'alt="counter" border="0" width="88" height="57"/>');
Ну вот посмотрите, что будет выведено:
Код:
<img src="test.php"c=Да&rand=000000alt="counter" border="0" width="88" height="57"/>
Цитата:
Сообщение от cupoma58 Посмотреть сообщение
<noscript><img src="counter.png"><font color="#ff0000">JS - не поддерживается</font></noscript>
Вряд ли это кому-то надо...
Arigato вне форума Ответить с цитированием
Старый 02.06.2025, 16:41   #6
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Liris Посмотреть сообщение
Если картинка недоступна (нет прав или не существует), то скрипт ошибки не покажет, но и картинка не получится.
counter.png - это готовый файл-изображение, на которое наносятся цифры. Он - в том-же каталоге.
cupoma58 на форуме Ответить с цитированием
Старый 02.06.2025, 16:46   #7
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Вряд ли это кому-то надо...
Этот код, без PDO, в PHP+mySQL - работает.
cupoma58 на форуме Ответить с цитированием
Старый 02.06.2025, 16:53   #8
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Liris Посмотреть сообщение
вместо запросов подставив цифры
Без mySQL - всё работает. Добавляются и текст, и цифры.
Изображения
Тип файла: png counter_2.png (1.6 Кб, 13 просмотров)

Последний раз редактировалось cupoma58; 02.06.2025 в 17:03.
cupoma58 на форуме Ответить с цитированием
Старый Вчера, 13:58   #9
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
можно временно закомментировать команду header("Content-type: image/png");
Последовал совету - узнал много нового. Кое-что - исправил. В результате, получил следующий код:
Код:
�PNG  IHDRX9=_{� pHYs���+�IDATh��XM�� -~d<�k�b=���P����!M+X��[�U��Bi����a8�M�� .D��p�M����XQA��{|���.ŕnl�ـ"#��{�&?X�p�NW�*��P�����v8=.-�e�F��E��^jiO���8t9Y�X�Y����h�,�H��1�A���+�g!�xh�(%���ڢK���8}N�-��B���ٲ�z�2���Y,��*lx��)��(GP/"$uI\�I;�2�������r-�%zg=�`�p�k�a������B$� .D��� �M� �==/ٔ��l��-��߸�i�m���`��(~���A9ؼ�R%�T��o�Di:������PK�k&J�v!���V����ձ���[Z.H��bI�KÌrk Q���5�&sEH�`W����P��4���Z˨�(��z��N��jG��Qb�YÖ2��Ѯ4,�N�C�����>�,.��)�8M{s�~ Op!\�"��H`�Ch1�BϞ�KWv��J[>sF�P�o��⧺��P6/ ���RJ�9��$��A�@�H�ƽ�d�yC�!{�i@3�l�R*˾��� �.8W�rc���V����UIwP}�i���׈hԊ�P�ȡ85���%͠��뒼!f�QFh�x��2j�rjH�u)��h��s� �+ ��S琤�E��3���� ������W� q�IEND�B`�
вместо изображения. Похоже на png-файл только - много "?".
Кодировки: таблица 'utf8_unicode_ci', file.php 'ANSI'.
cupoma58 на форуме Ответить с цитированием
Старый Вчера, 14:18   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,845
По умолчанию

Ну так это и есть PNG-файл. Значит картинку генерирует.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц