2010-08-31 146 views
3

接下来的一周,我被一个可悲的非常慢的单杠EDGE互联网连接卡住了,所以请原谅我,如果我没有花足够多的时间研究这个,但是我只需设置一个本地服务器来测试我通常会在互联网上进行测试的代码,并且它在我的本地LAMP安装上似乎没有相同的工作方式。数组中的PHP字符串只返回第一个字符

的问题是,当我这样做:

echo strtolower($_REQUEST['page']); 

的结果是这样的:

files 

然而,当我这样做:

$page['name'] = strtolower($_REQUEST['page']); 
echo $page['name']; 

的结果是这样的:

f 

不,这不是一个错字,它始终只返回字符串的第一个字母。执行var_dump($page)将导致string(5) "files",但执行var_dump($page['name'])将导致string(1) "f"。我正在使用PHP 5.2.1

这是怎么回事?

谢谢!

Ari

+1

你百分之百确定你已经在这里发布的代码是相同的,你实际上是在做什么? – Amber 2010-08-31 03:15:09

+0

你在哪里声明位置'文件'的值? – 2010-08-31 03:16:16

+0

是的,我从字面上复制和粘贴。 – AriX 2010-08-31 03:18:35

回答

7

你几乎回答了你自己的问题。 $page是“文件”(如您的第一个var_dump所示)。这可能是由于已弃用的register_globals或其手动近似引起的。鉴于此,

$page['files'] 

是“f”。这是因为非数字字符串被隐式转换为0(!)。您可以轻松地重现此:

$page = 'files'; 
echo $page['files']; 
+0

在发布之前,我已经想清楚了。是的,$页面被设置为文件,但我不知道。显然这个问题源于我的本地安装中打开的PHP设置,但不是远程设置,这使得如果GET变量“page”设置为文件,$ page也将被设置为文件。 感谢您的帮助。 – AriX 2010-08-31 03:21:16

+0

@AriX'register_globals'我想?准确地说,你总是需要正确初始化变量*和*关闭'register_globals'。 – deceze 2010-08-31 03:23:39

+0

是的,它是我刚刚关闭的register_globals。我不知道为什么它首先出现 - 我不记得打开它,也许它默认使用Mac XAMPP? 再次,谢谢! – AriX 2010-08-31 03:31:39

1

做一个var_dump($page)将导致string(5) "files"

这意味着变量$page是一个字符串,而不是因为你似乎期望包含字符串数组。你也可以在字符串上使用类似数组的偏移量来返回字符串中的单个字符。通过类型铸造的魔法$string['files']相当于$string[0],它返回第一个字符。

您的问题是某处将字符串分配给$page,或者在此之后您将其从数组转换为单个字符串。您提供的代码应该按原样运行。

我想$page已经是一个字符串时,分配给$page['name'],所以你实际上设置字符串的第一个字符。尝试明确声明$page = array()

+0

是的,这就是问题所在 - 我显然没有清楚地读到var_dump的输出,以至于我认为它不是一个数组,我认为register_globals已关闭(因为它应该是)。 – AriX 2010-08-31 03:31:05

0

总结:这是一个变量声明的问题。使用阵列之前,首先声明它:

$page = array(); 

祝奇怪的服务器配置工作。

相关问题