【问题标题】:How do I get dynamic _gets from url?如何从 url 获取动态 _gets?
【发布时间】:2014-02-14 00:25:58
【问题描述】:

我拥有的是一个动态 URL。 _gets 的数量会改变,值也会不同。我正在使用 _gets 的值来构建一个 mysql 查询,但我无法将它们从 url 中取出。

现在,我有这个:

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

比赛开始了,我只是不知道从哪里开始,或者这甚至是正确的方法。我只需要它遍历所有 field_# 并返回它们的值,以便我可以在构建查询时使用它们。

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

谢谢

【问题讨论】:

  • 什么是 _gets ??
  • 听起来您在构建查询字符串时需要使用数组访问表示法。类似fields[0]=foo&fields[1]=bar&fields[2]=abc 这样您就可以简单地访问$_GET['fields'] 中一个漂亮的预构建数组中的所有字段。只要知道,每当您在代码中看到自己在执行 key_# 之类的操作时,这是一种反模式,您可能应该使用数组。

标签: php mysql get


【解决方案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));

【讨论】:

    【解决方案2】:

    我不太明白你的意思,但我假设你想从具有未知变量名的查询字符串中获取值?如果是这样,请使用 $_GET 超全局并循环遍历它。

    类似这样的:

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

    【讨论】:

    • 这对我有用,非常感谢。我知道我想多了。我有比需要更多的代码。所以我选择了这个:foreach($_GET as $var => $value){ if(preg_match('/field_\d+/',$var)){ $build_query .= ' AND '.$var.' = '.$value; } }
    【解决方案3】:

    您没有理由使用这种方法。您可以使用许多工具,这些工具比使用某些正则表达式方法要好得多。

    首先,无论您在哪里构建查询字符串,都应该使用数组访问表示法。因此,假设您当前有一个包含如下字段的表单:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多