Php 查询字符串可以包含字符串以外的任何内容吗?
我在工作中从事一个项目,遇到了以下代码:Php 查询字符串可以包含字符串以外的任何内容吗?,php,types,query-string,Php,Types,Query String,我在工作中从事一个项目,遇到了以下代码: $queryStringValue = $_GET['var']; if ( is_string($queryStringValue) ) { // Do something. } 我的问题:是否调用Is_string()来检查查询字符串值是否是完全不必要的字符串?根据定义,“查询字符串”使我相信数据类型只能是字符串,因此调用is_string()是多余的 我是对的,还是有时可以在查询字符串中传递不同的数据类型 感谢您的任何见解 是的,它包含
$queryStringValue = $_GET['var'];
if ( is_string($queryStringValue) )
{
// Do something.
}
我的问题:是否调用Is_string()来检查查询字符串值是否是完全不必要的字符串?根据定义,“查询字符串”使我相信数据类型只能是字符串,因此调用is_string()是多余的
我是对的,还是有时可以在查询字符串中传递不同的数据类型
感谢您的任何见解 是的,它包含。
它可以有您想要的任何类型,包括数组、整数、浮点等。查询字符串本身是一个
字符串
,但其中的变量可以解析为字符串
或数组
:
url.com?var=123
=>var是字符串
url.com?var[]=123&var[]=321
=>var是一个数组根据PHP手册的“确定变量类型”部分:
HTTP是一种文本协议,大多数(如果不是全部的话)超全局数组中的内容,如$\u POST和$\u GET,将保留为字符串。PHP不会尝试将值转换为特定类型
同样,在手册中,我们阅读了有关阵列的内容:
要将
结果作为数组发送到PHP脚本,请将
、
或
元素命名如下:
…
这将变成一个查询字符串?MyArray[]=foo&MyArray[]=bar
等,可作为$\u GET['MyArray'][0]
和$\u GET['MyArray'][1]
使用。您还可以使用命名密钥;查询?var[x]=one&var[y]=two
将导致关联数组$\u GET['var]=['x'=>'one','y'=>'two']
;而?var[x][]=deep
将变成$\u GET['var']['x']=['deep']
,等等
此外,委员会注意到:
注意:
GET变量被传递
然后,请参见urldecode
的签名:
urldecode ( string $str ) : string
换句话说,用于预处理$\u GET
值的函数接受字符串并返回字符串。显然,当有数组传入时,它将对该数组的每个字符串值应用urldecode
。(如果有人想找到负责生成$\u GET
的PHP源代码部分,请共享该链接,并将其包含在此处。)
请注意,空值(例如在?foo&bar=1
中)不会导致[foo]NULL
,而是导致[foo]string(0)“
,换句话说,长度为零的字符串。同样,我们得到[bar]字符串(1)“1”
。没有将get
或post
值转换为整数、浮点数、布尔值或null的类型转换
总之,在$\u GET
中接收到的可能的数据类型是string
和array
(字符串;或更多的数组;最后的标量“叶子”是字符串)。当然,如果在PHP代码中显式声明$\u GET['foo']=null
或$\u GET['bar']=1
,则会有整数和null。上述内容适用于PHP从外部源解析的变量
更新:虽然上述情况适用于从查询字符串解析的所有值,但PHP从查询字符串中提取的键则不同。假设以下URL:
test.php?101=foo&202=bar&dev=ops
现在,对于数字键,var\u dump(array\u keys($\u GET))
将返回什么?整数,而不是字符串:
array(3) {
[0] · int(101)
[1] · int(202)
[2] · string(3) "dev"
}
这与PHP的“包含有效十进制整数的字符串(除非数字前面有+符号)将转换为整数类型”是一致的。但是,以下键转换将不会发生:“浮点也转换为整数,这意味着小数部分将被截断。”因为(如中所述):“外部变量名中的点和空格将转换为下划线。”
外部变量类型转换:摘要
- 查询字符串的值将始终是字符串,或以字符串作为其最终标量值的(数组的)数组
- 查询字符串的键将始终是字符串,但整数除外(无符号正:
3
,有符号负:-3
)
我没有测试它,但是参考$\u GET[“index”]
的响应可能是一个数组!is_array()
,虽然在本例中功能相当,但在示例代码中更具启发性。它可以有任何类型,给我举个例子,怎么能包含一个对象?@GNassro我想他不知道自己在说什么。我要输入马铃薯(标量)。如何实施?!回答得很好。感谢您的解释、示例和来源。感谢您@Markus和GTS提出的这个问题,向上投票:)似乎这个问题从来没有被明确地问过/回答过,所以——很乐意效劳。:)在关于外部输入数据类型的脚注中,我们看到了AJAX请求在请求后正文中发送JSON数据的情况。这些将不会出现在超全局中,需要通过php://input
。当json\u decode()
'd时,这些数据将具有json已知的全部数据类型。这里有一个非常好的Q/A和更多细节:添加了一个关于数字键的整数转换的注释。然后,完整的结论是:查询字符串的值将始终是字符串或带字符串的数组。查询字符串的键将始终是字符串,但转换为整数的整数除外。