我有一个表单会将大量数据发布到此脚本中,该脚本将插入到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中的每个字段。有什么想法吗?
答案 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条目。