mysql_real_escape_string ve tek tırnak

6 Cevap php

Ben oldukça sinirli değilim. Örneğin, O'Connor - Ben tek tırnak ile benim veritabanı adları içine eklemek mümkün olmak istiyorum.

DB eklerken Yani, yapmam:

 $lname = mysql_real_escape_string($_POST['lname']);

Ve sonra veritabanına $ lname yerleştirin.

Bu DB geldiğinde, bu O \ 'Connor olarak görünür.

Ben benim web uygulaması son ismi hatırlamak olsaydı Yani, ben kullanmak zorunda olacak:

 $lname = stripslashes($r["lname"]);

Bu, tüm iyi iş gibi görünüyor. Ancak, son adları için arama ve sonuçları gösterir bir arama fonksiyonu var. Ben arama yaparken, ben herhangi bir sonuç elde etmek için O \ 'Connor aramak zorunda.

Ben aramadan sonra, metin kutusu otomatik olarak sadece (oturumları kullanarak) için aranan şeyin değerini saklar, bkz. Yani benim kod şudur:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

Daha önce söylediğim gibi ben arama yaparken, ben "Ey \ kullanmak zorunda 'Connor", ve ben arama sonrasında, sonra metin kutusuna değer "O \ \ \ \' haline gelir Connor"

Bu anlamaya çalışıyor sinir bozucu oldu. Herkes yanlış ne yapıyorum biliyor mu? Teşekkürler!

EDIT:

İşte benim php5.ini dosya sihirli tırnak ilgili olduğunu:

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

Ancak, benim sitesi GoDaddy üzerinde barındırılan ve ben dosyayı düzenlemek için izniniz yok: (

6 Cevap

Magic Quotes PHP yapılandırmada etkin gibi geliyor.

Aslında etkinse kontrol etmek için:

echo get_magic_quotes_gpc();

To disable, php.ini dosyasını düzenlemek:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

. Veya htaccess bu satırı ekleyin:

php_flag magic_quotes_gpc Off

Magic tırnak etkindir. Bu ne demektir başlayan programcılar kadar bu konuda endişelenmenize gerek yok ki yazı yerleştirilen veya almak ya da diğer benzeri yerler şey otomatik olarak kaçtı olmasıdır. Yanlış hatırlamıyorsam eğer, PHP geçerli sürümünde önerilmiyor.

Ne bu anlaşma, ve komut dosyası herhangi bir yapılandırma aynı çalıştırmak için yapmak istiyorum aşağıdaki gibidir:

function fixinput($value){
	if (get_magic_quotes_gpc()){
	  $value = stripslashes($value);
	}

	return mysql_real_escape_string($value);
}

Sen daha bu yaygın bir varyasyon olan tırnak, sayısal olmayan verileri sarmak için değiştirmek isteyebilirsiniz, ama elle bu tırnak yerleştirmek için daha iyi buluyorum.

PHP kurulum aslında gerçek bir kaçış dize var olmadığını kontrol etmek fixinput fonksiyonu çok az düzenleme (eski sürümler yapmak):

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }

Bu DB geldiğinde, bu O \ 'Connor olarak görünür.

Ben benim web uygulaması son ismi hatırlamak olsaydı Yani, ben kullanmak zorunda olacak:

 $lname = stripslashes($r["lname"]);

Yanlış! Eğer mysql_real_escape_string, sadece sorguda kaçtı olan dizeleri kaçış zaman. Veritabanı sorgu yorumlar, böylece verileri herhangi bir kaçış karakterleri olmadan veritabanında biter. Sen do not kullanmak zorunda stripslashes veritabanından veri çekerek zaman. Yapmanız düşünüyorsanız, o zaman veritabanındaki verilerin karıştırılmış demektir. Büyük bir olasılıkla, sihirli tırnak var çünkü döndü.

Sen gerekir:

  • Sihirli tırnak kapatın veya global etkisini tersine. Ayrıntılar için the manual bakın.
  • Kullanmak bound parameters (en iyi çözüm) ya or ile birlikte tüm değişkenleri kaçış mysql_real_escape_string. Sorguyu bina nerede bunu yapmanız gerekir.
  • Eğer veritabanından çekip şeyler üzerinde hiçbir şey.

Özellikle, bir fonksiyon la fixinput ve cevapları burada bazı listelenen varyantları yapmazlar. Bu sorunu çözmek için yanlış bir yoldur, o pisliği bir http istek gelmiyor herhangi bir veri çünkü.

Yapmanız gereken o mysql_real_escape_string, arama sorgusunu almak olduğunu ve mükemmel ince olmalıdır. Bu olsa yapmak için en iyi yolu kaçtı saklamak ve yerine sadece her şeyi veritabanına gider onu kaçmak asla etmektir.

Bunun yerine, bu do:

 $_SESSION['search'] = $_GET['search'];
 $search = mysql_real_escape_string($_GET['search']);

I get_magic_quotes_gpc ON / OFF olduğunu kontrol yok.

Ben sadece $lname = mysql_real_escape_string(stripslashes($_POST['lname'])); yapmak böylece herhangi bir alıntı metin yoksa alışkanlık şerit orada alıntı varsa onları kapalı şerit olacak .. bölü.

ve bu benim için harikalar yaratıyor!