2012-07-08 315 views
0

我有以下代碼。我有一個表單設置,有10個輸入字段設置,5列1和5列2。使用數組for循環for循環

try 
{ 
    $count = count($_POST['column1']); 
    $sql = 'INSERT INTO tablename (column1, column2) VALUES '; 

    for ($i=0; $i< $count; $i++) 
    { 
     $sql2 = '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')'; 
     if ($i <$count - 1) { 
      $sql2 .= ','; 
     } 
     echo "$sql2 'indside'<br>"; 
    } 
    echo "$sql2 'outside'<br>"; 
    $sql3 = "$sql $sql2"; 
    $pdo->exec($sql3); 
} 
catch (PDOException $e) 
{ 
    $output = 'Error: ' . $e->getMessage(); 
    exit(); 
} 

如果我輸入1,2,3,4,5,6,7,8,9,10到我10個輸入字段和點擊提交,我得到

(1, 6), 'indside' 
(2, 7), 'indside' 
(3, 8), 'indside' 
(4, 9), 'indside' 
(5, 10) 'indside' 
(5, 10) 'outside' 

,5是插入到列1和10插入到我的數據庫的第2列。

我真正想要的是插入5個單獨的行,所以1,6在第1,2,7行第2行等 但我不能解決如何獲取$ sql2的值,當它在for循環。這可能嗎?或者他們是否可以採取另一種方法來實現這一目標?

回答

2

這看起來像一個簡單的錯誤;

$sql2 = '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')'; 

被複位$ SQL2 - 當它應該被附加到它,即

$sql2 .= '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')'; 

結果是:

INSERT INTO tablename (column1, column2) VALUES (1, 6),(2, 7),(3, 8),(4, 9),(5, 10) 

包括整個固定片段修復SQL注入,如@Thrustmaster所示

try 
{ 
    $count = count($_POST['column1']); 
    $sql = 'INSERT INTO tablename (column1, column2) VALUES '; 
    $sql2 = ''; 
    for ($i=0; $i< $count; $i++) 
    { 
     if ($sql2 != '') $sql2 .= ","; 

     $sql2 = '(' .mysql_real_escape_string($_POST['column1'][$i]) 
        . ', ' . mysql_real_escape_string($_POST['column2'][$i]) . ')'; 
     echo "$sql2 'indside'<br>"; 
    } 
    echo "$sql2 'outside'<br>"; 
    $sql3 = "$sql $sql2"; 
    $pdo->exec($sql3); 
} 
catch (PDOException $e) 
{ 
    $output = 'Error: ' . $e->getMessage(); 
    exit(); 
} 
+0

謝謝。訣竅。我曾經看過它,但沒有看到它的記錄。我在上面對你的代碼進行了一些細微的修改。我把你的陳述改爲我的陳述。將$ sql2 =替換爲$ sql2。=,正如你所建議的那樣,並在它們之間放置一個空格。在.mysql_real_escape_string($ _ POST ['column1'] – ak85 2012-07-09 11:00:29

+0

我的if語句有一個錯誤 - 它應該是如果(sql2!=「」)...無論如何,好消息,做得好。 – 2012-07-09 13:20:20

1

這是因爲在循環的每次迭代中,變量$ sql2都被覆蓋。您需要在前一次迭代之後「追加」該值。

替換:

$sql2 = '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')'; 

有:

$sql2 .= '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')'; 
// ^Append to the string. 

而且不要忘了初始化$sql2='';前的for循環。


現在,您可以開放到SQL Injection attacks。請爲您的mysql查詢使用prepared statements。如果不是,在構建查詢之前至少使用mysql_real_escape_string($_POST['column1'][$i])

+0

謝謝。我之前使用過準備好的語句,但它只是一個單獨的條目,但在這種情況下我無法解決如何在循環中執行此操作。你有什麼想法嗎?還是應該把它作爲一個新問題發佈? – ak85 2012-07-09 11:11:11