"intval()" fonksiyonu ve hatalı çevrim

Php 5.3.0 ı denemek için, "xampp for windows 1.7.2" kurmuştum. Fena sayılmamayla beraber, olmasından hoşlanmadığım şeyler de vardı. Malum deprecated mesajları vs. derken ufak bir form işleminde intval fonksiyonunun hatalı değerler dönderdiğini gördüm.


Tabi ilk işim $degisken=(int)$degisken; olarak denemek oldu ama ne yazık ki bi değişiklik olmadı. Ne yapayım ne edeyim derken ufak bi hile geldi aklıma. Değişkenimi sıfırla topladım ve sorun kalmadı. Yani şu şekilde bir fonksiyon, sağlıklı çalışır hale geldi.

PHP kodu
  1. <?php
  2. function intdeger($sayi) {
  3. return $sayi+0;
  4. }
  5. ?>

Oldukça basit bir kod. Muhakkak fonksiyon kullanmaktansa
$_POST['deger']=$_POST['deger']+0;
şeklinde filtreleme yapanlar olmuştur ama benim tecrübelerim arasında olmayan, kolay yöntemlerle zor sorunların altından kalkılabileceğini gösteren bir örnek olduğundan paylaşmak istedim.

Başka bir ufak hile ile, yine bu sorun aşılabilir. Bu hileyi de preg_replace ve eval fonksiyonları ile yapabilriz. Şöyleki; eğer rakam dışındaki tüm karakterleri silersek ve $sayi='56'; yerine $sayi=56; şeklinde bir tanımlama yaparsak, sayi değişkenimiz yine int türde tutulmuş olacaktır.

PHP kodu
  1. <?php
  2. function intdeger($sayi) {
  3. $sayi=preg_replace('/[^0-9]/','', $sayi);
  4. eval('$sayi='.$sayi);
  5. return $sayi;
  6. }
  7. ?>

Tabi altta verdiğim örnek intval ile birebir örtüşmez çünkü intval fonksiyonu alfa nümerik bir karakter gördüğü an rakam belirlemeyi keser. Yani "56a98" string değerini intval ile çevirdiğimizde 56 yapar, üstteki fonksiyonda öyle, ancak alttaki fonksiyon 5698 olarak işlemi sonlandıracaktır.

"intval()" fonksiyonu ve hatalı çevrim Oy Sayısı: 20 Puan: 8.05/ 10.00

Etiketler

intval fonksiyonu , intval , php intval , intval() , php intval nedir , intval php , php intval fonksiyonu , intval php nedir , intval nedir , php intval() ,

yasin26 Ekim 2009 Pazartesi 07:39:29


"bir form işleminde intval fonksiyonunun hatalı değerler dönderdiğini gördüm" nasıl yani, ne gibi hatalı degerler döndürüyor.


Gündüz Can YILMAZ28 Ekim 2009 Çarşamba 13:48:44


Şöyle ki, echo intval(53549999999); şeklinde bir satır çalıştırdığımda ekrana 2010392447 yazıyo. php.ini de ayarı falan olabilirama üstteki belirttiğim yöntemlerle buna gerek kalmıyo


AKadir YILMAZ02 Aralık 2009 Çarşamba 07:00:16


32 bit sistemlerde int ve intval'ın sonucu hep işaretli tam sayı oluyor. o da maksimum 2147483647 değerini alabileceğinden kaynaklanıyor. 64 bit sistemlerde sorun olmuyor. Türk çözümü 0 ile topla işine bak. güzel fikir.


Gündüz Can YILMAZ13 Aralık 2009 Pazar 04:13:43


PHP nin kendi manuali de aynı şeyi söylüyor, sanıyorum dönen değer de taşma değeridir çünkü sizin de söylediğiniz 2147483647 üzerindeki sayıları çevirmiyor. Yalnız ne var ki, (int) ve intval() için böyle bir kısıtlama koymalarına ragmen, 0 ile toplama işlemlerinde 32 bitlik bir kısıtlama söz konusu değil. Belki kendilerince sebepleri de vardır ama böylesine ciddi bir değişikliğin pat diye yapılması, şimdiye kadar hiç olmayan bir problemin birden bire cereyan etmesi ve bu değişimin gelişime yönelik değil, geriye yönelik yapmaları, hoş karşılanabilirbir durum değil. O yüzden ben de artık php fonksiyonlarını değil, kendi türettiğim fonksiyonları kullanmayı düşünüyorum. En azından böyle bir değişikliğinde tüm yazdığım kodları değil, yalnız bir fonksiyonu değiştiririm daha iyi.




Yorumunuz