2013-07-03 52 views
-1

正如標題所說,我試圖使用HTML表單中發送的數據將一行插入到MySQL表中。但是,某些表單域可以留空。以前,對於select語句,我做了這個循環來檢查哪些字段不是空的並形成一個SQL查詢字符串(僅用於說明),其中$ sql是一個類似於「SELECT * FROM table WHERE」的語句:PHP和MySQL - 根據非空表單域插入列

for ($i = 0; $i < $size; $i++) { 
if($i != $size - 1) { 
    if(!empty($formData[$i])) { 
     $sql = $sql . " {$formFields[$i]} LIKE \"%{$formData[$i]}%\" and"; 
    } 
} else { 
    if(!empty($formData[$i])) { 
     $sql = $sql . " {$formFields[$i]} LIKE \"%{$formData[$i]}%\";"; 
    } 
    else { 
     $sql = substr($sql, 0, strlen($sql)-4) . ";"; 
    } 
} 

}

但是在這種情況下,現在一些插入字段可以是空白的,之前沒有關係,因爲我在做一個「SELECT *」,我只需要擔心WHERE子句。有一個更簡單的方法來做到這一點,除了有一個for循環的怪物?

+2

我很困惑...爲什麼你需要,當你想'select'什麼插入? – sgroves

+2

您可以在MySQL中將列插入到列中。有什麼問題?你想用空白做什麼? –

回答

0

如果你有一個數組,其中的鍵是字段的名稱,你可能會得到一個更小的for循環和更少的條件。一旦你做數據整理上$ _ POST,你可以做這樣的事情......

foreach($formFields as $key => $value) { 
     if(!empty($formFields)) { 
      // build your query 
     } 
    } 

至於不通過所有表單域循環,有可能不是一個更快的方法來做到這一點。我想你可以使用像array_walk這樣的數組函數遍歷所有可用的字段。你仍然必須通過數組中的每個元素,但...

+0

表單字段中可能存在與查詢本身無關的內容。國際海事組織最好循環訪問查詢列並查看它們是否存在於用戶提交的數據中。 – acobster

0

我會使用foreach循環。這是他們的目的,他們會讓你的代碼更容易理解。遍歷所有可能或不可以查詢的列,並在$ _POST/$ _ GET中添加它們。

這是我爲撰寫查詢這樣的一般策略:

<?php 

$formFields = validate($_REQUEST); // PLEASE PLEASE PLEASE VALIDATE/ESCAPE YOUR DATA 

// You should also normalize HTML name fields to actual MySQL column names, if they're different 

// Columns you may or may not want to query 
$columns = array('foo', 'bar', 'buzz'); 

$where = array(); 
foreach($columns as $column) 
{ 
    if(! empty($formFields[$column])) 
    { 
    $where[] = "$column = {$formFields[$column]}"; 
    } 
} 

$where = implode(' AND ', $set); 

$sql = "SELECT * FROM t WHERE $where"; 
0

您將需要建立2串在同一時間,一個用於字段列表,一個用於值列表。

$fields = []; 
$values = []; 
for ($i = 0; $i < $size; $i++) { 
     if(!empty($formData[$i])) { 
      array_push($fields,$formFields[$i]); 
      array_push($values,$formData[$i]); 
     } 
    } 
} 
$sql = "INSERT INTO table(`".implode("`,`",$fields)."`) VALUES('".implode("','",$values)."')"; 

這當然假設您至少有一個非空白字段,並採取了必要的預防措施,以防止注射。