2012-04-08 68 views
1

我试图从$ _POST值创建一个MySql查询问题是我不想使用所有$ _POST值,因为有些用于其他事情,所以我试图比较对一个数组值的名字,看看他们是否有实际申请在DB那么,如果他们都出了名的创建一个查询字符串的值

这是我到现在为止

$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'"

任何帮助将不胜感激。

+1

不要这样做。使用[prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)。 – 2012-04-08 19:44:18

回答

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

'addslashes'不是逃避MySQL数据的正确方法。使用'mysql_real_escape_string',例如另外,MySQL中正确的分隔符是单引号。 – Ryan 2012-04-08 19:56:18

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的攻击等,但这是纯粹的基础。

1

什么我的建议是使用:

A.不区分大小写使用strtolower

使用 mysql_real_escape_string

C.使用in_array进行验证

D. implode把一切融合在一起

B.卫生

$_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); 
} 
+0

你为什么要不区分大小写?如果没有这个,你可以让它变得更加复杂。 – Ryan 2012-04-08 20:06:12

+0

看看他的数组..它包含'国家'和'ect'我认为这是不一致的,这可能会导致他的功能 – Baba 2012-04-08 20:10:56

+0

麻烦他怎么样'$ array ['A']'''''阵列[''一个']'? PHP区分大小写,不要忘记这个! – Botanick 2012-04-08 20:14:17

0

PDO会为您提供几个优点;更不用说参数化查询了。我有created a gist这将给你一个只列出你想要的参数的白名单,建立一个SQL查询并执行一个参数化的PDO查询。

  1. 第08 - 18行为您提供SQL以构建一个临时数据库/表来测试它。
  2. 第23 - 27行处理白名单和where子句的构建(只需用'OR'替换'AND'来构建“ANY”类型的筛选器而不是“ALL”)
  3. 第41行构建完整的SQL查询
  4. 第50行执行参数化查询。

这里是什么$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)); 

最后,这里是供您参考链接摘要: