PHP Tırnak Problemi Çözümü

Daha önceki yazılarımızda PHP ile bazı problemlerin çözümüne değindik. Bu yazımızda PHP Tırnak Problemi Çözümü nasıl yapılır, onu inceleyeceğiz.



Önce problem nasıl oluşuyor onu anlamaya çalışalım.  Örneğin aşağıdaki gibi bir SQL sorgunuz olsun;

$konu= $_POST['konu'];
$sql = SELECT  *  FROM tablo_sikayet WHERE konu='$konu';

mysqli_query($baglanti, $sql);


Burada dikkat  ederseniz $konu alanı tek tırnaklar içine yazılmıştır. Peki gelen veri içinde de tırnaklar varsa ne olacak, tabi ki hata ile karşılacaksınız. Örneğin formdan gelen veri; Elazığ'ın Sorunları gibi tırnaklar içeriyorsa aşağıdaki gibi bir SQL ekranda göreceksiniz.

SELECT * FROM tablo_sikayet WHERE konu='Elazığ'ın Sorunları';

Yukarıdaki SQL kodu aşağıdaki hatayı verecektir. Burada SQL yazımında bir problem olduğu, problemin satır 1 deki 'ın Sorunları ifadesinden yani apostrof dediğimiz tırnaktan kaynaklandığını belirtiyor.

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 'ın Sorunları'' at line 1

Bu problemin üstesinden gelmek için POST olarak aldığımız verileri aşağıdaki gibi bir fonksiyondan geçirerek tırnak işaretlerini kodlayacağız.

NOT: Bu şekilde kullanım aslında SQL Injection (SQL Sızıntısı) atağı çözümü için bile kullanılabilir.

htmlentities($degisken, ENT_QUOTES, "UTF-8");

Yukarıdaki şekilde kodladığımızda  verimiz, Elazığ'ın Sorunları gibi kodlanmış bir şekle dönüşecektir, bu şekilde veritabanına yazdığınızda bir problem oluşmayacaktır. 

Şimdi de, Kodladığımız veriyi veritabanından çekip ekrana yazmadan öncede de aşağıdaki gibi tekrar normal haline çevireceğiz.

html_entity_decode($degisken, ENT_QUOTES,"UTF-8");

Şimdi bu satırları fonksiyon haline getirelim. ftirnak_kodla fonksiyonu tüm $_POST, $_REQUEST, $_GET ile gelen veriler için  uygulanabilir. 

function ftirnak_kodla($degisken){
  $degisken= htmlentities($degisken, ENT_QUOTES, "UTF-8");
  return $degisken;
}


Burada $_POST ifadesi aslında formdan gelen değişkenleri ve değerlerini tutan bir dizi olduğuna göre array_map  fonksiyonu ile tüm diziyi bizim fonksiyonumuzdan aşağıdaki gibi geçirebilir. 

if (!empty($_POST)) 
$_POST=array_map("ftirnak_kodla", $_POST);

Şimdi aynı işlemi $_GET ve $_REQUEST için yapacak olursak;
 
if (!empty($_GET)) 
$_GET= array_map("ftirnak_kodla", $_GET);

if (!empty($_REQUEST)) 
$_REQUEST=array_map("ftirnak_kodla", $_REQUEST);
 
Şimdi de gelelim, veritabanından çektikten sonra ekrana verileri basarken yapacağımız işlemlere. 
 
function ftirnak_dekodla($degisken){
    $degisken= html_entity_decode($degisken, ENT_QUOTES,"UTF-8");
    return $degisken;
}

Yukarıdaki fonksiyonu aşağıdaki şekilde kullanıyoruz.

$sonuc=mysqli_query($baglanti, "SELECT * FROM tablo_sikayet");
$satir = mysqli_fetch_array($sonuc); 
$satir =array_map("ftirnak_dekodla", $satir);

Bir PHP probleminin de sonuna geldik, iyi çalışmalar, mutlu kodlamalar dilerim.

Oğuzhan TAŞ,
Mart, 2016
 

Bookmark and Share