php中的数据类型问题
我不知道为什么,但当url中的id以数字0开头时,代码中的数据类型会出现问题,如下所示: 在这种情况下,id为03A43 我的查询如下所示: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才透露
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语句,可能会更好?