2013-06-20 70 views
0

我有一個$ _POST陣列目前採用以下形式:如何遍歷數組元素,創造多重插入查詢

["Area"]=> array(2) { 
    [0]=> string(5) "Title" 
    [1]=> string(5) "Title" 
    } 
["Issue"]=> array(2) { 
    [0]=> string(3) "111" 
    [1]=> string(7) "2222222" 
    } 
["Elevation"]=> array(2) { 
    [0]=> string(8) "11111111" 
    [1]=> string(7) "2222222" 
    } 
["Fix"]=> array(2) { 
    [0]=> string(8) "11111111" 
    [1]=> string(6) "222222" 
    } 
["ExpectFee"]=> array(2) { 
    [0]=> string(8) "11111111" 
    [1]=> string(5) "22222" 
    } 
["Outlay"]=> array(2) { 
    [0]=> string(9) "111111111" 
    [1]=> string(9) "222222222" 
    } 
["ExpctTime"]=> array(2) { 
    [0]=> string(9) "111111111" 
    [1]=> string(11) "22222222222" 
} 
["Checkbox"]=> array(2) { 
    [0]=> string(12) "111111111111" 
    [1]=> string(11) "22222222222" 
    } 

我目前通過它循環像這樣...

if ($_POST['OthProb']['Issue'] != '') { 
     $table = 'tbl_customproblems'; 
     $kv = array(); 

      foreach ($_POST['OthProb'] as $array) { 
       foreach ($array as $value) { 
        $kv[] = "'".$value."'"; 

      } 
      $string = "INSERT INTO $table (AccountID, myID, Area, Issue, Elevation, Fix, ExpectFee, Outlay, ExpctTime, Checkbox) VALUES ('$_POST[AccountID]', '$_POST[myID]', ".join(", ", $kv).")";  
     } 

} else { 
    $string = $_SERVER['QUERY_STRING']; 
} 

$sql = $DBH->prepare($string); 
$sql->execute(); 

哪個幾乎可行!它生產這...

"INSERT INTO tbl_customproblems (AccountID, PropertyID, Area, Issue, Elevation, Fix, ExpectFee, Outlay, ExpctTime, WHCheckbox) VALUES ('81', '81', 'Title', 'Title', '111', '2222222', '11111111', '2222222', '11111111', '222222', '11111111', '22222', '111111111', '222222222', '111111111', '22222222222', '111111111111', '22222222222')" 

我如何修改我的循環產生單獨的插入,每行傳遞一。

+1

你濫用'prepare()'。 '$ _POST'值應該放入'execute()'中。而'$ _SERVER ['QUERY_STRING']'是怎麼回事?這不是一個SQL查詢:) –

+0

認爲我是完全自學的。你能提供一個鏈接澄清請,因爲我不知道你剛纔說什麼。 – Funk247

+0

看看['PDO:prepare()'](http://php.net/manual/en/pdo.prepare.php)的例子docs –

回答

1

它必須是這樣的:

if ($_POST['OthProb']['Issue'] != '') { 
$table = 'tbl_customproblems'; 
$string = 'INSERT INTO $table (AccountID, myID, Area, Issue, Elevation, Fix, ExpectFee, Outlay, ExpctTime, Checkbox) VALUES (:AccountID, :myID, :Area, :Issue, :Elevation, :Fix, :ExpectFee, :Outlay, :ExpctTime, :Checkbox)'; 

$sql = $DBH->prepare($string); 

$i = 0; 
foreach ($_POST['OthProb'] as $array) { 

    $sql->bindParam(':AccountID', $_POST['AccountID'], PDO::PARAM_INT); 
    $sql->bindParam(':myID', $_POST['myID'], PDO::PARAM_INT); 
    $sql->bindParam(':Area', $array['area'][$i], PDO::PARAM_STR); //it can also be PDO::PARAM_STR 

     $sql->execute(); 
     $i++; 
    } 
} 

我沒有綁定所有PARAMS,所以你必須做你自己,我希望你通過這個例子中得到了準備語句的想法。

在準備聲明中,如果您需要整數,您將使用PDO::PARAM_INT,並且您將使用PDO::PARAM_STR作爲字符串。當你不知道這是否是一個整數或字符串你更好的使用PDO::PARAM_STR

+0

感謝您解釋綁定變量是如何工作的,現在我感覺更清楚一點,但是我沒有正確地循環訪問數組,並且正在執行8條插入語句(數組中的每列一條),我只想循環通過第一行,做一個插入,然後遍歷第二行,做一個插入。 – Funk247

0

我得到了它到底使用下面的代碼,它可能哈克到最大,我打算改進它的未來,但它的工作原理。

if ($_POST['OthProb']['Issue'] != '') { 
     $kv = array(); 
     // This will help control the array index 
     $i = 0; 
     // count the number of records in the array 
     $count = count($_POST['OthProb']['Area']); 
     $table = 'tbl_customproblems'; 

     // Loop through each index - stop before we reach the value of count. 
     for ($i=0; $i < $count; $i++) { 
      // Catch the data 
      foreach ($_POST['OthProb'] as $value) { 
        $kv[] = "'".$value[$i]."'";  
      } 
     // Do the insert! 
     $string = "INSERT INTO $table (AccountID, PropertyID, Area, Issue, Elevation, Fix, ExpectFee, Outlay, ExpctTime, Checkbox) VALUES ('$_POST[AccountID]', '$_POST[PropertyID]', ".join(", ", $kv).") "; 
     $sql = $DBH->prepare($string); 
     $sql->execute(); 
     // Unset data value to prevent retention 
     unset ($kv); 
     }