在我的原帖中,我似乎隐含了我的变量名称有一个连字符。我的问题似乎是下面的htaccess文件不能在连字符上匹配,但我的$ _GET变量内容有一个连字符,而不是变量本身。
我最初引用http://php.net/manual/en/language.variables.variable.php,用户声称不可能用连字符引用php变量($ _POST或$ _GET),但这是在2009年写的。
在我的一个URL中,我允许用户输入一个唯一的ID作为“www.site.com/id123”,其中“id123”被选为带有php的$ _GET变量。有些用户选择使用“www.site.com/id-123”,但无效(除了页面之外没有服务器错误)。
有关于此的任何想法吗?
RewriteEngine On
#if file or directory do not exist, try as an unique id
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9a-zA-Z]+)$ index?ID=$1 [QSA,NC,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
通过更多思考,上面的重写规则似乎可能需要修改才能处理连字符请求。这看起来是对的吗?
答案 0 :(得分:14)
您的.htaccess
文件需要修改才能支持连字符。
更改
RewriteRule ^([0-9a-zA-Z]+)$ index?ID=$1 [QSA,NC,L]
到
RewriteRule ^([0-9a-zA-Z-]+)$ index?ID=$1 [QSA,NC,L]
答案 1 :(得分:5)
字符串的内容可能包含连字符。变量的名称可能不会。
在您的问题中,不清楚HTTP查询字符串的位置。 $_GET['some-variable']
很好,因为数组键是一个字符串。 $my-var
不合适。
如果您的网页请求无效,则.htaccess
文件更有可能出现问题。
答案 2 :(得分:1)
不,这是不可能的
变量名以字母或下划线开头,可选地后跟数字,字母或下划线。 http://www.php.net/manual/en/language.variables.basics.php
对于关联数组键,您可以使用任何字符串;由于字符串允许包含连字符,因此您可以使用$_GET['user-id'];
。
答案 3 :(得分:1)
理论上,you cannot:
变量名称遵循相同的规则 作为PHP中的其他标签。一个有效的 变量名以字母或开头 下划线,后跟任意数量的 字母,数字或下划线。
在实践中,好吧......
<?php
${'widh-hyphen'} = 'This variable has a pyphen';
${'Variable with funny name. Woot!'} = 'And this is even worse!';
var_dump(${'widh-hyphen'}, ${'Variable with funny name. Woot!'});
?>
...打印:
string(26) "This variable has a pyphen"
string(23) "And this is even worse!"
所以我说你可以。
但是,这些内容都不适用于GET和POST输入数据。由于应始终禁用Register Globals,因此您的参数将成为$_GET
和$_POST
关联数组的键和other rules apply:
键可以是整数,也可以是 串。如果一把钥匙是标准 表示整数,它会 被解释为这样(即“8”将 被解释为8,而“08”将被解释为 被解释为“08”)。浮在钥匙上 被截断为整数。索引 和关联数组类型是 PHP中的相同类型,两者都可以 包含整数和字符串索引。
在这种情况下,您必须仅考虑dots are converted to underscores出于历史原因:
变量名中的点和空格是 转换为下划线。例如 变 $ _REQUEST [ “A_B”]。
答案 4 :(得分:0)
正如汤姆所说,你可以在字符串中使用连字符,所以$ _GET [user] ='id-123'不会给你任何问题,也不会发送任何数据,如get.php?user = id-123
我假设您的.htaccess会将www.site.com//id-123重写为/getuser.php?user=id-123 如果是这样,你应该没有问题。
但如果您正在尝试,出于某种原因创建$ id-123,那么您将遇到一些问题..
答案 5 :(得分:0)
一个可以使用替代语法来表示古怪的变量名称:
${'my-var'} = 123;
但正如其他答案所说,这与你的案件完全无关。你不需要它。由于您以数值形式接收数据,因此您甚至不需要遵守$ _GET变量名称转换。
您的案例中的问题(找不到网页)听起来像RewriteRule
问题。检查它的正则表达式中是否包含连字符:
RewriteRule ^([\w+\-]+)$ get.php?id=$1
# ^^ missing
答案 6 :(得分:0)
实际上是的,变量可以有你想要的任何名字。您只需要以其他方式访问它们。
这有效:
$foo = "id-123";
$$foo = "hello";
var_dump($$ffoo);
您可以通过添加var_dump($GLOBALS);
来检查这一点,var_dump($id-123);
将显示名为“id-123”的变量。
但是,您无法以正常方式访问此类变量:$_GET["id-123"]
将无效。
但是,因为你在谈论GET / POST变量:这些只是标准的数组键,它们也可以有任何名称,因为你通过数组访问它们:www.site.com/id123
。
但请注意,您的示例{{1}}表示PATH_INFO,通常与$ _GET或$ _POST无关。