PHP, HTML formları, çift-tırnak kaçan şaşıp

5 Cevap

Ben ön uç bir SQLite veritabanı için kullanabileceğiniz basit bir PHP komut dosyası var. Bu fantezi ya da karmaşık bir şey değil. Ama çift tırnak ile bir form alanına girmek bir şey ben bir ters eğik çizgi ile tırnak kaçtı ediyorum sanki form işleme genelinde geldiği veritabanındaki kayıtlara bakarak fark ettik. Yani başlığı ile bir rekor girildiğinde:

İngiliz Hafif Ticari Araç 10bg "Tilly"

ne veritabanında gösterir olduğunu:

İngiliz Hafif Ticari Araç 10bg \ "Tilly \"

Ben bu nereden geldiğini bilmiyorum, ne kötü, hatta aşağıdaki preg_replace kullanarak bunları kaldırmak için görünmüyor:

$name = preg_replace('/\\"/', '"', $_REQUEST['kits_name']);

Ben dışarı dökümü, $name, hala istenmeyen \ karakter taşımaktadır.

5 Cevap

En büyük olasılıkla magic_quotes_gpc on olarak ayarladığınız php.ini. Bunu önlemek ve kendi regex kullanmak istiyorsanız, böyle bir kontrol yapmak:

if (get_magic_quotes_gpc())
{
   $mytext = stripslashes($your_text);
}

// and your further code....

Bu sunucu magic_quotes_gpc etkin anlamına gelir.

Bu ayarı devre dışı bırakmak için () ini_set kullanabilir, veya $ _REQUEST değerleri filtrelemek için bir yöntem oluşturmak () için

function getRequest($key)
{
  $val = $_REQUEST[$key];
  if(get_magic_quotes_gpc() == 1) {
    $val = stripslashes($val);
  }
  return $val;
}

echo getRequest('kits_name');

Mümkün magic quotes sunucu üzerinde etkin olan var mı?

Muhtemelen var magic quotes döndü.

Bu kötü bir uygulamadır ve önerilmiyor gibi bu devre dışı bırakmanız gerekir.

doc onları devre dışı bırakmak için nasıl öğrenmek için bu görüntüleyebilirsiniz.

Well because of lack of good answers.
As they said above, it is because magic quotes on.
You have to get rid of these slashes before inserting your data. So, to get rid of it you can use either .htaccess (if any) with these settings

php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

veya bu gibi bir kod ile, elle bunu yapmak

if ( get_magic_quotes_gpc( ) ) {
  $_GET = array_map_recursive('stripslashes', $_GET) ;
  $_POST = array_map_recursive('stripslashes', $_POST) ;
  $_COOKIE = array_map_recursive('stripslashes', $_COOKIE) ;
  $_REQUEST = array_map_recursive('stripslashes', $_REQUEST) ;
  if (isset($_SERVER['PHP_AUTH_USER'])) stripslashes($_SERVER['PHP_AUTH_USER']); 
  if (isset($_SERVER['PHP_AUTH_PW'])) stripslashes($_SERVER['PHP_AUTH_PW']);
}

php versiyonu array_map_recursive işlevini desteklemiyorsa, bu gibi bir özyinelemeli işlevi kullanabilirsiniz

function strips(&$el) { 
  if (is_array($el)) 
    foreach($el as $k=>$v) 
      strips($el[$k]); 
  else $el = stripslashes($el); 
} 

or write your own one You can use this code co cleanse your existing data

Gelince

If I dump out $name, it still bears the unwanted \ characters.

Yanlış kullanım htmlspecialchars function sonucu olabilir