是否可以基于url的所有“未知”$ _GET参数创建MYSQL查询?

时间:2012-12-07 12:52:31

标签: php sql get

我知道,例如,如果你知道什么参数,你可以简单地使用

$_GET['parameter']
在您的MYSQL查询中

。如果您期望4-5参数怎么办,但是并非所有参数都通过?例如,假设用户想要列出price超过20$warranty 2年的所有产品。

用户可以拥有更多搜索选项,例如,产品类别应为2 <{1}}

现在,我的问题是,我应该有多个if语句并检查每个可能的参数以查看它们是否已设置,以及它们是否包含在我的MYSQL查询中,还是有更快的方法? 提前谢谢

2 个答案:

答案 0 :(得分:0)

你应该试试foreach。类似的东西:

foreach($_GET as $key => $value) {
   switch($key) {
      case "category":
         $str[] = "category = '". mysql_real_escape_string($value) ."'";
         break;
      case "price":
         $str[] = "price > '". mysql_real_escape_string($value) ."'";
         break;
      case "warranty":
         $str[] = "warranty > '". mysql_real_escape_string($value) ."'";
         break;
   }
}
//create the mysql string with
$str_where = "WHERE " . implode('AND', $str);

你可以使用str_where字符串过滤产品。

答案 1 :(得分:0)

出于安全原因,我肯定会列出可用于查询的数据类型的可用密钥。

$keys = array(
    'category'  => PDO::PARAM_INT,
    'price'     => PDO::PARAM_INT,
    'etc'       => PDO::PARAM_STR
);
// all the available keys for the query and their types

$queryStr = "SELECT * FROM `some_table` WHERE `yourCond`='someVal'";
// initial query you have

$userVals = array();
foreach ($_GET as $key => $value) {
    $k = strtolower($key);
    if (!in_array($k,array_keys($keys)) || empty($value))
    // if the key is not listed in the keys array
    // or the value is empty we skip it
        continue;
    $queryStr .= " AND `$k` = :{$k} ";
    // modify query
    $userVals[$k] = $value;
    // and add the key-value pair into user values array
}

$db = new PDO('mysql:host=someHost;dbname=someDB','someUsername','somePassword');
// create DB connection
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
// enable error reporting
$stmt = $db->prepare($queryStr);
// prepare query string
foreach ($userVals as $k => $v) {
    $stmt->bindParam(":{$k}",$v,$keys[$k]);
    // bind each parameter with the right datatype
}

$stmt->execute();
// and execute the query