Store '\ abc \ def \ fg.jpg' MySQL Sorunu

5 Cevap php

Ben MySQL tabloya bir belgenin göreli yolunu saklamak gerekir. Sorun olduğunu ben bu formun bir dize eklediğinizde:

$urlPath ='\abc\def\fg.jpg'

ilgili sütuna, ben ne olsun, ben tüm metin önünde bilinmeyen bir sembol ile tüm çizgi '\' kapalı şerit var. Yani MySQL tablosundaki sonucu böyle bir şey olur:

'(weird symbol)abcdeffg.jpg'

Gördüğünüz gibi, verilerin bu tür işe yaramaz. Bu nasıl düzeltmek için herhangi bir fikir?

Düzenleme: Ben denedim $urlPath ="\\abc\\def\\fg.jpg" ve $urlPath ='\\abc\\def\\fg.jpg', hala saçmalamaya var ..

5 Cevap

Sen \ karakteri özel bir anlamı vardır, çünkü PHP için iki kez, önce kaçmak gerekir:

Kimden docs:

To specify a literal backslash before a single quote, or at the end of the string, double it (\)

$urlPath ='\\abc\\def\\fg.jpg';

Literal dize şimdi \ 'ler de MySQL için özel bir anlamı olan içerdiğinden daha sonra MySQL için tekrar kaçmak gerekir.

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

$databaseUrlPath = mysql_real_escape_string($urlPath);

MySQL bağlıdır istemiyorsanız, bunun yerine addslashes kullanabilirsiniz:

Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash () and NUL (the NULL byte).

$databaseUrlPath = addslashes($urlPath);

Bir ekleme / güncelleştirme sorgusu bu dizeyi kullanmadan önce dizede özel karakterler kaçış için mysql_real_escape_string () kullanın.

PHP ve MySQL - onlar her iki düzeyde de kaçtı gereken çok tersbölüler PHP ve MySQL özel karakterlerdir.

Bu deneyin ...

$urlPath ='\\abc\\def\\fg.jpg'

ne demek ben herhangi bir MySQL bağlantısı açıldığında bile olmadan çalışır kodunu istediğiniz vardır.

Üzgünüz, bu mümkün değil: kaçan yöntemleri bağlantı özgü olduğundan, aslında doğru kaçışa yapmak için bir bağlantı gerekiyor:

  1. Bazı karakter setleri, 0x27 ve 0x5C byte (' ve \), ters bölü-kaçan onu yanlış sonuçlar üretecektir bu durumda bir çok bayt karakteri, bir parçası olabilir ve may aslında introduce bir SQL enjeksiyon imkanı! Yani bağlantının karakteri hakkını kaçmak için set ' characters yerine bytes bilmek zorunda.

  2. Sunucu ANSI SQL uyumlu olması için yapılandırma seçeneği NO_BACKSLASH_ESCAPES kullanıyorsa, ters-öncelemeli yapılacak yanlış bir şeydir ve SQL enjeksiyonu karşı korumak değildir.

Yani mysql_real_escape_string ihtiyacım var ve bir bağlantı nesnesi doğru bir dize kaçmak için. O çalıştırılan sorgu geçmeden önce doğru zaman mysql_real_escape_string şey sadece andır çünkü bu genellikle bir sorun değildir. Aksi takdirde mysql-kaçtı dizeleri etrafında geçen olmamalıdır.

Eğer kullanmak istemiyorsanız / ANSI seçeneklerini desteklemek ve veritabanı bağlantı seti daima bir tek-bayt karakter kullanarak olacak ya da olmayan ASCII karakterleri görünür asla emin emin misin, ya güvenle {[kullanabilirsiniz (0)]} yerine, bir bağlantı gerektirmez.

Ama daha iyi parameterised queries kullanmak için böylece bu malzeme herhangi düşünmek zorunda değilsiniz.

\ karakteri php dahil olmak üzere birçok programlama ve kodlama dilleri için bir kaçış karakteridir.

Bunu kaçmak için çift \ kullanmak gerekecek. Eğer 'gibi semboller girmek "ve böylece bir veritabanına veya kullanmak", bir dize içinde $ MyStr = benim dizesinde "ben \ olabilir" "gibi bir şey istiyorsanız aynı gider;