Autor Zpráva
Mufna
Profil
Zdravím Vás. Jak mám dosáhnout toho, aby data z $_POST byla ošetřena o přidávání backslashe před znaky: uvozovky, apostrof a lomítko ? Mám s tím problémy. Konkrétně mi jde např. o toto: mám formulářové pole pro vyplňování jména, kam lze zadat např. O'Connor. Pak mám funkci na ošetření formulářového vstupu pomocí regulárního výrazu, který mimo jiné umožňuje, aby zadané jméno obsahovalo apostrof, ale zároveň neumožňuje, aby obsahovalo \ (což bych rád takto ponechal). Když pak zadám O'Connor a odešlu, tak by to mělo projít, ale místo toho to vyhodí chybu (nevyhovuje regulárnímu výrazu). To je pravda, neb během zpracování (nevím, jak přesně to funguje, ale zřejmě jakmile se vytvoří $_POST['jmeno'], čili před vlastní kontrolou na shodu s regulárem) se tam dostane zpětné lomítko a z řetězce O'Connor je řetězec O\'Connor, a to se i vypíše v neodeslaném strnulém formuláři. Při každém dalším neúspěchu o odeslání kompletního formuláře se přidávají další zpětná lomítka.

Jak to mám ošetřit ?
Vagrant
Profil
Ahoj, můžeš sem vložit tu funkci? Pokud je toho hodně písni na mail...
Jan Tvrdík
Profil
Mufna:
Lomítko automaticky přidává php direktiva magic_quotes_gpc.
Lomítka lze ručně odstranit pomocí funkce stripslashes a případně i ručně přidat pomocí funkce addslashes.
Mufna
Profil
function check_name($val)
{
  $val = htmlspecialchars(trim($val));
  $regexp = '/^[a-zA-ZáčďéěíňóřšťůúýžÁČĎÉĚÍŇÓŘŠŤŮÚÝŽ \.\\\'\-]+$/';
  if (preg_match($regexp,$val) == 1) {
      return $val;
    } else {
      return false;
  }
}

Jan Tvrdík
magic_quotes_gpc mám Off (nastaveno přes můj admin účet na hostingu, tak to snad funguje). Stejně ale v POSTU přibude lomítko (proč, to nevím)
Vagrant
Profil
Funkce sama osobě funguje...
a do funkce předáváš už přímo $_POST['...'] ? Nic dalšího se předtím neděje?
Mufna
Profil
Vagrant
jaj sry... to tam píšeš...
:-o nerozumím

do funkce předáváš už přímo $_POST['...'] ? Nic dalšího se předtím neděje?

O ničem co by se dělo předtím nevím. Teda nevím o ničem co by souviselo s $_POST. Prostě se odešle formulář, do $_POST se uloží input a pak na to nasadím tu funkci. Celý PHP je ručně psaný mnou, není to nějaká open-source aplikace, kde nevím co se kde děje. Je to jeden PHP soubor, na začátku je zpracování formuláře, na konci vlastní formulář.
Vagrant
Profil
Vagrant
jaj sry... to tam píšeš...
:-o nerozumím

no, píšeš, že je to ještě před kontrolou... takže funkce to nedělá :)

EDIT:
Pošli mi ten soubor na mail pls...
Mufna
Profil
"Ještě před kontrolou" jsem myslel tak, že nevím, kde se tam to lomítko bere, a usoudil jsem (zřejmě správně), že ho už musí obsahovat proměnná POST, která se vytvoří odesláním formuláře. S $_POST['jmeno'] se postupně zachází takto:
$jmeno       = "";
if (isset($_POST['process'])) {
  if ($_POST['process'] == 1) { 
     require_once("libs/form_data_validation.php");  // obsahuje tu kontrolní funkci

     $jmeno = check_name($_POST['jmeno']); // a zde už $_POST['name'] musí obsahovat to lomítko



A jak už jsem psal, magic_quotes_gpc mám (snad) vypnutý
Vagrant
Profil
Pak zkontroluj magic_qoutes_gpc a ještě asi lépe, jak napsal p.Tvrdík, použij stripslashes...
Mufna
Profil
Vagrant
použij stripslashes

Já se tomu chtěl vyhnout, no ale když to nepůjde, tak to budu muset použít.

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: