2012-07-08 317 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