• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

złe zapisywanie / odczytywanie z pliku php na ct8.pl

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
426 wizyt
pytanie zadane 10 lipca 2023 w PHP przez lalanablanalala Bywalec (2,090 p.)

Witam, na stronie ct8.pl wyświetla mi się błąd z zapisem / odczytem do pliku php. Problem pojawił się niedawno.

Strona CT8pl  

tutaj ta sama strona z innym hostem HOST ma7.eu

Błąd jaki mi się pojawia(na chrome i fox): 

OnlineFatal error: Uncaught Error: Call to undefined function each() in /usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/js/online.php:22 Stack trace: #0 {main} thrown in /usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/js/online.php on line 22

dlaczego to doszukuje się pliku gdzieś na dysku? 

tak wygląda plik php. zdaje sb sprawę że może być stary / źle napisany. Dane zapisuje w zwykłym plku txt. 

<?php
session_start();
$ID = session_id();
$czas = time();
$do_zapisania="$ID:$czas";
$min_czas=15;
$plik="online.txt";
$nowa=false;

$czytaj_plik = fopen("$plik", "r");
$uzytkownicy = fread($czytaj_plik, filesize("$plik"));
fclose($czytaj_plik);

if ($uzytkownicy=="")
{
    $ile=1;
    $do_pliku=$do_zapisania;
}
else
{
    $uzytkownik=explode("\n",$uzytkownicy);
    while (list($key,$value)=each($uzytkownik))
    {
        list($stary_ID, $stary_czas) = explode(":",$value);
        if ($stary_ID!=$ID)
        {
            if ($czas-$stary_czas<$min_czas)
            {
                $nowa_zawartosc[]=$stary_ID.":".$stary_czas;
            }
        }
        else
        {
            $nowa_zawartosc[]=$do_zapisania;
            $nowa=true;
        }
    }

    if ($nowa==false) {$nowa_zawartosc[]=$do_zapisania;}
    $ile=count($nowa_zawartosc);
    $do_pliku=implode("\n",$nowa_zawartosc);
}

$zapisz_plik = fopen("$plik", "w");
fwrite($zapisz_plik , $do_pliku);
fclose($zapisz_plik );

echo "$ile";

?>

tym jest wczytywany 

//  _________   O N L I N E  _________
$(document).ready(function(){
  var content = document.getElementById('online');
  var call = function(){
    $.ajax({
      method: 'POST',
      url: 'js/online.php', 
      success:function(data){ 
        content.innerHTML = data; 
        setTimeout(call, 15000); // 15s.         
      }
    });
  }
  call();
});

Dodam jeszcze inny schemat który również korzysta do zapisywania danych tym razem do pliku php i również pojawia się błąd... 

Warning: Trying to access array offset on value of type bool in /usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/mess.php on line 20

Cała strona do pobrania stąd: Cała strona 5,5MB

<form action="shout/savemessdj.php" method="post">
               <div id="save" > 
			<input type="hidden" name="saveb[0]" value="123">
			<input type="submit" value="S A V E" class="save" >
		</div>
