Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Скрипт голосования

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Irina88
Отправлено: 13 Августа, 2022 - 19:48:16
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Март 2018  
Откуда: Kyiv, Ukraine


Помог: 0 раз(а)




После смены версии пхп, перестал работать скрипт голосования:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. // получаем файлы по определенному голосованию
  3. $id =  (int) $_GET[id];
  4. $vote = (int) $_GET[vote];
  5.  
  6. if (file_exists("$id.dat")) {
  7.  
  8. $ip= $_SERVER['REMOTE_ADDR'];
  9. $ip_file = file_get_contents("ip$id.dat");
  10. $ip_abbr = explode(",", $ip_file);
  11. $data = file("$id.dat");
  12.  
  13. // если это не просто просмотр результатов
  14. if ($vote) {
  15.  
  16. foreach($ip_abbr as $value)
  17. if ($ip == $value) {echo "<p><b><font color=red> Вы уже голосовали! </font></b></p>";
  18. }
  19. // выводим благодарность
  20. echo "<p><b><font color=green> Спасибо! </font></b><br /><i>*Показаны результаты до Вашего голосования:</i><p>";
  21. }
  22. // выводим заголовок голосования - 1я строка файла
  23. echo "<table border=0 style='text-align:left' ><th colspan=3 style='text-align:center'><b>$data[0]</b></th>";
  24. // печатаем список ответов и результатов - остальные строки
  25. for ($i=1;$i<count($data);$i++) {
  26.  $votes = explode("~", $data[$i]); // значение~ответ
  27.  $graf = 100*$votes[0]/(count($ip_abbr)-1);
  28.  echo "<tr><td>$votes[1]</td><td style='text-align: center'><b>$votes[0]</b></td><td> <span style='font-size: small'>".round($graf, 3)."%</span><div style='background: red; height:5px; width:".round($graf, 0)."px'></div></td></tr>";
  29. }
  30. echo "<tr><td>Всего<b></b></td><td>".(count($ip_abbr)-1)."</td><td>&nbsp;</td></tr></table>";
  31. // если это не просмотр результатов, а голосование,
  32. // производим необходимые действия для учета голоса
  33. if ($vote) {
  34.  $f = fopen("$id.dat","w");
  35.  flock($f,LOCK_EX);
  36.  fputs($f, "$data[0]");
  37.  for ($i=1;$i<count($data);$i++) {
  38.    $votes = explode("~", $data[$i]);
  39.    if ($i==$vote) $votes[0]++;
  40.    fputs($f,"$votes[0]~$votes[1]");
  41.         fflush($f);
  42. flock($f,LOCK_UN);
  43.  }
  44.  fclose($f);
  45.  
  46.  $ip_adr = fopen("ip$id.dat","a++");
  47.         flock($ip_adr,LOCK_EX);
  48. fputs($ip_adr, "$ip".",");
  49. fflush($ip_adr);
  50.         flock($ip_adr,LOCK_UN);
  51. fclose($ip_adr);
  52.  }
  53.  
  54.  } else {
  55.     echo "Такого голосования не существует.";
  56.         exit;
  57. }
  58. ?>


ERROR 500
 
 Top
