php veri türü sorun

5 Cevap

I don't know why but the data type in this code makes a trouble when the id in the url starts with the number zero like this: http://localhost/exp/update.php?id=03A43 In this case the id is 03A43.

Ve benim sorgu bu gibi görünüyor:

mysql_select_db("school", $con);
   $result = mysql_query("SELECT * FROM student WHERE IDNO=".(int)$_GET['id']);

?>  

There is no problem in the design if the id does not start with the number zero. What might be the proper data type for numbers beginning in zero?

5 Cevap

Sizin dize alıntı:

mysql_select_db("school", $con);
$result = mysql_query("SELECT * FROM student WHERE IDNO='".$_GET['id']."'")

Edit: OP alan tipi varchar değil, bir sayı olduğunu yakın zamana kadar ortaya koymamıştır. Bu nedenle, s / o bu kullanmanız gerekir:

mysql_query("SELECT * FROM student WHERE IDNO='"
           . mysql_escape_string($_GET['id']) . "'");

Kuşaklar için, benim özgün cevabı:


Eğer yapabileceğini, bu durumda bir onaltılık sayı, ayrıştırmak için çalışıyoruz gibi görünüyor:

hexdec($_GET['id'])

(int)x PHP aldığımda okuma durdu yani intval(x), hangi varsayılan 10 tabanına göre. Numaranız 03A43, açıkça, 10 tabanına değil aynıdır için A. Ayrıca intval(x, 16) onaltılık sayı ayrıştırmak için söyleyebiliriz, ama bir dize olarak sonuç kullanarak konum beri, hexdec bir ufacık küçücük biraz daha hızlı muhtemelen.

Dikkatli alakasız bir not olarak, birçok programlama dilleri yerine ondalık daha 0 gibi sekizlik ile başlayan numaralar tedavi. Derseniz $myvar = 031;, $myvar 25 kurulacaktır. Bu, aynı zamanda JavaScript yanı sıra parseInt işlevi için de geçerlidir. PHP, (int) ve intval varsayılan 10 tabanına beri, intval('031') olacak 31. İkinci parametre, 0, intval tabanını yeniden algılamaya söyler Ancak, intval('031', 0) 25 olacaktır.

Eğer dize bozulmadan kalmasını istiyorsanız bir tamsayı olarak bir alfasayısal dize döküm durdurun. Neden bunu yapıyorsun? Ayrıca, ve daha önemlisi, en azından, ham giriş kaçmak gerekir. mysql_query() geçirmeden önce üzerinde mysql_real_escape_string() diyoruz.

Veritabanında student.IDNO türü nedir? $_GET['id'] int döküm istediğini gibi görünüyor değil, sadece "3" yapacak

(int)03A43 çıktısı 3. Eğer orada bir A emin misin?

Öte yandan, $_GET[] her zaman bir dize olacaktır. Int olarak bir dize Döküm önde gelen 0 kaldıracaktır. Sadece bunu döküm yok önde gelen 0 gerekiyorsa, olduğu gibi dize bırakın.