2014-02-14 49 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] => ... 
     ) 
    ) 
    */