我有以下代码。我有一个表单设置,其中设置了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的值。这可能吗?或者他是我可以采取的另一种方法来实现这一目标?
答案 0 :(得分:2)
这看起来像一个简单的bug;
行
$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();
}
答案 1 :(得分:1)
这是因为在循环的每次迭代中,变量$ sql2都会被覆盖。您需要在上一次迭代后“附加”到该值。
替换:
$sql2 = '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')';
使用:
$sql2 .= '(' .$_POST['column1'][$i] . ', ' . $_POST['column2'][$i] . ')';
// ^ Append to the string.
不要忘记在for循环之前初始化$sql2='';
。
现在的样子,你向SQL Injection attacks开放。请使用prepared statements进行mysql查询。如果没有,请在构建查询之前至少使用mysql_real_escape_string($_POST['column1'][$i])
。