PDO从foreach语句中插入1而不是值

时间:2014-06-20 18:18:56

标签: php mysql pdo

我有一个表单会将大量数据发布到此脚本中,该脚本将插入到db:

帖子是:

$_POST['fName'] = "bob";
$_POST['lName'] = "Jones";
$_POST['smsNum'] = "12345";
$_POST['pass1'] = "1234567890";
$_POST['company'] = "acme";
$_POST['uName'] = "bjones";
$_POST['perms'] = "user";
$_POST['active'] = "1";

我的插入声明:

$ins = "INSERT into login (firstName,lastName,SMSNumber,password,company,userName,permissions,active) VALUES (:fName,:lName,:smsNum,:pass1,:company,:uName,:perms,:active)";

如果我这样做:

$stmt->bindParam(':fName',$_POST['fName']);
$stmt->bindParam(':lName',$_POST['lName']);
$stmt->bindParam(':smsNum',$_POST['smsNum']);
$stmt->bindParam(':pass1',$_POST['pass1']);
$stmt->bindParam(':company',$_POST['company']);
$stmt->bindParam(':uName',$_POST['uName']);
$stmt->bindParam(':perms',$_POST['perms']);
$stmt->bindParam(':active',$_POST['active']);

它工作正常。

如果我这样做:

foreach($_POST as $k => $v)
{
    $stmt->bindParam(":".$k,$v);
}

结果是数字" 1"插入db中的每个字段。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用bindParam(),您声明PDO应将变量$v用于所有参数。因此,当语句执行时,它将使用foreach循环的最后一次迭代中的值。

您必须执行以下操作之一:

$stmt->bindParam(":".$k,$_POST[$k]);

这将告诉PDO使用$_POST变量中的值。

或者:

$stmt->bindValue(":".$k,$v);

这将在循环的当前迭代中使用$v中的实际值。

答案 1 :(得分:1)

bindParam实际上在您指定的变量与查询中匹配的占位符之间创建了内部链接。既然你在做:

foreach($_POST as $k => $v)

您实际上将占位符绑定到$v变量,查询中的值。

变量的值不是绑定的一部分 - 您只是建立一个链接。只有当您实际执行查询时,才会获取绑定的可变值。

当你的foreach结束时,$v的最终价值将是来自1的{​​{1}}。由于您已将 SAME $_POST['active']绑定到查询中的每个占位符,因此您将在该新记录中的任何位置插入$v

尝试:

1

相反,所以你要绑定到匹配的$ _POST条目。