php中的数据类型问题

php中的数据类型问题,php,Php,我不知道为什么,但当url中的id以数字0开头时,代码中的数据类型会出现问题,如下所示: 在这种情况下,id为03A43 我的查询如下所示: mysql_select_db("school", $con); $result = mysql_query("SELECT * FROM student WHERE IDNO=".(int)$_GET['id']); ?> 如果id不是以数字零开始,则设计中没有问题。 以零开始的数字的正确数据类型可能是什么?编辑:直到最近,OP才透露

我不知道为什么,但当url中的id以数字0开头时,代码中的数据类型会出现问题,如下所示: 在这种情况下,id为03A43

我的查询如下所示:

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

?>  
如果id不是以数字零开始,则设计中没有问题。
以零开始的数字的正确数据类型可能是什么?

编辑:直到最近,OP才透露字段的类型是varchar,而不是数字。因此,他/她应使用:

mysql_query("SELECT * FROM student WHERE IDNO='"
           . mysql_escape_string($_GET['id']) . "'");
对于子孙后代,我最初的回答是:


看起来您正试图解析一个十六进制数,在这种情况下,您可以执行以下操作:

hexdec($_GET['id'])
(int)x
与默认为基数10的
intval(x)
相同。您的编号,
03A43
,显然不是以10为基数,因此当它到达
A
时,PHP停止读取它。您也可以说
intval(x,16)
来解析十六进制数,但是由于您将结果用作字符串,所以hexdec可能要快一点点


值得注意的是,许多编程语言将以0开头的数字视为八进制而不是十进制。如果你说
$myvar=031
$myvar
将设置为
25
。这也适用于JavaScript及其
parseInt
函数。在PHP中,由于
(int)
intval
默认为基数10,
intval('031')
将为
31
。但是,
intval('031',0)
将是
25
,因为第二个参数
0
,告诉
intval
自动检测基数。

编辑:直到最近OP才显示字段的类型是varchar,而不是数字。因此,他/她应使用:

mysql_query("SELECT * FROM student WHERE IDNO='"
           . mysql_escape_string($_GET['id']) . "'");
对于子孙后代,我最初的回答是:


看起来您正试图解析一个十六进制数,在这种情况下,您可以执行以下操作:

hexdec($_GET['id'])
(int)x
与默认为基数10的
intval(x)
相同。您的编号,
03A43
,显然不是以10为基数,因此当它到达
A
时,PHP停止读取它。您也可以说
intval(x,16)
来解析十六进制数,但是由于您将结果用作字符串,所以hexdec可能要快一点点


值得注意的是,许多编程语言将以0开头的数字视为八进制而不是十进制。如果你说
$myvar=031
$myvar
将设置为
25
。这也适用于JavaScript及其
parseInt
函数。在PHP中,由于
(int)
intval
默认为基数10,
intval('031')
将为
31
。但是,
intval('031',0)
将是
25
,因为第二个参数
0
,告诉
intval
自动检测基数。

数据库中student.IDNO的类型是什么?将
$\u GET['id']
强制转换为int将使其仅为“3”,这似乎不是您想要的

数据库中student.IDNO的类型是什么?将
$\u GET['id']
转换为int将使其仅为“3”,这似乎不是您想要的
(int)03A43
将输出
3
。你确定里面有一个
A

另一方面,
$\u GET[]
将始终是一个字符串。将字符串强制转换为int将删除前导的
0
。如果需要前导的
0
就不要强制转换它,让字符串保持原样。

(int)03A43
将输出
3
。你确定里面有一个
A

另一方面,
$\u GET[]
将始终是一个字符串。将字符串强制转换为int将删除前导的
0
。如果您需要前导的
0
就不要强制转换它,让字符串保持原样。

引用您的字符串:

mysql_select_db("school", $con);
$result = mysql_query("SELECT * FROM student WHERE IDNO='".$_GET['id']."'")
引用您的字符串:

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

如果希望字符串保持完整,请停止将字母数字字符串转换为整数。你为什么这么做?此外,而且更重要的是,您至少需要避免原始输入。在将其传递给
mysql\u query()
之前,请在其上调用
mysql\u real\u escape\u string()

如果希望字符串保持完整,请停止将字母数字字符串转换为整数。你为什么这么做?此外,而且更重要的是,您至少需要避免原始输入。调用
mysql\u real\u escape\u string()
,然后将其传递给
mysql\u query()

是的,有一个A,id号由字母和数字组成,那么DB中的id类型是VARCHAR,对吗?如果是这样,那么不要将其转换为INT,为什么要这样做?另外,请引用您的查询“…=”$\u GET['id']。“…;”是的,有一个A,id号由字母和数字组成,那么DB中的id类型是VARCHAR,对吗?如果是这样,那么不要将其转换为INT,为什么要这样做?另外,请引用您的查询“…=”$\u GET['id']。“…;”快速,每个人都访问
http://localhost/exp/update.php?id=%27%3B--%0ADROP+表格+学生+级联%3B
。说真的,字符串需要使用
mysql\u escape\u string
进行转义。如果使用mysqli并准备好语句,可能会更好。不?快,每个人都访问
http://localhost/exp/update.php?id=%27%3B--%0ADROP+表格+学生+级联%3B
。说真的,字符串需要用
mysql\u escape\u string
进行转义。如果使用mysqli和prepared语句,可能会更好?