从表单select而不是querystring中获取参数值


get parameter value from form select instead of querystring

我有一个URL结构,其中包含查询字符串和名为position的参数。

示例:

http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator

我还有一个表单选择选项下拉列表,表单选择名称为position

示例:

<form action="/jobs/" method="GET" id="menuform">
<select name="occupation" onChange="populate(this.id,''position'')">
<option selected="" disabled="">Select Occupation</option>
<option value="administrator">Administrator</option>
</select>
<select name="position" onChange="this.form.submit()">
<option selected="" disabled="">Select Position</option>
<option value="network administrator">Network Administrator</option>
</select>
</form>

当用户进行选择时,它会将选项值发送到操作属性,并将select name="position"作为要在查询字符串中使用的参数。

我的问题是,如何将表单选择值与查询字符串值分开访问?

我使用_GET方法来调用查询字符串参数中的值。

示例:

$position = isset($_GET['position']) ? ($_GET['position']) : '';

显然,它是从URL结构而不是表单元素中获取值的。或者两者兼而有之,不确定。但测试它,我似乎得出结论,它是从URL,而不是形式

在PHP中进行比较时,如何确保访问表单选择值?

更新

我遇到的问题是在标题中设置了规范的URL。

<link rel="canonical" href="http://computerhelpwanted.com/jobs/?occupation=administrator&position=network-administrator" />

该链接是谷歌上的索引链接。我知道我可以做一个htaccess重定向到新链接,但我只是想知道如何显示这个页面的规范url。

应该是

<link rel="canonical" href="http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator" />

唯一的区别是查询字符串中的CCD_ 3和CCD_。

并非我的所有查询字符串都具有+。有些人有-。但我在两个url上都显示内容,无论它是-还是+。无论哪种方式,两个url都获得相同的页面内容。

但是,由于规范是根据URI而不是表单元素中的值动态创建的,因此两个内容页都有两个不同的规范。

使用_Get('value')是从查询字符串而不是表单元素中提取值。我知道这一点是因为表单元素值在network administrator之间有一个空格,当表单以network+administrator的形式提交时,该空格会被url编码。因此,如果我可以与form元素的值进行比较,我就可以设置正确的规范。

HTTP是一个无状态协议,您可以在调用所需页面时生成HTML内容,然后它就在那里了。当与form元素交互时,可以从预定义的(使用DOM构建的)选项中放入select值,然后将其传递给另一个文件进行处理。当您将值传递给该处理器文件时,您可以通过各种方法来实现(为了简单起见,我们只看一下GET和POST方法)。

GET:将把你的表单参数转换为你在问题中发布的url查询当数据以GET数组的形式到达处理器文件时,文件本身不知道它是从哪种形式获得的,它只看到查询

POST:将您的参数编码到传输层中,使其看起来不可见,但它仍然存在。

使用GET,您可以手动使用故意无效或恶意的参数形成查询,并使用这些参数调用处理器文件。POST也可以通过程序设置为恶意,但提供了一个方便的模糊级别,考虑到你的问题,可能会提供你想要的效果("不直接从url中获取")。

编辑

根据OP问答中可见的模式简化表单参数处理的代码:

$validKeys = array(
    'position',
    'occupation'
);
foreach ($validKeys AS $key){
    ${$key} = isset($_GET[$key]) ? $_GET[$key] : '';
}
/* other processing code */

有了以上内容,如果您有15个输入参数,您就不必逐一查看所有参数,因为${$key}允许您创建动态命名的变量,并且您只需更新$validKeys容器(它也可以填充数据库中的值,而不是手动控制)。根据你最新的评论,我认为你可能正在寻找这样的东西。

这是因为您使用的GET可以通过URL轻松操作。

我建议将方法更改为POST。它可以通过使用调试器进行编辑。