Autor Zpráva
Daviart
Profil
Při odesílání formuláře, když text obsahuje uvozovky - přidává před ně lomítko.

Po úspěšném odeslání vše funguje tak jak má, do databáze se uloží uvozovky bez zpětného lomítka. Opětovné načtení a uložení je také bez problému.

Pokud je formulář špatně vyplněn a znovu načtu obsah z $_POST přidají se lomítka. Pokud to má za následek přidání escape, nevím jak zabránit opětovným přidáváním s každou kontrolou.

nalezl jsem několik řešení, nejprve jsem zkoušel:

echo htmlspecialchars($_POST["text"]);


i před převedené znaky se vkládá lomítko

dále jsem našel ošetření pomocí ternárního operátoru: http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=117686

nenalezl jsem alternativní řešení pro ošetření $_POST (nebo $_GET)

můj kód:
<?php

function formobsahpole ($formObsahPolePOST , $formObsahPoleSQL)
{
	if (!empty($formObsahPolePOST)) {
		$formObsahPolePOSTuprav = ($formObsahPolePOST); // tady bude možná ještě funkce
		return($formObsahPolePOSTuprav); // formulář je opravován, načte $_POST
	} else {
		return($formObsahPoleSQL); // formulář načte obsah z databáze, $_POST neobsahuje data
	}
}

?>

<!-- předchozí kód -->

<label>Anotace* <span class='popis'>(max. 255 snaků)</span><br>
   <textarea class='textarea' name='anotace' id='anotace' cols='50' rows='5'><?php echo (formobsahpole($_POST['anotace'] , $ZaznamANOTACE)); ?></textarea>
</label>

<!-- kód pokračuje -->


předem díky
panther
Profil
Daviart:
http://php.net/manual/en/security.magicquotes.php
Daviart
Profil
Tak se omlouvám za zbytečné vlákno. Kdybych používal lépe hlavu, přišel bych na to dříve, použil jsem na to funkci
stripslashes


function formobsahpole ($formObsahPolePOST , $formObsahPoleSQL)
{
	if (!empty($formObsahPolePOST)) {
		$formObsahPolePOSTuprav = stripslashes($formObsahPolePOST); // zbavíme se dalších lomítek
		return($formObsahPolePOSTuprav); // formulář je opravován, načte $_POST
	} else {
		return($formObsahPoleSQL); // formulář načte obsah z databáze, $_POST neobsahuje data
	}
}
panther
Profil
Daviart:
stripslashes sice udělají, co chceš, ale je to jen zaplácnutí problému, ne jeho vyřešení. Řešením by bylo lomítka nevytvářet, když je nepotřebuješ.
ShiraNai7
Profil
panther, Daviart:

Já to řeším tak, že již v inicializačním skriptu systému magic_quotes detekuji a případně pak vyruším jejich efekt a vypnu je pro další funkce (např. později načítané soubory).. potom nemusím řešit, zda jsou zapnuty či nikoliv a aplikace se bude chovat stejně na různém nastavení magic_quotes. (Podobně řeším zapnuté register_globals).

// revert and disable magic quotes
if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1) {

    // revert
    $in = array(&$_GET, &$_POST, &$_COOKIE);
    while(list($key, $val) = each($in)) {
        foreach($val as $key2 => $val2) {
            if(!is_array($val2)) {
                $in[$key][$key2] = stripslashes($val2);
                continue;
            }
            $in[] = &$in[$key][$key2];
        }
    }

    // disable
    if(function_exists('set_magic_quotes_runtime')) set_magic_quotes_runtime(0);

}
Daviart
Profil
Ale kdybych vypnul
magic_quotes_gpc
, budu mít zase práci je vytvářet při ukládání do databáze, tam by přc měly být.

tím to
stripslashes($formObsahPolePOST)
je zruším pouze pro opětovné načtení do formuláře.

Ještě se pokusím o tom něco načíst, ale prozatím nic lepšího asi nevymyslím.
Daviart
Profil
[#5] ShiraNai7

A při ukládání do databáze jsou lomítka před znaky opět jinou funkcí vytvářeny?
panther
Profil
Daviart:
budu mít zase práci je vytvářet při ukládání do databáze
do DB je lépe ukládat stringy oetřené funkcí mysql_real_escape_string.
ShiraNai7
Profil
Daviart:
A při ukládání do databáze jsou lomítka před znaky opět jinou funkcí vytvářeny?

Viz příspěvek od panthera :) Databázový wrapper používá mysql_real_escape_string() pro řetězce.
Daviart
Profil
díky moc!

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: