【问题标题】:PHP - Looping through a QueryStringPHP - 通过 QueryString 循环
【发布时间】:2013-03-03 00:34:44
【问题描述】:

尝试在 php 中循环查询字符串,但只获取最后一个值。我应该怎么做才能获得所有值?

示例: 查询字符串 = ?style=ranch&style=barn&style=colonial

php:

$sqlStyle = "SELECT DISTINCT COUNT(*) as count  FROM houses_single ";
$i = 1;
foreach ($_GET as $key => $value) {
    if ($i == 1){
        $sqlStyle .= "where ";
     }else{
        $sqlStyle .= " and ";
    }
    $sqlStyle .=  $key . " like '%" . $value ."%'";
    $i++;
 }
 echo $sqlStyle;

结果: SELECT DISTINCT COUNT(*) as count FROM house_single Where Houses like '%colonial%'

【问题讨论】:

  • style 需要是 HTML 表单中的一个数组,以便通过 key style 传递多个值
  • 房子可以是牧场、谷仓和殖民地?

标签: php loops foreach query-string


【解决方案1】:

在这种情况下,查询参数“style”是一个数组,必须用方括号标识 - 如果不是,最后一个 key=value 对将覆盖其他对。

?style[]=ranch&style[]=barn&style[]=colonial

$_GET['style'] 是一个数组,然后您可以使用 foreach 循环遍历:

foreach ($_GET['style'] as $value) {
    // ...
}

如果 'style' 不是您要添加的唯一参数,您可以在 foreach 循环中使用 is_array() 检查:

    foreach ($_GET as $key => $value) {
        if ($i == 1){
            $sqlStyle .= "where ";
         }else{
            $sqlStyle .= " and ";
         }

         if(is_array($value)) {
             $sec = array();
             foreach($value as $second_level) {
                 $sec[] =  $key . " LIKE '%" . $second_level."%'";
             }
             $sqlStyle .= implode(' AND ', $sec);
         }
         else {
            $sqlStyle .=  $key . " LIKE '%" . $value ."%'";
         }

         $i++;
     }
     echo $sqlStyle;

没有 foreach 的替代方案:

<?php

$statement = "SELECT DISTINCT COUNT(*) as count FROM `houses_single`";

if(is_array($_GET)) {
   $statement .= ' WHERE';

   // create copy to keep the $_GET array
   $add_where = $_GET;

   array_walk(function($elem,$key){
      is_array($elem) {
         return implode(' AND ', array_map(function($sec) using ($key)  {
             return "$key LIKE '%$sec%'";
         }, $elem);
      }
      else {
            return "$key LIKE '%$elem%'";
      }
   },$add_where);

   $statement .= implode(' AND ', $add_where);
}

(代码未经测试)

关于安全的Sidenode:希望您不要在生产环境中使用您提供的这段代码sn-p,而无需任何转义参数。

【讨论】:

  • 那我如何遍历查询字符串呢?我知道你为什么说不要在生产中这样做,但我该怎么做呢?
  • 更新了答案,希望这符合您的需求。为了安全,请查看mysqli_real_escape_string
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多