<?
@$a=file("messdj.php");
echo '<textarea oninput="auto_grow(this)" name="a[0]" value="'.$a[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmess2" ></textarea>';
?>
    <div class="language" >P o l i s h - DJ Message / DJ Wiadomość</div>
<?
@$b=file("messdjpl.php");
echo '<textarea oninput="auto_grow(this)" name="b[0]" value="'.$b[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmesspl2" ></textarea>';
?>

a zapisuje się w savemessdj.php

<?

extract($_POST);

if ($saveb[0]=="123")
{

@$fp = fopen("messdj.php", "w");
for ($i=0; $i<=$l; $i++)
{
fputs ($fp, $a[$i]);
fputs ($fp, "\n");
}

@$fp = fopen("messdjpl.php", "w");
for ($i=0; $i<=$l; $i++)
{
fputs ($fp, $b[$i]);
fputs ($fp, "\n");
}

echo "Save messege / Zapisz wiadomość\n";

}

?>

 

2 odpowiedzi

+2 głosów
odpowiedź 10 lipca 2023 przez Comandeer Guru (606,240 p.)

Co do each():

This function has been DEPRECATED as of PHP 7.2.0, and REMOVED as of PHP 8.0.0. Relying on this function is highly discouraged.

ct8.pl pewnie ma nową wersję PHP, stąd ten kod nie działa.

Zamiast 

while (list($key,$value)=each($uzytkownik))

lepiej użyć foreach():

foreach ($uzytkownik as $key => $value)

Swoją drogą, ten odczyt można spróbować uprościć przy pomocy file().

Co do drugiego błędu: w którym dokładnie pliku wyrzuca ten błąd?

komentarz 11 lipca 2023 przez lalanablanalala Bywalec (2,090 p.)
edycja 11 lipca 2023 przez lalanablanalala

   czyli ma być to tak zapisane w php? Nie znam się na php / java. Kod znaleziony w całości. 

    $uzytkownik=explode("\n",$uzytkownicy);
	foreach ($uzytkownik as $key => $value)
    {
        list($stary_ID, $stary_czas) = explode(":",$value);

Błąd pojawia się w pliku mess.php . zapisywanie informacji działa. Błąd z kolei nie pojawia się w pliku listen.php (który jest tak samo skontrowany co mess) jednak w jego dalszym pliku zapisowym Zapisowy  wrzucę te pliki na server bo obecnie są pod inna nazwa. 

 

EDIT na forum znalazłem info że obecnie jest 8.0 ale można zmienić na stare 

Do pliku .htaccess dodaj `AddType application/x-httpd-php72 .php`.

komentarz 12 lipca 2023 przez VBService Ekspert (256,320 p.)

Błąd pojawia się w pliku mess.php . zapisywanie informacji działa. Błąd z kolei nie pojawia się w pliku listen.php

 

pliki z paczki: Cała strona 5,5MB

katalog główny

kod z pliku mess.php

<form action="shout/savemessdj.php" method="post">

	<div id="container" > 
	
	<div class="language" >E n g l i s h - DJ Message / DJ Wiadomość</div>
<?
@$a=file("messdj.php");

kod z pliku listen.php

<form action="shout/savecd.php" method="post">

	<div id="container" > 
	
	<div class="language" >Listen now / Teraz słucham</div>
<?
@$a=file("shout/cd.php");

 

różnicę widać "gołym okiem" to co opisuje w Mojej odpowiedzi,

dlatego pokazuje się błąd

Warning: Trying to access array offset on value of type bool in /usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/mess.php on line 20

0 głosów
odpowiedź 11 lipca 2023 przez VBService Ekspert (256,320 p.)

IMO błąd

Warning: Trying to access array offset on value of type bool in /usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/mess.php on line 20

w pliku mess.php z głównego katalogu jest próba odczytu pliku: messdj.php

@$a=file("messdj.php");

który według zapisu powinien znajdować się w katalogu głównym

a plik ten znajduje się w katalogu shout

w przypadku braku pliku file(...) zwraca wartość typu boolean

Returns the file in an array.  ...   Upon failure, file() returns false.

w tym przypadku $a[0] nie jest tablicą tylko $a = false;

 

sprawdź

<?
@$a=file("messdj.php");

if ($a !== false)
  echo '<textarea oninput="auto_grow(this)" name="a[0]" value="'.$a[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmess2" ></textarea>';
?>
    <div class="language" >P o l i s h - DJ Message / DJ Wiadomość</div>
<?
@$b=file("messdjpl.php");

if ($b !== false)
  echo '<textarea oninput="auto_grow(this)" name="b[0]" value="'.$b[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmesspl2" ></textarea>';
?>

 

komentarz 11 lipca 2023 przez lalanablanalala Bywalec (2,090 p.)

Odpisałem do Comandeer tam są linki do wgranych plików na serwer ct8.pl także możesz zobaczyć że wszystko działa. 

@$a=file("messdj.php");

to właśnie odnosi się do pliku w katalogu shout ponieważ odpowiada pewnie za to

<form action="shout/savemessdj.php" method="post">

także z pliku savemssdj przechodzimy do messdj w którym zapisywane są dane. Tak dzieje się również z listen.php / admin.php  

Twój kod php "sprawdź" nie działa ponieważ nie pojawia się pole w którym można zmienić treść... 

komentarz 12 lipca 2023 przez VBService Ekspert (256,320 p.)
edycja 12 lipca 2023 przez VBService

IMO,
link podany w treści komunikatu błędu wskazuje na plik mess.php w katalogu głównym

/usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/mess.php

dla mess.php z katalogu shout był by

/usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/shout/mess.php

 

 

nie działa ponieważ nie pojawia się pole w którym można zmienić treść...  

to znaczy, że

<?
@$a=file("messdj.php");

zwraca błąd, ten zapis

<?
@$a=file("messdj.php");
 
if ($a !== false)
  echo '<textarea oninput="auto_grow(this)" name="a[0]" value="'.$a[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmess2" ></textarea>';
?>

powoduje, ze gdy file(...) wykona się prawidłowo zwraca

Returns the file in an array ...

czyli w podanym przypadku pojawi się  pole tekstowe <textarea>

a gdy file(...) wykona się nieprawidłowo zwraca

Upon failure, file() returns false.

 

<?php

  @$a = file("messdj.php");

  var_dump($a);

  if ($a !== false) // "pokaże" się textarea gdy $a = file(...) zadziała prawidłowo
    echo '<textarea></textarea>';
?>

 

sam komunikat błędu na to wskazuje

Warning: Trying to access array offset on value of type bool in

file - Return Values

Returns the file in an array.  ...   Upon failure, file() returns false.

 

BTW,

dla mess.php z katalogu głównego 

i dla mess.php z katalogu shout

komentarz 13 lipca 2023 przez lalanablanalala Bywalec (2,090 p.)

nie wiem zmieniłem format php dodając plik .htaccess a w nim umieściłem

AddType application/x-httpd-php72 .php

i wszystko działa prawidłowo jak ongiś. 

Sprawdziłem jeszcze raz również twój kod nie działa. 

<?
@$a=file("messdj.php");
 
if ($a !== false)
  echo '<textarea oninput="auto_grow(this)" name="a[0]" value="'.$a[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmess2" ></textarea>';
?>
    <div class="language" >P o l i s h - DJ Message / DJ Wiadomość</div>
<?
@$b=file("messdjpl.php");
 
if ($b !== false)
  echo '<textarea oninput="auto_grow(this)" name="b[0]" value="'.$b[0].'" type="text" class="mess2" placeholder="Enter here message / Wpisz tutaj wiadomość" id="djmesspl2" ></textarea>';
?>

Ale już mniejsza o to ważne że stare php ratuje sytuacje :D

komentarz 14 lipca 2023 przez VBService Ekspert (256,320 p.)
edycja 14 lipca 2023 przez VBService

Nie działa bo nie masz plików 

  • messdj.php
  • messdjpl.php

w katalogu głównym z którego wywołujesz mess.php prez co $a i $b nie zawierają zawartości pliku w postaci tablicy, tylko zawierają false i kod w if-ie się nie wykonuje

if ($a !== false)

$a i $b przyjmuje za wartość tablicę gdy

$a=file("messdj.php");
$b=file("messdjpl.php");

wykona się bez błędu, ale gdy jest błąd, w tym przypadku nie odnaleziono pliku, to

$a i $b przyjmuje za wartość boolean - false

jak już wcześniej pisałem nawet komunikat błędu wyraźnie (jego treść) na to wskazuje

Warning: Trying to access array offset on value of type bool in /usr/home/swiadomosc/domains/consciousness.ct8.pl/public_html/mess.php

 

AFAIK w wersji php niższej niż 8 znak @ (Error Control Operators) "ukrywa" komunikaty błędów, w wersji od 8 i wyżej (jest niezalecany)

Type system and error handling improvements

  • Stricter type checks for arithmetic/bitwise operators RFC
  • Abstract trait method validation RFC
  • Correct signatures of magic methods RFC
  • Reclassified engine warnings RFC
  • Fatal error for incompatible method signatures RFC
  • The @ operator no longer silences fatal errors.
  • Inheritance with private methods RFC
  • Mixed type RFC
  • Static return type RFC
  • Types for internal functions Email thread
  • Opaque objects instead of resources for CurlGdSocketsOpenSSLXMLWriter, and XML extensions

Podobne pytania

0 głosów
1 odpowiedź 744 wizyt
pytanie zadane 19 lipca 2019 w PHP przez Bartosz Pawlak Początkujący (370 p.)
0 głosów
1 odpowiedź 1,795 wizyt
pytanie zadane 23 maja 2018 w Hostingi, domeny, usługi przez seith Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 1,735 wizyt
pytanie zadane 24 grudnia 2017 w PHP przez lethzik Nowicjusz (120 p.)

93,187 zapytań

142,201 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2127p. - dia-Chann
  2. 2092p. - Łukasz Piwowar
  3. 2079p. - Łukasz Eckert
  4. 2037p. - Tomasz Bielak
  5. 2006p. - Michal Drewniak
  6. 2006p. - rucin93
  7. 2005p. - Łukasz Siedlecki
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...