2012-04-08 102 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)); 

最後,這裏是供您參考鏈接摘要: