Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查询字符串可以包含字符串以外的任何内容吗?_Php_Types_Query String - Fatal编程技术网

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和更多细节:添加了一个关于数字键的整数转换的注释。然后,完整的结论是:查询字符串的值将始终是字符串或带字符串的数组。查询字符串的键将始终是字符串,但转换为整数的整数除外。