Vladimir Kheifets
Отправлено: 13 Августа, 2022 - 22:38:10
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Irina88 пишет:
После смены версии пхп, перестал работать скрипт голосования:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. // получаем файлы по определенному голосованию
  3. $id =  (int) $_GET[id];
  4. $vote = (int) $_GET[vote];
  5.  
  6. if (file_exists("$id.dat")) {
  7.  
  8. $ip= $_SERVER['REMOTE_ADDR'];
  9. $ip_file = file_get_contents("ip$id.dat");
  10. $ip_abbr = explode(",", $ip_file);
  11. $data = file("$id.dat");
  12.  
  13. // если это не просто просмотр результатов
  14. if ($vote) {
  15.  
  16. foreach($ip_abbr as $value)
  17. if ($ip == $value) {echo "<p><b><font color=red> Вы уже голосовали! </font></b></p>";
  18. }
  19. // выводим благодарность
  20. echo "<p><b><font color=green> Спасибо! </font></b><br /><i>*Показаны результаты до Вашего голосования:</i><p>";
  21. }
  22. // выводим заголовок голосования - 1я строка файла
  23. echo "<table border=0 style='text-align:left' ><th colspan=3 style='text-align:center'><b>$data[0]</b></th>";
  24. // печатаем список ответов и результатов - остальные строки
  25. for ($i=1;$i<count($data);$i++) {
  26.  $votes = explode("~", $data[$i]); // значение~ответ
  27.  $graf = 100*$votes[0]/(count($ip_abbr)-1);
  28.  echo "<tr><td>$votes[1]</td><td style='text-align: center'><b>$votes[0]</b></td><td> <span style='font-size: small'>".round($graf, 3)."%</span><div style='background: red; height:5px; width:".round($graf, 0)."px'></div></td></tr>";
  29. }
  30. echo "<tr><td>Всего<b></b></td><td>".(count($ip_abbr)-1)."</td><td>&nbsp;</td></tr></table>";
  31. // если это не просмотр результатов, а голосование,
  32. // производим необходимые действия для учета голоса
  33. if ($vote) {
  34.  $f = fopen("$id.dat","w");
  35.  flock($f,LOCK_EX);
  36.  fputs($f, "$data[0]");
  37.  for ($i=1;$i<count($data);$i++) {
  38.    $votes = explode("~", $data[$i]);
  39.    if ($i==$vote) $votes[0]++;
  40.    fputs($f,"$votes[0]~$votes[1]");
  41.         fflush($f);
  42. flock($f,LOCK_UN);
  43.  }
  44.  fclose($f);
  45.  
  46.  $ip_adr = fopen("ip$id.dat","a++");
  47.         flock($ip_adr,LOCK_EX);
  48. fputs($ip_adr, "$ip".",");
  49. fflush($ip_adr);
  50.         flock($ip_adr,LOCK_UN);
  51. fclose($ip_adr);
  52.  }
  53.  
  54.  } else {
  55.     echo "Такого голосования не существует.";
  56.         exit;
  57. }
  58. ?>


ERROR 500


Добрый день, Ирина!
См.:
https://www.php.net/manual/ru/function.count.php
Цитата:
8.0.0 count() теперь выбрасывает TypeError, если передан недопустимый исчисляемый тип в параметр value.


https://www.php.net/manual/ru/co...ures.foreach.php
Цитата:
Конструкция foreach предоставляет простой способ перебора массивов. foreach работает только с массивами и объектами, и будет генерировать ошибку при попытке использования с переменными других типов или неинициализированными переменными.
Лекарство:
PHP:
скопировать код в буфер обмена
  1.  
  2. for($i=1;$i<count((array) $data);$i++) {
  3. ...
  4. foreach((array) $ip_abbr as $value){
  5. ...

Удачи!

(Отредактировано автором: 13 Августа, 2022 - 22:38:57)

 
 Top
Irina88
Отправлено: 14 Августа, 2022 - 19:49:46
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Март 2018  
Откуда: Kyiv, Ukraine


Помог: 0 раз(а)




Vladimir Kheifets, ERROR 500.

Вот код:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. // получаем файлы по определенному голосованию
  3. $id =  (int) $_GET[id];
  4. $vote = (int) $_GET[vote];
  5.  
  6. if (file_exists("$id.dat")) {
  7.  
  8. $ip= $_SERVER['REMOTE_ADDR'];
  9. $ip_file = file_get_contents("ip$id.dat");
  10. $ip_abbr = explode(",", $ip_file);
  11. $data = file("$id.dat");
  12.  
  13. // если это не просто просмотр результатов
  14. if ($vote) {
  15.  
  16. foreach((array) $ip_abbr as $value)
  17. if ($ip == $value) {echo "<p><b><font color=red> Вы уже голосовали! </font></b></p>";
  18. }
  19. // выводим благодарность
  20. echo "<p><b><font color=green> Спасибо! </font></b><br /><i>*Показаны результаты до Вашего голосования:</i><p>";
  21. }
  22. // выводим заголовок голосования - 1я строка файла
  23. echo "<table border=0 style='text-align:left' ><th colspan='3' style='text-align:center'><b>$data[0]</b></th>";
  24. // печатаем список ответов и результатов - остальные строки
  25. for ($i=1;$i<count((array) $data);$i++) {
  26.  $votes = explode("~", $data[$i]); // значение~ответ
  27.  $graf = 100*$votes[0]/(count($ip_abbr)-1);
  28.  echo "<tr><td>$votes[1]</td><td style='text-align: center'><b>$votes[0]</b></td><td> <span style='font-size: small'>".round($graf, 3)."%</span><div style='background: red; height:5px; width:".round($graf, 0)."px'></div></td></tr>";
  29. }
  30. echo "<tr><td>Всего<b></b></td><td>".(count($ip_abbr)-1)."</td><td>&nbsp;</td></tr></table>";
  31. // если это не просмотр результатов, а голосование,
  32. // производим необходимые действия для учета голоса
  33. if ($vote) {
  34.  $f = fopen("$id.dat","w");
  35.  flock($f,LOCK_EX);
  36.  fputs($f, "$data[0]");
  37.  for ($i=1;$i<count ((array) $data);$i++) {
  38.    $votes = explode("~", $data[$i]);
  39.    if ($i==$vote) $votes[0]++;
  40.    fputs($f,"$votes[0]~$votes[1]");
  41.         fflush($f);
  42. flock($f,LOCK_UN);
  43.  }
  44.  fclose($f);
  45.  
  46.  $ip_adr = fopen("ip$id.dat","a++");
  47.         flock($ip_adr,LOCK_EX);
  48. fputs($ip_adr, "$ip".",");
  49. fflush($ip_adr);
  50.         flock($ip_adr,LOCK_UN);
  51. fclose($ip_adr);
  52.  }
  53.  
  54.  } else {
  55.     echo "Такого голосования не существует.";
  56.         exit;
  57. }
  58. ?>
 
 Top
Vladimir Kheifets
Отправлено: 14 Августа, 2022 - 21:15:08
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Irina88 пишет:
Vladimir Kheifets, ERROR 500.

Ирина!
Проверить Ваш код без данных я не могу.
Есть фотальные ошибки в коде. Чтобы их увидеть добавьте в первой строке кода
Покажите, пожалуйста, ошибки, которые увидите,
Проверить что, error_reporting работает можно просто, делением на 0.

(Отредактировано автором: 14 Августа, 2022 - 21:15:50)

 
 Top
Vladimir Kheifets
Отправлено: 15 Августа, 2022 - 10:29:36
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




[quote=Vladimir Kheifets]
Irina88 пишет:
Vladimir Kheifets, ERROR 500.

Добрый день, Ирина!
У Вас таже проблема, что и в другой теме с date(Y) .
В начале скрипта, надеюсь, Вы добавите error_reporting(E_ERROR | E_PARSE);
Тогда увидите два сообщения:
Цитата:
Warning: Use of undefined constant id - assumed 'id' (this will throw an Error in a future version of PHP) in ... on line 3
Warning: Use of undefined constant vote - assumed 'vote' (this will throw an Error in a future version of PHP) in .... on line 4
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // получаем файлы по определенному голосованию
  3. //$id =  (int) $_GET[id];  //ошибка
  4. //$vote = (int) $_GET[vote]; //ошибка
  5. $id =  (int) $_GET["id"]; //верно
  6. $vote = (int) $_GET["vote"]; //верно...

Если у Вас только 2-e $_GET переменные
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // получаем файлы по определенному голосованию
  3. //$id =  (int) $_GET[id];  //ошибка
  4. //$vote = (int) $_GET[vote]; //ошибка
  5. extract($_GET); // будут определены переменные $id и $vote
  6. ...


P.S Несколько советов по миграции на актуальные версии PHP:

1. Аккуратно применять типы данных и корректно определять данные.
Например, если хочется применить date(Y), то необходимо определить константу Y
между прочим, в программирование на любом языке полезно именовать объекты, так чтобы по названию
можно было понять их назначение. CamelCase-стиль облегчает читаемость кода.


Некоторые стандартные функции требуют определения параметров как object или array и выдают ошибки в тех случаях,
если параметр другого типа. Помогает приведение типов, например,
PHP:
скопировать код в буфер обмена
  1. $arrayCount = count((array)$unknownType);
  2. foreach((array)$unknownType()...)
  3. foreach((object)$unknownType()...)


2. Теперь при вызыве пользовательских функций д.б. обязательно определены все параметры.
PHP:
скопировать код в буфер обмена
  1. function myFunction($a,$b=null){
  2. if(empty($b))
  3.         retuen $a;
  4. else
  5.         retuen $a+$b;  
  6. }
  7. echo myFunction($a);


3. Теперь функция parse_str не возвращает переменные, а требуется определить вторым параметров массив.
PHP:
скопировать код в буфер обмена
  1. parse_str($colors); //устарело, выдается ошибка
  2. //можно заменить на
  3. parse_str($colors, $colorsArr);
  4. extract($colorsArr);


4. Функция split теперь исключена.
можно изменять во всех файлах проекта
= split(
на
= explode(

5. Замена mysql на mysqli

можно изменить во всех файлах проекта
mysql_query(
на
mysqli_query($link,
-----------------------------
затем
mysql_
на
mysqli_
-----------------------------
Важно!
функция mysqli_query теперь при неуспешном завершении запроса возвращает Boolean false
а функции, которые обрабатывают требуют результат как Object, и выдают ошибку.
Поэтому, теперь необходимо делать проверку результата, например
PHP:
скопировать код в буфер обмена
  1.  
  2. $result = mysqli_query($link, $query);
  3. //$roms = mysqli_num_rows($result); //возможна ошибка
  4. $roms = $result?mysqli_num_rows($result):0;
  5.  
Удачи!

(Отредактировано автором: 15 Августа, 2022 - 10:36:09)

 
 Top
Irina88
Отправлено: 15 Августа, 2022 - 19:15:13
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Март 2018  
Откуда: Kyiv, Ukraine


Помог: 0 раз(а)




Добрый вечер, Владимир!

Цитата:
У Вас таже проблема, что и в другой теме с date(Y) .


Исправила. Все работает. Всё-таки из-за кавычек (вернее, из-за их отсутствия) была ERROR 500
(Добавление)
Vladimir Kheifets, можете поподробней объяснить, куда вставлять error_reporting(E_ERROR | E_PARSE); (до <?php или после)?

Ни так, ни так не появляются сообщения об ошибках. Пишет ERROR 500.
 
 Top
Vladimir Kheifets
Отправлено: 15 Августа, 2022 - 20:55:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Irina88 пишет:
Добрый вечер, Владимир!

Цитата:
У Вас таже проблема, что и в другой теме с date(Y) .


Исправила. Все работает. Всё-таки из-за кавычек (вернее, из-за их отсутствия) была ERROR 500
(Добавление)
Vladimir Kheifets, можете поподробней объяснить, куда вставлять error_reporting(E_ERROR | E_PARSE); (до <?php или после)?

Ни так, ни так не появляются сообщения об ошибках. Пишет ERROR 500.


Добрый вечер, Ирина!
Конечно после <?php т.к. это php-функция
Ecли не работает, то попробуйте так
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. ini_set('display_errors', 1);
  3. error_reporting(E_ERROR | E_PARSE);
  4. // далее основной код Вашего скрипта
  5. ...
  6. ?>
Удачи!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB