2011-07-24 13 views
5

http://php.net/manual/en/function.mysql-real-escape-string.php:mysql_real_escape_string'e yapılan her bir çağrı, veritabanına başka bir gezi gerektiriyor mu?

mysql_real_escape_string() Aşağıdaki karakter eğik çizgi opsiyonlar MySQL kütüphane işlevi mysql_real_escape_string çağırır. \ X00 \ n \ r \,' "ve \ X1a

Tamam, temelde hiç böyle bir şey yaparsak:

mysql_query("insert T(C)select'".mysql_real_escape_string($value)."'")

mysql_real_escape_string işlevi için veritabanına 1 yolculuk yapıyorum ve mysql_query işlevine ilişkin başka bir gezi = veritabanına 2 kere gidiyorum?

cevap

5

Mysql kütüphanesini kullandığı gerçeği, 'u değil, sunucu ile gidiş dönüş yapıyor demektir.

Bu, php yorumlayıcınızla aynı işlemde yüklü olan mysql istemci kitaplığından kod çalıştırır. Yine de bir bağlantıya ihtiyacınız var - bu fonksiyonun düzgün çalışması için bazı sunucu ayarlarını bilmesi gerekiyor. Ancak bu ayarlar PHP tarafındaki bağlantı bilgilerinde önbelleğe alınır.

siz (ve linux üzerinde konum) bunu doğrulamak için, gibi basit bir senaryo yazmaya:

<?php 
$link = mysql_connect('localhost', 'user', 'pass'); 
echo "Connection done\n"; 
echo mysql_real_escape_string("this ' is a test"); 
?> 

Ve strace aracılığıyla çalıştırın:

$ strace php t.php 
....   # here comes the connection to mysql, socket fd == 3 
connect(3, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0 
fcntl(3, F_SETFL, O_RDWR)    = 0 
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 
....   # talking with mysql here 
poll([{fd=3, events=POLLIN}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}]) 
read(3, "8\0\0\0\n5.1.58-log\0\3\0\0\0K-?4'fL+\0\377\367!"..., 16384) = 60 
... 
read(3, "\7\0\0\2\0\0\0\2\0\0\0", 16384) = 11 
       # first php echo 
write(1, "Connection done\n", 16Connection done )  = 16 
       # second php echo 
write(1, "this \\' is a test", 17this \' is a test)  = 17 
munmap(0x7f62e187a000, 528384)   = 0 
.... 

orada sadece önemli şey Bu, echo ifadelerinin neden olduğu iki write ifadesinin arada başka bir sisteme sahip olmamasıdır - bir ağ iletişimi olmadan bir syscall olmadan bağlantı mümkün değildir (yine de linux'taki kullanıcı alanından).

+0

Neden bu hata iletisini alırım, mysql_real_escape_string işlevini herhangi bir veritabanına bağlantı olmadan kullanmaya çalışıyorum: 'Kullanıcı 'a3160679' @ 'localhost' için erişim reddedildi (parola kullanma: NO)/home/a3160679/public_html/index.php on line 51' – Pacerier

+1

Bir bağlantıya ihtiyacınız vardır, çünkü bu işlev aslında bazı sunucu ayarlarına bağlıdır (bağlantı bilgilerinde önbelleğe alınır). – Mat

İlgili konular