我拥有的是动态网址。 _gets的数量将发生变化,值也会不同。我使用_gets的值来构建一个mysql查询,但是我无法将它们从网址中删除。
现在,我有这个:
preg_match_all('/&field_\d+/', $_SERVER['QUERY_STRING'], $matches);
它正在进行比赛,我只是不确定从哪里开始,或者这甚至是正确的方法。我只需要它遍历所有字段_#并返回它们的值,以便我可以使用它们来构建查询。
有人能指出我正确的方向吗?我已经尝试了一段时间,我现在可能已经过度思考了。
谢谢
答案 0 :(得分:1)
首先从表格中实际存在的列数组开始:
$real_columns = array("field1", "field2", "field3");
过滤$ _GET超全局,这样您只能使用与列匹配的子集:
$inputs = array_intersect_key($_GET, array_flip($real_columns));
创建一个field = ?
个术语的数组:
$terms = array_map(
function($field) { return "`$field`=?"; },
array_keys($inputs)
);
准备SQL语句:
$sql = "SELECT * FROM mytable ";
if ($terms) {
$sql .= "WHERE " . implode(" AND ", $terms);
}
$stmt = $pdo->prepare($sql);
$stmt->execute(array_values($inputs));
答案 1 :(得分:0)
我不太清楚你的意思,但我假设你想从一个包含未知变量名的查询字符串中获取值?如果是这样,请使用$ _GET超全局并循环遍历它。
类似的东西:
foreach($_GET as $var => $value){
//build your query or whatever
}
答案 2 :(得分:0)
您没有理由使用这种方法。您可以使用许多工具,这些工具比使用某些正则表达式方法逻辑要好得多。
首先,无论您在何处构建查询字符串,都应该使用数组访问表示法。所以,假设您目前有一个包含以下字段的表单:
<input name="field_1" ... />
<input name="field_2" ... />
...
<input name="field_n" ... />
你应该这样做:
<input name="field[1]" ... />
<input name="field[2]" ... />
...
<input name="field[n]" ... />
当您通过GET提交表单时,这将在$_GET['field']
中为您提供一个很好的数组,其中包含括号内的值。像这样:
var_dump($_GET['field']);
/*
Outputs something like
Array(
[1] => ...,
[2] => ...,
...
[n] => ...
)
*/
如果您不需要强制执行订单,则可以使用[]
括号来获取0索引数字数组。
您现在拥有所有值,而不对字符串进行任何正则表达式解析。
您应该注意的第二个工具是parse_str()
。如果您曾经有过实际解析查询字符串的问题,请使用此方法(不要使用explode()
)。
$query_string = 'field[1]=foo&field[2]=bar...'; // some query string
$query_string_data = array();
parse_str($query_string, $query_string_data);
var_dump($query_string_data);
/*
Outputs something like
Array(
'field' => Array (
[1] => ...,
[2] => ...,
...
[n] => ...
)
)
*/