Ne arayalım?

ARAMIZA KATILIN

BİZE ULAŞIN

Adres:

E-posta:

host/bin/bilisimlife.dll

iletisim@bilisimlife.net




 
Rserit
Developer
       
 1026  
 278

ASP'de tek tırnak problemi ve çözümü

Merhabalar,
Bir aralar BilişimLife üzerinde olan bir problemi buraya taşımak istedim. Forum kısmında hata alıyordum. Hata şöyleydi:

Microsoft OLE DB Provider for ODBC Drivers hata '80040e10'
[MySQL][ODBC 3.51 Driver][mysqld-5.1.56-community]SQLBindParameter not used for all parameters
/Forum.asp, satır 877

Ya da şu:

Microsoft OLE DB Provider for ODBC Drivers hata '80040e14'
[MySQL][ODBC 3.51 Driver][mysqld-5.1.56-community]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'piyorsun'?' , '35' , 'Enes' , '20.05.2012 22:38:59' , '310' , '1')' at line 1
/Forum.asp, satır 877

Yani cümlede tek tırnak kullanmama izin vermiyor. Çünkü bunu SQL Injection olarak algılıyor. Ancak yapmanın yolları var. Nasıl?

  •     SQL sorgusuyla kayıt yerine Recordset ile kayıt yapabiliriz. (.addnew)
  •     Replace ile yapılabilir.

Çözümü uygulayalım. Replace ile çok basit oluyor.
Hata yeri /Forum.asp, satır 877 olduğunu söylüyor. Bu satırda şu kod var:

Baglanti.Execute ("INSERT INTO Forum_M (mesaj,kat,yazan,tarih,cid,cevap) VALUES ('"&mesaj&"' , '"&kat&"' , '"&yazan&"' , '"&bzaman&"' , '"&idd&"' , '1')")


Yani, SQL'e bağlanıyor -tablolar altındaki sütunlara-. Sizinde bu kısımda hata verecektir.
Replace ile sorunu halledelim. Hata veren satırın üstüne replace oluşturalım. Kaç tane sütun ismi varsa, hepsine uygulayalım, dileyen dilediği sütuna uygular. Örneğin ben mesaj sütununa oluşturuyorum.

mesaj = replace(mesaj,"'","& #39;")

& #39: Veritabanına bu şekilde kaydetmesi, tarayıcıda tek tırnak olarak gözükecektir. Çünkü tek tırnağın da kodlaması bulunur. Tek tırnağınkisi bu.
Not: & ile # arasındaki boşluğu silin, öyle kaydedin. Eğer kapatmadan verseydim, kodu yazdığımda tek tırnak çıkacaktı.
Kısacası yazdığımız kodda şunu dedik, tek tırnak gördüğün yere tek tırnağın kodunu yaz.

Bir başka replace şuradadır.

Not: Adrese yazdığım replacede veritabanının Mysql olması gerekir, Mssql'de işe yaramaz.

Artık satırdaki kodlar şu hali almış oldu:

Set yuye = Baglanti.Execute("Select * from Uyeler where kadi='"&session("kadi")&"'")
mesaj = replace(mesaj,"'","& #39;")
Baglanti.Execute ("INSERT INTO Forum_M (mesaj,kat,yazan,tarih,cid,cevap) VALUES ('"&mesaj&"' , '"&kat&"' , '"&yazan&"' , '"&bzaman&"' , '"&idd&"' , '1')") yuye.close:set yuye = nothing

Bir replace ile halledilebilen bir problem, gördüğünüz gibi. Uzun uzun anlatım ki bir sıkıntı olmasın.
Bu sorunun bir farklı çözümü, verideki tırnağı atıp, bunun için de bir fonksiyon tanımlamamız gerekiyor. Buna sonra değineceğim, şimdilik bu kadar.

Kolay gelsin.

Recep ŞERIT




Mesaj 11.07.2012 03:17:27 tarihinde Rserit tarafından düzenlenmiştir.

Developer.