0

我有下面的代码。我有一个表单设置,其中设置了 10 个输入字段,5 个用于 column1,5 个用于 column2。

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();
}

如果我在 10 个输入字段中输入 1,2,3,4,5,6,7,8,9,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 行中插入 1,6,在第 2 行中插入 2,7 等。但是当它在 for 循环中时,我无法弄清楚如何获取 $sql2 的值。这可能吗?或者他们是我可以采取的另一种方法来实现这一点吗?

4

2 回答 2

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)

整个固定片段,包括@Thrustmaster 指出的修复 SQL 注入

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();
}
于 2012-07-08T10:52:28.640 回答
1

这是因为在循环的每次迭代中,变量 $sql2 都会被覆盖。您需要在上一次迭代之后“附加”到该值。

代替:

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

和:

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

并且不要忘记$sql2='';在 for 循环之前进行初始化。


现在的情况是,您对SQL 注入攻击持开放态度。请为您的 mysql 查询使用准备好的语句。如果没有,至少mysql_real_escape_string($_POST['column1'][$i])在构建查询之前使用。

于 2012-07-08T10:52:15.573 回答