在MySQL Query中转换$ _POST变量

时间:2012-04-08 19:42:24

标签: php mysql

我试图从$ _POST值创建一个MySql查询麻烦是我不想使用所有$ _POST值,因为有些用于其他事情所以我试图比较值名称与数组看到如果它们实际归档在数据库中,那么如果它们是从名称中创建一个查询字符串值

这就是我现在所拥有的

$i = 1;
$b = 1;

$cnt = count($_POST);

foreach ($_POST as $key => $entry)
{

$array = array('Country', 'County', 'Age', 'ect', 'ect');

foreach ($array as $arrayValue) {
    if ($arrayValue == $key) {
$b++;
        if($i == 1) {$query[] = "$key='$entry'";} 
         elseif($cnt == $b) {$query[] = "$key='$entry'";} 
           else {$query[] = "$key='$entry' AND ";}
$i++;
    }
}

}

我现在已经陷入困境我不知道如何将$ QUERY数组中的所有值转换为单个字符串,即$search = "country='United Kingdom' AND county ='example'"

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:1)

$query = array();
$vars = array('Country', 'County', 'Age', 'etc1', 'etc2');
foreach ($vars as $v)
{
    if (isset($_POST[$v]))
    {
        $query[] = $v.' = "'.addslashes($_POST[$v]).'"';
    }
}
$query = implode(' AND ', $query);

答案 1 :(得分:1)

你为自己复杂化了。如果您知道要使用哪些变量,只需检查它们并构建查询:

$sql = "SELECT * FROM mytable WHERE ";

$sql_array = array();

if(isset($_POST['A'])) { $sql_array[] = 'some_col_a = '.$_POST['A']; }
if(isset($_POST['B'])) { $sql_array[] = 'some_col_b = '.$_POST['B']; }
if(isset($_POST['C'])) { $sql_array[] = 'some_col_c = '.$_POST['C']; }

$sql .= implode(' AND ', $sql_array);

你还需要检查mysql攻击等,但这是纯粹的基础知识。

答案 2 :(得分:1)

建议使用:

一个。案例不敏感使用strtolower

B中。使用mysql_real_escape_string

进行卫生

℃。使用in_array进行验证

d。 implode将所有内容整合在一起

$_POST['Country']  = "United Kingdom" ;
$_POST['County']  = "example" ;
$array = array('Country', 'County', 'Age', 'ect', 'ect');
$query = array();

foreach ($_POST as $key => $entry)
{
    if(in_array(strtolower($key), $array) || in_array($key, $array))  
    {
        $query[] = $key . " = '" . mysql_real_escape_string($_POST[$key]) . "'";

    }
}

$search = implode(" AND ", $query);
var_dump($search);

输出

string 'Country= 'United Kingdom' AND County= 'example'' (length=47)

可选

// Optional 
// You array is inconsistent  and contains case sensitive values .. use can use this to convert them to small letters 
array_walk($array, "toLower");
function toLower(&$item, $key)
{
    $item = strtolower($item);
}

答案 3 :(得分:0)

查看implode功能。您应该使用' AND '作为$ glue参数。

答案 4 :(得分:0)

PDO将为您提供多种优势;更不用说参数化查询了。我created a gist将为您提供一种方法,只将您想要的参数列入白名单,构建SQL查询并执行参数化PDO查询。

  1. 第08 - 18行提供了SQL来构建一个临时数据库/表来测试它。
  2. 第23 - 27行处理白名单和where子句构建(只需将'AND'替换为'OR'以构建“ANY”类型过滤器而不是“ALL”)
  3. 第41行构建完整的SQL查询
  4. 第50行执行参数化查询。
  5. 根据我们的示例,以下是$parameters数组所包含的内容:

    array(3) {
      'Country' => string(3) "USA"
      'County'  => string(6) "Nassau"
      'Age'     => string(2) "21"
    }
    

    $whereClause

    string(38) "Country = ? AND County = ? AND Age = ?"
    

    $sql

    string(72) "SELECT * FROM pdo_whitelist WHERE Country = ? AND County = ? AND Age = ?"
    

    来源的白名单部分(完整来源位于https://gist.github.com/2340119):

    <?php
    
    // whitelist parameters
    $post_input = ['Country' => 'USA', 'County' => 'Nassau', 'Age' => 21, 'EscalatePriviledge' => true, 'MakeMeSuperUser' => 1];
    $whitelist  = ['Country', 'County', 'Age'];
    $parameters = array_map('trim', array_intersect_key($post_input, array_flip($whitelist)));
    $wheres     = array_map(function($fieldName){ return "${fieldName} = ?"; }, array_keys($parameters));
    $whereClause= join(' AND ', $wheres);
    // you should validate and normalize here as well (see: php.net/filter_var)
    

    处理参数化查询的PDO代码:

    $statement = $pdo->prepare($sql);
    $statement->execute(array_values($parameters));
    

    最后,以下是供您参考的链接摘要: