Autor Zpráva
Pospa
Profil *
Dobrý den, mám 2 problémi s vypisováním do souboru:

1. do souboru místo "něco" ukládá toto: \"něco\"
2. všechno se vypisuje na konec souboru a já potřebuji někam doprostřed a nebo na začátek (potřebuji oboje)


<?php
$text=$_POST['texte'];

$text=htmlspecialchars($texte); //potencionálně nebezpečené znaky převede na entity 
?>


<!-- do souboru -->
<?php
$file=fopen("soubor.html", "a+");
$fsize=filesize("soubor.html");
$text=fread($file, $fsize);
$text=$text."".$texte."<br>";
fwrite($file, $text);
fclose($file);
?>


Děkuji, Pospa

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
AM_
Profil
Pospa:
do souboru místo "něco" ukládá toto: \"něco\"
toto řeší funkce stripslashes(). Je to důsledek zapnuté direktivy magic_quotes_gpc, které způsobuje, že všechny hodnoty v $_POST, $_GET, $_COOKIE a nevím přesně kterých dalších superglobálních polích se escapují pomocí \. Bohužel na některých serverech je vypnutá a na některých zapnutá, takže nejlepší je mít v záloze takovou funkci, která tento aspekt zohlední.
- řešení jsou dvě:
  function gpc_stripslashes($string){
    if (get_magic_quotes_gpc()){
      return stripslashes($string);
    } else {
      return $string;
    }
  }
  $text = gpc_stripslashes($_POST['text']);

další řešení je hned na začátku skriptu toto provést se všemi dotčenými superglobálními poli, takové řešení najdeš zde:
http://php.vrana.cz/vypnuti-magic_quotes_gpc.php
Pospa
Profil *
nohli byste to prosím vysvětlit trochu podrobněji? zapomněl jsem napsat, že jsem teprve začátečník, toto jsem zkoušel, ale jaksi to nešlo. Děkuji, Pospa
AM_
Profil
Pospa:
nohli byste to prosím vysvětlit trochu podrobněji? zapomněl jsem napsat, že jsem teprve začátečník, toto jsem zkoušel, ale jaksi to nešlo
Co konkrétně nešlo?
Je rozdíl mezi začátečníkem a člověkem bez vlastní snahy. Rozepsal jsem se dost podrobně, pokud něčemu nerozumíš, tak si to vyhledej, nebo, pokud toho nejsi schopný, zeptej se konkrétně.
Pospa
Profil *
Omlouvám se.

no, napsal sem to takhle:
<?php

function gpc_stripslashes($string){
    if (get_magic_quotes_gpc()){
      return stripslashes($string);
    } else {
      return $string;
    }
  }
  $text = gpc_stripslashes($_POST['texte']);

$text=htmlspecialchars($texte); //potencionálně nebezpečené znaky převede na entity 
?>
<?php
$file=fopen("soubor.html", "a+");
$fsize=filesize("soubor.html");
$text=fread($file, $fsize);
$text=$text."".$texte."<br>";
fwrite($file, $text);
fclose($file);
?>


a nic se nezměnilo.

Místo:
<font class="Apple-style-span" color="#FFFF00">nějaký žlutý text</font> a <span class="Apple-style-span" style="background-color: red;">červené pozadí</span><br>


to uloží, jako:
<font class=\"Apple-style-span\" color=\"#FFFF00\">nějaký žlutý text</font> a <span class=\"Apple-style-span\" style=\"background-color: red;\">červené pozadí</span><br>
AM_
Profil
Pospa:
$text = gpc_stripslashes($_POST['texte']);
>
$text=htmlspecialchars($texte);
není ti na těchto dvou řádcích něco nápadného? nejdřív si do $text uložíš text ošetřený na zpětná lomítka, a pak si ho přepíšeš oescapovanou verzí $texte. (Zřejmě máš v php.ini zapnuté register_globals, jinak by to nefungovalo vůbec, protože proměnná $texte by neexistovala).
Pospa
Profil *
tak texte, to je název formuláře, ze kterého se odesílá ten text, to htmlspecialchars jsem vymazal, a pořád to nešlo(pořád je to stejny). Pospa
AM_
Profil
Dobře to mělo být takto:
$text = gpc_stripslashes($_POST['texte']);
$text=htmlspecialchars($text);


Myslel jsem, že ti to dojde, nechtěl jsem ti jen tupě předhodit řešení. Text potřebuješ nejdříve zbavit \ a pak převést na HTML entity, takže ty operace musíš takto zřetězit, ne si htmlspecialchars přepsat výsledek první operace (to je to tak složité? když htmlspecialchars ošetříš původní proměnnou bez ořezaných \, jak to může fungovat?).
Pospa
Profil *
no, já tam ty entily původně nechtěl, to mi poslal kámoš, než mi poslal tuto adresu. tam sem teprve pochopil, co to sou ty entily.
Teď to vypadá takhle:
<?php

function gpc_stripslashes($string){
    if (get_magic_quotes_gpc()){
      return stripslashes($string);
    } else {
      return $string;
    }
  }
  $text = gpc_stripslashes($_POST['texte']); 
?>


<!-- do souboru -->
<?php
$file=fopen("soubor.html", "a+");
$fsize=filesize("soubor.html");
$text=fread($file, $fsize);
$text=$text."".$texte."<br>";
fwrite($file, $text);
fclose($file);
?>

...a pořád to místo " píše \" :(
AM_
Profil
Pospa:
Aha, teď to vidím, ty opravdu buď nechápeš základy programování, nebo jsi líný si tu chybu najít. Jak tu s oblibou říkám, diskuse je od radění, ne od ladění.
<?php

function gpc_stripslashes($string){
    if (get_magic_quotes_gpc()){
      return stripslashes($string);
    } else {
      return $string;
    }
  }
  $text = gpc_stripslashes($_POST['texte']); 
  
  //$text nyni obsahuje korektni verzi $_POST['texte'];
  $text = htmlspecialchars($text); //jen to tam pekne vrat, to chyba neni
?>


<!-- do souboru -->
<?php
$file=fopen("soubor.html", "a+");
$fsize=filesize("soubor.html");
//$text jeste porad obsahuje korektni verzi $text
$text=fread($file, $fsize);
//uz ne, prepisujes si ji; o opravenou verzi jsi prave prisel
$text=$text."".$texte."<br>";
fwrite($file, $text);
//ted zapisujes puvodni obsah souboru "soubor.html" a pripojujes neexistujici promennou $texte (bohuzel mas zaple register_globals takze se tam dosadi $_POST['texte'])
fclose($file);
?>

Opravu si vymysli sám, abys pochopil, jak proměnné fungují. Když hledáš chybu, vypisuj si důležité proměnné, kdybys to udělal, zjistíš, kde se ti $text přepisuje špatným údajem.
Pospa
Profil *
Děkuji, chybu jsem tam měl já, protože jsem tam měl místo:
$texte = gpc_stripslashes($_POST['texte']);

toto:
$text = gpc_stripslashes($_POST['texte']);

Mi taťka trochu poradil, protože to je dost podobny programovacimu jazyku Delphi.

Jinak diky

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: