2014-02-14 46 views
0

我拥有的是一个动态网址。 _gets的数量会发生变化,数值也会不同。我正在使用_gets的值来构建一个mysql查询,但我无法将它们从url中取出。如何从url获取动态_gets?

现在,我有这样的:

preg_match_all('/&field_\d+/', $_SERVER['QUERY_STRING'], $matches); 

这是越来越比赛,我只是不知道在哪里何去何从,或者这是连去了解它的正确方法。我只需要它遍历所有的field_#'s并返回它们的值,以便我可以在构建查询时使用它们。

有人能指出我正确的方向吗?我一直在尝试一段时间,现在我可能已经在想它了。

谢谢

+0

什么是** _获得** ?? – 2014-02-14 00:28:03

+1

这听起来像你在构建查询字符串时需要使用数组访问表示法。类似'fields [0] = foo&fields [1] = bar&fields [2] = abc'这样你就可以简单地访问'$ _GET ['fields']'中一个漂亮的,预建好的数组中的所有字段。只要知道,只要你看到自己在代码中做类似'key_#'的事情,这是一种反模式,你应该使用一个数组。 –

回答

0

我不太明白你的意思,但我假设你想要得到的值了查询字符串与未知的变量名?如果是这样,请使用$ _GET超全局并循环。

是这样的:

foreach($_GET as $var => $value){ 
    //build your query or whatever 
} 
+0

这对我很有用,非常感谢。我知道我在想这件事。我有更多的代码比需要。所以我用这个:'foreach($ _ GET as $ var => $ value)if(preg_match('/ field_ \ d + /',$ var)){ \t \t $ build_query。='AND'。$变种“。 ='。$ value; \t} } ' – stinkysGTI

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)); 
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] => ... 
     ) 
    ) 
    */